⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smux.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
     * build err stat      */    ptr = asn_build_int(ptr, &len,                        (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE |                                  ASN_INTEGER), &errstat, sizeof(errstat));    if (ptr == NULL) {        return -1;    }    /*     * build err index      */    ptr = asn_build_int(ptr, &len,                        (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE |                                  ASN_INTEGER), &errindex,                        sizeof(errindex));    if (ptr == NULL) {        return -1;    }    save2 = ptr;    ptr += 4;    len -= 4;    if (type != SMUX_SET) {        val_type = ASN_NULL;        val_len = 0;    }    /*     * build var list : snmp_build_var_op not liked by gated XXX      */    ptr = snmp_build_var_op(ptr, objid, oidlen, val_type, val_len,                            val, &len);    if (ptr == NULL) {        return -1;    }    len = ptr - save1;    asn_build_sequence(save1, &len, type, (ptr - save1 - 4));    len = ptr - save2;    asn_build_sequence(save2, &len,                       (ASN_SEQUENCE | ASN_CONSTRUCTOR),                       (ptr - save2 - 4));    *length = ptr - packet;    return 0;}static voidsmux_peer_cleanup(int sd){    smux_reg       *nrptr, *rptr, *rptr2;    int             nfound, i;    nfound = 0;    /*     * close the descriptor      */    close(sd);    /*     * delete all of the passive registrations that this peer owns      */    for (rptr = PassiveRegs; rptr; rptr = nrptr) {        nrptr = rptr->sr_next;        if (rptr->sr_fd == sd) {            smux_list_detach(&PassiveRegs, &rptr);            free(rptr);        }        rptr = nrptr;    }    /*     * find replacements for all of the active registrations found      */    for (rptr = ActiveRegs; rptr; rptr = rptr2) {        rptr2 = rptr->sr_next;        if (rptr->sr_fd == sd) {            smux_list_detach(&ActiveRegs, &rptr);            unregister_mib(rptr->sr_name, rptr->sr_name_len);            if ((nrptr = smux_find_replacement(rptr->sr_name,                                               rptr->sr_name_len)) !=                NULL) {                smux_list_detach(&PassiveRegs, &nrptr);                smux_list_add(&ActiveRegs, nrptr);                register_mib("smux", (struct variable *)                             smux_variables, sizeof(struct variable2),                             1, nrptr->sr_name, nrptr->sr_name_len);            }            free(rptr);        }    }    /*     * decrement the peer count      */    npeers--;    /*     * make his auth available again      */    for (i = 0; i < nauths; i++) {        if (Auths[i]->sa_active_fd == sd) {            char            oid_name[128];            Auths[i]->sa_active_fd = -1;            snprint_objid(oid_name, sizeof(oid_name), Auths[i]->sa_oid,                          Auths[i]->sa_oid_len);            snmp_log(LOG_INFO, "peer disconnected: %s\n", oid_name);        }    }}intsmux_send_rrsp(int sd, int pri){    u_char          outdata[2 + sizeof(int)];    u_char         *ptr = outdata;    int             intsize = sizeof(int);    u_int           mask = ((u_int) 0xFF) << (8 * (sizeof(int) - 1));    /*     * e.g. mask is 0xFF000000 on a 32-bit machine      */    int             sent;    /*     * This is kind of like calling asn_build_int(), but the     * encoding will always be the size of an integer on this     * machine, never shorter.     */    *ptr++ = (u_char) SMUX_RRSP;    *ptr++ = (u_char) intsize;    /*     * Copy each byte, most significant first.      */    while (intsize--) {        *ptr++ = (u_char) ((pri & mask) >> (8 * (sizeof(int) - 1)));        pri <<= 8;    }    sent = send(sd, (char *) outdata, sizeof outdata, 0);    if (sent < 0) {        DEBUGMSGTL(("smux", "[smux_send_rrsp] send failed\n"));    }    return (sent);}static u_char  *smux_trap_process(u_char * rsp, size_t * len){    oid             sa_enterpriseoid[MAX_OID_LEN], var_name[MAX_OID_LEN];    size_t          datalen, var_name_len, var_val_len, maxlen;    size_t          sa_enterpriseoid_len;    u_char          vartype, *ptr, *var_val;    long            trap, specific;    u_long          timestamp;    netsnmp_variable_list *snmptrap_head, *snmptrap_ptr, *snmptrap_tmp;    snmptrap_head = NULL;    snmptrap_ptr = NULL;    ptr = rsp;    /*     * parse the sub-agent enterprise oid      */    sa_enterpriseoid_len = MAX_OID_LEN;    if ((ptr = asn_parse_objid(ptr, len,                               &vartype, (oid *) & sa_enterpriseoid,                               &sa_enterpriseoid_len)) == NULL) {        DEBUGMSGTL(("smux",                    "[smux_trap_process] asn_parse_objid failed\n"));        return NULL;    }    /*     * parse the agent-addr ipAddress      */    datalen = SMUXMAXSTRLEN;    if (((ptr = asn_parse_string(ptr, len,                                 &vartype, smux_str,                                 &datalen)) == NULL) ||        (vartype != (u_char) ASN_IPADDRESS)) {        DEBUGMSGTL(("smux",                    "[smux_trap_process] asn_parse_string failed\n"));        return NULL;    }    /*     * parse the generic trap int      */    datalen = sizeof(long);    if ((ptr = asn_parse_int(ptr, len, &vartype, &trap, datalen)) == NULL) {        DEBUGMSGTL(("smux",                    "[smux_trap_process] asn_parse_int generic failed\n"));        return NULL;    }    /*     * parse the specific trap int      */    datalen = sizeof(long);    if ((ptr = asn_parse_int(ptr, len,                             &vartype, &specific, datalen)) == NULL) {        DEBUGMSGTL(("smux",                    "[smux_trap_process] asn_parse_int specific failed\n"));        return NULL;    }    /*     * parse the timeticks timestamp      */    datalen = sizeof(u_long);    if (((ptr = asn_parse_unsigned_int(ptr, len,                                       &vartype, (u_long *) & timestamp,                                       datalen)) == NULL) ||        (vartype != (u_char) ASN_TIMETICKS)) {        DEBUGMSGTL(("smux",                    "[smux_trap_process] asn_parse_unsigned_int (timestamp) failed\n"));        return NULL;    }    /*     * parse out the overall sequence      */    ptr = asn_parse_header(ptr, len, &vartype);    if (ptr == NULL || vartype != (ASN_SEQUENCE | ASN_CONSTRUCTOR)) {        return NULL;    }    /*     * parse the variable bindings      */    while (ptr && *len) {        /*         * get the objid and the asn1 coded value          */        var_name_len = MAX_OID_LEN;        ptr = snmp_parse_var_op(ptr, var_name, &var_name_len, &vartype,                                &var_val_len, (u_char **) & var_val, len);        if (ptr == NULL) {            return NULL;        }        maxlen = SMUXMAXPKTSIZE;        switch ((short) vartype) {        case ASN_INTEGER:            var_val_len = sizeof(long);            asn_parse_int(var_val, &maxlen, &vartype,                          (long *) &smux_long, var_val_len);            var_val = (u_char *) & smux_long;            break;        case ASN_COUNTER:        case ASN_GAUGE:        case ASN_TIMETICKS:        case ASN_UINTEGER:            var_val_len = sizeof(u_long);            asn_parse_unsigned_int(var_val, &maxlen, &vartype,                                   (u_long *) & smux_ulong, var_val_len);            var_val = (u_char *) & smux_ulong;            break;        case ASN_COUNTER64:            var_val_len = sizeof(smux_counter64);            asn_parse_unsigned_int64(var_val, &maxlen, &vartype,                                     (struct counter64 *) &smux_counter64,                                     var_val_len);            var_val = (u_char *) & smux_counter64;            break;        case ASN_IPADDRESS:            var_val_len = 4;            /*             * consume the tag and length, but just copy here             * because we know it is an ip address             */            if ((var_val =                 asn_parse_header(var_val, &maxlen, &vartype)) == NULL)                return NULL;            memcpy((u_char *) & (smux_sa.sin_addr.s_addr), var_val,                   var_val_len);            var_val = (u_char *) & (smux_sa.sin_addr.s_addr);            break;        case ASN_OPAQUE:        case ASN_OCTET_STR:            /*             * XXX              */            if (len == 0)                return NULL;            var_val_len = SMUXMAXSTRLEN;            asn_parse_string(var_val, &maxlen, &vartype,                             smux_str, &var_val_len);            var_val = smux_str;            break;        case ASN_OBJECT_ID:            var_val_len = MAX_OID_LEN;            asn_parse_objid(var_val, &maxlen, &vartype,                            smux_objid, &var_val_len);            var_val_len *= sizeof(oid);            var_val = (u_char *) smux_objid;            break;        case SNMP_NOSUCHOBJECT:        case SNMP_NOSUCHINSTANCE:        case SNMP_ENDOFMIBVIEW:        case ASN_NULL:            var_val = NULL;            break;        case ASN_BIT_STR:            /*             * XXX              */            if (len == 0)                return NULL;            var_val_len = SMUXMAXSTRLEN;            asn_parse_bitstring(var_val, &maxlen, &vartype,                                smux_str, &var_val_len);            var_val = (u_char *) smux_str;            break;        case ASN_NSAP:        default:            snmp_log(LOG_ERR, "bad type returned (%x)\n", vartype);            var_val = NULL;            break;        }        snmptrap_tmp =            (netsnmp_variable_list *)            malloc(sizeof(netsnmp_variable_list));        if (snmptrap_tmp == NULL)            return NULL;        memset(snmptrap_tmp, 0, sizeof(netsnmp_variable_list));        if (snmptrap_head == NULL) {            snmptrap_head = snmptrap_tmp;            snmptrap_ptr = snmptrap_head;        } else {            snmptrap_ptr->next_variable = snmptrap_tmp;            snmptrap_ptr = snmptrap_ptr->next_variable;        }        snmptrap_ptr->type = vartype;        snmptrap_ptr->next_variable = NULL;        snmp_set_var_objid(snmptrap_ptr, var_name, var_name_len);        snmp_set_var_value(snmptrap_ptr, (char *) var_val, var_val_len);    }    /*     * send the traps      */    send_enterprise_trap_vars(trap, specific, (oid *) & sa_enterpriseoid,                              sa_enterpriseoid_len, snmptrap_head);    /*     * free trap variables      */    snmp_free_varbind(snmptrap_head);    return ptr;}#define NUM_SOCKETS	32static int      sdlist[NUM_SOCKETS], sdlen = 0;int smux_snmp_select_list_add(int sd){   if (sdlen < NUM_SOCKETS)   {      sdlist[sdlen++] = sd;      return(1);   }   return(0);}int smux_snmp_select_list_del(int sd){   int i, found=0;   for (i = 0; i < (sdlen); i++) {      if (sdlist[i] == sd)      {         sdlist[i] = 0;         found = 1;      }      if ((found) &&(i < (sdlen - 1)))         sdlist[i] = sdlist[i + 1];   }   if (found)   {      sdlen--;      return(1);   }   return(0);}int smux_snmp_select_list_get_length(){   return(sdlen);}int smux_snmp_select_list_get_SD_from_List(int pos){   if (pos < NUM_SOCKETS)   {      return(sdlist[pos]);   }   return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -