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

📄 smux.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 4 页
字号:
     */    len = SMUXMAXPKTSIZE;    DEBUGMSGTL(("smux",                "[smux_parse_var] Asn coded len of var %d, type %d\n",                var_val_len, (int) *vartype));    switch ((short) *vartype) {    case ASN_INTEGER:        *varlength = sizeof(long);        asn_parse_int(var_val, &len, vartype,                      (long *) &smux_long, *varlength);        return (u_char *) & smux_long;        break;    case ASN_COUNTER:    case ASN_GAUGE:    case ASN_TIMETICKS:    case ASN_UINTEGER:        *varlength = sizeof(u_long);        asn_parse_unsigned_int(var_val, &len, vartype,                               (u_long *) & smux_ulong, *varlength);        return (u_char *) & smux_ulong;        break;    case ASN_COUNTER64:        *varlength = sizeof(smux_counter64);        asn_parse_unsigned_int64(var_val, &len, vartype,                                 (struct counter64 *) &smux_counter64,                                 *varlength);        return (u_char *) & smux_counter64;        break;    case ASN_IPADDRESS:        *varlength = 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, &len, &type)) == NULL)            return NULL;        memcpy((u_char *) & (smux_sa.sin_addr.s_addr), var_val,               *varlength);        return (u_char *) & (smux_sa.sin_addr.s_addr);        break;    case ASN_OCTET_STR:        /*         * XXX          */        if (len == 0)            return NULL;        str_len = SMUXMAXSTRLEN;        asn_parse_string(var_val, &len, vartype, smux_str, &str_len);        *varlength = str_len;        return smux_str;        break;    case ASN_OPAQUE:    case ASN_NSAP:    case ASN_OBJECT_ID:        objid_len = MAX_OID_LEN;        asn_parse_objid(var_val, &len, vartype, smux_objid, &objid_len);        *varlength = objid_len * sizeof(oid);        return (u_char *) smux_objid;        break;    case SNMP_NOSUCHOBJECT:    case SNMP_NOSUCHINSTANCE:    case SNMP_ENDOFMIBVIEW:    case ASN_NULL:        return NULL;        break;    case ASN_BIT_STR:        /*         * XXX          */        if (len == 0)            return NULL;        str_len = SMUXMAXSTRLEN;        asn_parse_bitstring(var_val, &len, vartype, smux_str, &str_len);        *varlength = str_len;        return (u_char *) smux_str;        break;    default:        snmp_log(LOG_ERR, "bad type returned (%x)\n", *vartype);        return NULL;        break;    }}/* * XXX This is a bad hack - do not want to muck with ucd code  */static intsmux_build(u_char type,           u_long reqid,           oid * objid,           size_t * oidlen,           u_char val_type,           u_char * val, size_t val_len, u_char * packet, size_t * length){    u_char         *ptr, *save1, *save2;    size_t          len;    long            errstat = 0;    long            errindex = 0;    /*     * leave space for Seq and length      */    save1 = packet;    ptr = packet + 4;    len = *length - 4;    /*     * build reqid      */    ptr = asn_build_unsigned_int(ptr, &len,                                 (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE |                                           ASN_INTEGER), &reqid,                                 sizeof(reqid));    if (ptr == NULL) {        return -1;    }    /*     * 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;        }        snmp_set_var_objid(snmptrap_ptr, var_name, var_name_len);        snmp_set_var_value(snmptrap_ptr, (char *) var_val, var_val_len);        snmptrap_ptr->type = vartype;        snmptrap_ptr->next_variable = NULL;    }    /*     * 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;}

⌨️ 快捷键说明

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