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

📄 snmp_transport.c

📁 snmp up 2
💻 C
字号:
#include <net-snmp/net-snmp-config.h>#include <stdio.h>#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#include <sys/types.h>#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_DMALLOC_H#include <dmalloc.h>#endif#include <net-snmp/output_api.h>#include <net-snmp/utilities.h>#include <net-snmp/library/snmp_transport.h>#include <net-snmp/library/snmpUDPDomain.h>#ifdef SNMP_TRANSPORT_TCP_DOMAIN#include <net-snmp/library/snmpTCPDomain.h>#endif#ifdef SNMP_TRANSPORT_IPX_DOMAIN#include <net-snmp/library/snmpIPXDomain.h>#endif#ifdef SNMP_TRANSPORT_UNIX_DOMAIN#include <net-snmp/library/snmpUnixDomain.h>#endif#ifdef SNMP_TRANSPORT_AAL5PVC_DOMAIN#include <net-snmp/library/snmpAAL5PVCDomain.h>#endif#ifdef SNMP_TRANSPORT_UDPIPV6_DOMAIN#include <net-snmp/library/snmpUDPIPv6Domain.h>#endif#ifdef SNMP_TRANSPORT_TCPIPV6_DOMAIN#include <net-snmp/library/snmpTCPIPv6Domain.h>#endif#include <net-snmp/library/snmp_api.h>/* * Our list of supported transport domains.   */static netsnmp_tdomain *domain_list = NULL;/* * The standard SNMP domains.   */oid             netsnmpUDPDomain[] = { 1, 3, 6, 1, 6, 1, 1 };size_t          netsnmpUDPDomain_len = OID_LENGTH(netsnmpUDPDomain);oid             netsnmpCLNSDomain[] = { 1, 3, 6, 1, 6, 1, 2 };size_t          netsnmpCLNSDomain_len = OID_LENGTH(netsnmpCLNSDomain);oid             netsnmpCONSDomain[] = { 1, 3, 6, 1, 6, 1, 3 };size_t          netsnmpCONSDomain_len = OID_LENGTH(netsnmpCONSDomain);oid             netsnmpDDPDomain[] = { 1, 3, 6, 1, 6, 1, 4 };size_t          netsnmpDDPDomain_len = OID_LENGTH(netsnmpDDPDomain);oid             netsnmpIPXDomain[] = { 1, 3, 6, 1, 6, 1, 5 };size_t          netsnmpIPXDomain_len = OID_LENGTH(netsnmpIPXDomain);static void     netsnmp_tdomain_dump(void);/* * Make a deep copy of an netsnmp_transport.   */netsnmp_transport *netsnmp_transport_copy(netsnmp_transport *t){    netsnmp_transport *n = NULL;    n = (netsnmp_transport *) malloc(sizeof(netsnmp_transport));    if (n == NULL) {        return NULL;    }    memset(n, 0, sizeof(netsnmp_transport));    if (t->domain != NULL) {        n->domain = t->domain;        n->domain_length = t->domain_length;    } else {        n->domain = NULL;        n->domain_length = 0;    }    if (t->local != NULL) {        n->local = (u_char *) malloc(t->local_length);        if (n->local == NULL) {            netsnmp_transport_free(n);            return NULL;        }        n->local_length = t->local_length;        memcpy(n->local, t->local, t->local_length);    } else {        n->local = NULL;        n->local_length = 0;    }    if (t->remote != NULL) {        n->remote = (u_char *) malloc(t->remote_length);        if (n->remote == NULL) {            netsnmp_transport_free(n);            return NULL;        }        n->remote_length = t->remote_length;        memcpy(n->remote, t->remote, t->remote_length);    } else {        n->remote = NULL;        n->remote_length = 0;    }    if (t->data != NULL && t->data_length > 0) {        n->data = malloc(t->data_length);        if (n->data == NULL) {            netsnmp_transport_free(n);            return NULL;        }        n->data_length = t->data_length;        memcpy(n->data, t->data, t->data_length);    } else {        n->data = NULL;        n->data_length = 0;    }    n->msgMaxSize = t->msgMaxSize;    n->f_accept = t->f_accept;    n->f_recv = t->f_recv;    n->f_send = t->f_send;    n->f_close = t->f_close;    n->f_fmtaddr = t->f_fmtaddr;    n->sock = t->sock;    n->flags = t->flags;    return n;}voidnetsnmp_transport_free(netsnmp_transport *t){    if (t->local != NULL) {        free(t->local);    }    if (t->remote != NULL) {        free(t->remote);    }    if (t->data != NULL) {        free(t->data);    }    free(t);}intnetsnmp_tdomain_support(const oid * in_oid,                        size_t in_len,                        const oid ** out_oid, size_t * out_len){    netsnmp_tdomain *d = NULL;    for (d = domain_list; d != NULL; d = d->next) {        if (netsnmp_oid_equals(in_oid, in_len, d->name, d->name_length) == 0) {            if (out_oid != NULL && out_len != NULL) {                *out_oid = d->name;                *out_len = d->name_length;            }            return 1;        }    }    return 0;}voidnetsnmp_tdomain_init(void){    DEBUGMSGTL(("tdomain", "netsnmp_tdomain_init() called\n"));    netsnmp_udp_ctor();#ifdef SNMP_TRANSPORT_TCP_DOMAIN    netsnmp_tcp_ctor();#endif#ifdef SNMP_TRANSPORT_IPX_DOMAIN    netsnmp_ipx_ctor();#endif#ifdef SNMP_TRANSPORT_UNIX_DOMAIN    netsnmp_unix_ctor();#endif#ifdef SNMP_TRANSPORT_AAL5PVC_DOMAIN    netsnmp_aal5pvc_ctor();#endif#ifdef SNMP_TRANSPORT_UDPIPV6_DOMAIN    netsnmp_udp6_ctor();#endif#ifdef SNMP_TRANSPORT_TCPIPV6_DOMAIN    netsnmp_tcp6_ctor();#endif    netsnmp_tdomain_dump();}static voidnetsnmp_tdomain_dump(void){    netsnmp_tdomain *d;    int i = 0;    DEBUGMSGTL(("tdomain", "domain_list -> "));    for (d = domain_list; d != NULL; d = d->next) {        DEBUGMSG(("tdomain", "{ "));        DEBUGMSGOID(("tdomain", d->name, d->name_length));        DEBUGMSG(("tdomain", ", \""));        for (i = 0; d->prefix[i] != NULL; i++) {            DEBUGMSG(("tdomain", "%s%s", d->prefix[i],		      (d->prefix[i + 1]) ? "/" : ""));        }        DEBUGMSG(("tdomain", "\" } -> "));    }    DEBUGMSG(("tdomain", "[NIL]\n"));}intnetsnmp_tdomain_register(netsnmp_tdomain *n){    netsnmp_tdomain **prevNext = &domain_list, *d;    if (n != NULL) {        for (d = domain_list; d != NULL; d = d->next) {            if (netsnmp_oid_equals(n->name, n->name_length,                                d->name, d->name_length) == 0) {                /*                 * Already registered.                   */                return 0;            }            prevNext = &(d->next);        }        n->next = NULL;        *prevNext = n;        return 1;    } else {        return 0;    }}intnetsnmp_tdomain_unregister(netsnmp_tdomain *n){    netsnmp_tdomain **prevNext = &domain_list, *d;    if (n != NULL) {        for (d = domain_list; d != NULL; d = d->next) {            if (netsnmp_oid_equals(n->name, n->name_length,                                d->name, d->name_length) == 0) {                *prevNext = n->next;                return 1;            }            prevNext = &(d->next);        }        return 0;    } else {        return 0;    }}netsnmp_transport *netsnmp_tdomain_transport(const char *string, int local,                          const char *default_domain){    netsnmp_tdomain *d;    netsnmp_transport *t = NULL;    const char     *spec, *addr;    char           *cp, *mystring;    int             i;    if (string == NULL) {        return NULL;    }    if ((mystring = strdup(string)) == NULL) {        DEBUGMSGTL(("tdomain", "can't strdup(\"%s\")\n", string));        return NULL;    }    if ((cp = strchr(mystring, ':')) == NULL) {        /*         * There doesn't appear to be a transport specifier.           */        DEBUGMSGTL(("tdomain", "no specifier in \"%s\"\n", mystring));        if (*mystring == '/') {            spec = "unix";            addr = mystring;        } else {            if (default_domain) {                spec = default_domain;            } else {                spec = "udp";            }            addr = mystring;        }    } else {        *cp = '\0';        spec = mystring;        addr = cp + 1;    }    DEBUGMSGTL(("tdomain", "specifier \"%s\" address \"%s\"\n", spec,                addr));    for (d = domain_list; d != NULL; d = d->next) {        for (i = 0; d->prefix[i] != NULL; i++) {            if (strcasecmp(d->prefix[i], spec) == 0) {                DEBUGMSGTL(("tdomain", "specifier \"%s\" matched\n",                            spec));                t = d->f_create_from_tstring(addr, local);                free(mystring);                return t;            }        }    }    /*     * Okay no match so far.  Consider the possibility that we have something     * like hostname.domain.com:port which will have confused the parser above.     * Try and match again with the appropriate default domain.       */    if (default_domain) {        spec = default_domain;    } else {        spec = "udp";    }    if (cp) {        *cp = ':';    }    addr = mystring;    DEBUGMSGTL(("tdomain",                "try again with specifier \"%s\" address \"%s\"\n", spec,                addr));    for (d = domain_list; d != NULL; d = d->next) {        for (i = 0; d->prefix[i] != NULL; i++) {            if (strcmp(d->prefix[i], spec) == 0) {                DEBUGMSGTL(("tdomain", "specifier \"%s\" matched\n",                            spec));                t = d->f_create_from_tstring(addr, local);                free(mystring);                return t;            }        }    }    snmp_log(LOG_ERR, "No support for requested transport domain \"%s\"\n",             spec);    free(mystring);    return NULL;}netsnmp_transport *netsnmp_tdomain_transport_oid(const oid * dom,                              size_t dom_len,                              const u_char * o, size_t o_len, int local){    netsnmp_tdomain *d;    int             i;    DEBUGMSGTL(("tdomain", "domain \""));    DEBUGMSGOID(("tdomain", dom, dom_len));    DEBUGMSG(("tdomain", "\"\n"));    for (d = domain_list; d != NULL; d = d->next) {        for (i = 0; d->prefix[i] != NULL; i++) {            if (netsnmp_oid_equals(dom, dom_len, d->name, d->name_length) ==                0) {                return d->f_create_from_ostring(o, o_len, local);            }        }    }    snmp_log(LOG_ERR, "No support for requested transport domain\n");    return NULL;}/** adds a transport to a linked list of transports.    Returns 1 on failure, 0 on success */intnetsnmp_transport_add_to_list(netsnmp_transport_list **transport_list,                              netsnmp_transport *transport){    netsnmp_transport_list *newptr =        SNMP_MALLOC_TYPEDEF(netsnmp_transport_list);    if (!newptr)        return 1;    newptr->next = *transport_list;    newptr->transport = transport;    *transport_list = newptr;    return 0;}/**  removes a transport from a linked list of transports.     Returns 1 on failure, 0 on success */intnetsnmp_transport_remove_from_list(netsnmp_transport_list **transport_list,                                   netsnmp_transport *transport){    netsnmp_transport_list *ptr = *transport_list, *lastptr = NULL;    while (ptr && ptr->transport != transport) {        lastptr = ptr;        ptr = ptr->next;    }    if (!ptr)        return 1;    if (lastptr)        lastptr->next = ptr->next;    else        *transport_list = ptr->next;    free(ptr);    return 0;}

⌨️ 快捷键说明

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