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

📄 container.c

📁 snmp up 2
💻 C
字号:
#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/library/container.h>#include <net-snmp/library/container_binary_array.h>/*------------------------------------------------------------------ */static netsnmp_container *containers = NULL;typedef struct container_type_s {   const char                 *name;   netsnmp_factory            *factory;} container_type;/*------------------------------------------------------------------ */voidnetsnmp_container_init_list(void){    container_type *ct;        if (NULL != containers)        return;    containers = netsnmp_container_get_binary_array();    containers->compare = netsnmp_compare_cstring;    /*     */    ct = SNMP_MALLOC_TYPEDEF(container_type);    if (NULL == ct)        return;    ct->name = "binary_array";    ct->factory = netsnmp_container_get_binary_array_factory();    CONTAINER_INSERT(containers, ct);    netsnmp_container_register("table_container", ct->factory);}intnetsnmp_container_register(const char* name, netsnmp_factory *f){    container_type *ct, tmp;    tmp.name = name;    ct = CONTAINER_FIND(containers, &tmp);    if (NULL!=ct) {        DEBUGMSGT(("container_registry",                   "replacing previous container factory\n"));        ct->factory = f;    }    else {        ct = SNMP_MALLOC_TYPEDEF(container_type);        if (NULL == ct)            return -1;        ct->name = strdup(name);        ct->factory = f;        CONTAINER_INSERT(containers, ct);    }    DEBUGMSGT(("container_registry", "registered container factory %s (%s)\n",               ct->name, f->product));    return 0;}/*------------------------------------------------------------------ */netsnmp_factory *netsnmp_container_get_factory(const char *type){    container_type ct, *found;        ct.name = type;    found = CONTAINER_FIND(containers, &ct);    return found ? found->factory : NULL;}netsnmp_factory *netsnmp_container_find_factory(const char *type_list){    netsnmp_factory   *f = NULL;    char              *list, *entry;    if (NULL==type_list)        return NULL;    list = strdup(type_list);    entry = strtok(list, ":");    while(entry) {        f = netsnmp_container_get_factory(entry);        if (NULL != f)            break;        entry = strtok(NULL, ":");    }    free(list);    return f;}/*------------------------------------------------------------------ */netsnmp_container *netsnmp_container_get(const char *type){    netsnmp_factory *f = netsnmp_container_get_factory(type);    if (f)        return f->produce();    return NULL;}intnetsnmp_container_get_noalloc(const char *type, netsnmp_container *mem){    netsnmp_factory *f = netsnmp_container_get_factory(type);    if (f)        return f->produce_noalloc(mem);    return FACTORY_NOTFOUND;}/*------------------------------------------------------------------ */netsnmp_container *netsnmp_container_find(const char *type){    netsnmp_factory *f = netsnmp_container_find_factory(type);    if (f)        return f->produce();    return NULL;}intnetsnmp_container_find_noalloc(const char *type, netsnmp_container *mem){    netsnmp_factory *f = netsnmp_container_find_factory(type);    if (f)        return f->produce_noalloc(mem);    return FACTORY_NOTFOUND;}/*------------------------------------------------------------------ */voidnetsnmp_container_add_index(netsnmp_container *primary,                            netsnmp_container *new_index){    while(primary->next)        primary = primary->next;    primary->next = new_index;}#ifdef DONT_INLINE_CONTAINER_MACROS /* default is to inline *//*------------------------------------------------------------------ * These functions should EXACTLY match the inline version in * container.h. If you chance one, change them both. */int CONTAINER_INSERT(netsnmp_container *x, const void *k){    int rc;    rc = x->insert(x,k);    if (NULL != x->next) {        netsnmp_container *tmp = x->next;        int                rc2;        while(tmp) {            rc2 = tmp->insert(tmp,k);            if (rc)                snmp_log(LOG_ERR,"error on subcontainer remove (%d)", rc2);            tmp = tmp->next;        }    }    return rc;}/*------------------------------------------------------------------ * These functions should EXACTLY match the inline version in * container.h. If you chance one, change them both. */int CONTAINER_REMOVE(netsnmp_container *x, const void *k){    if (NULL != x->next) {        netsnmp_container *tmp = x->next;        int                rc;        while(tmp->next)            tmp = tmp->next;        while(tmp) {            rc = tmp->remove(tmp,k);            if (rc)                snmp_log(LOG_ERR,"error on subcontainer remove (%d)", rc);            tmp = tmp->prev;        }    }    return x->remove(x,k);}/*------------------------------------------------------------------ * These functions should EXACTLY match the inline version in * container.h. If you chance one, change them both. */int CONTAINER_FREE(netsnmp_container *x){    if (NULL != x->next) {        netsnmp_container *tmp = x->next;        int                rc;        while(tmp->next)            tmp = tmp->next;        while(tmp) {            rc = tmp->cfree(tmp);            if (rc)                snmp_log(LOG_ERR,"error on subcontainer free (%d)", rc);            tmp = tmp->prev;        }    }    return x->cfree(x);}#endif/*------------------------------------------------------------------ */voidnetsnmp_init_container(netsnmp_container         *c,                       netsnmp_container_rc      *init,                       netsnmp_container_rc      *cfree,                       netsnmp_container_size    *size,                       netsnmp_container_compare *cmp,                       netsnmp_container_op      *ins,                       netsnmp_container_op      *rem,                       netsnmp_container_rtn     *fnd){    if (c == NULL)        return;    c->init = init;    c->cfree = cfree;    c->get_size = size;    c->compare = cmp;    c->insert = ins;    c->remove = rem;    c->find = fnd;}/*------------------------------------------------------------------ * * simple comparison routines * */intnetsnmp_compare_netsnmp_index(const void *lhs, const void *rhs){    int rc;#ifndef NDEBUG    DEBUGIF("compare:index") {        DEBUGMSGT(("compare:index", "compare "));        DEBUGMSGOID(("compare:index", ((const netsnmp_index *) lhs)->oids,                     ((const netsnmp_index *) lhs)->len));        DEBUGMSG(("compare:index", " to "));        DEBUGMSGOID(("compare:index", ((const netsnmp_index *) rhs)->oids,                     ((const netsnmp_index *) rhs)->len));        DEBUGMSG(("compare:index", "\n"));    }#endif    rc = snmp_oid_compare(((const netsnmp_index *) lhs)->oids,                          ((const netsnmp_index *) lhs)->len,                          ((const netsnmp_index *) rhs)->oids,                          ((const netsnmp_index *) rhs)->len);    return rc;}intnetsnmp_ncompare_netsnmp_index(const void *lhs, const void *rhs){    int rc;#ifndef NDEBUG    DEBUGIF("compare:index") {        DEBUGMSGT(("compare:index", "compare "));        DEBUGMSGOID(("compare:index", ((const netsnmp_index *) lhs)->oids,                     ((const netsnmp_index *) lhs)->len));        DEBUGMSG(("compare:index", " to "));        DEBUGMSGOID(("compare:index", ((const netsnmp_index *) rhs)->oids,                     ((const netsnmp_index *) rhs)->len));        DEBUGMSG(("compare:index", "\n"));    }#endif    rc = snmp_oid_ncompare(((const netsnmp_index *) lhs)->oids,                           ((const netsnmp_index *) lhs)->len,                           ((const netsnmp_index *) rhs)->oids,                           ((const netsnmp_index *) rhs)->len,                           ((const netsnmp_index *) rhs)->len);    return rc;}intnetsnmp_compare_cstring(const void * lhs, const void * rhs){    return strcmp(((const container_type*)lhs)->name,                  ((const container_type*)rhs)->name);}intnetsnmp_ncompare_cstring(const void * lhs, const void * rhs){    return strncmp(((const container_type*)lhs)->name,                   ((const container_type*)rhs)->name,                   strlen(((const container_type*)rhs)->name));}

⌨️ 快捷键说明

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