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

📄 ipaddress_common.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
字号:
/* *  Ipaddress MIB architecture support * * $Id: ipaddress_common.c,v 1.7 2004/10/19 03:20:34 rstory Exp $ */#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <net-snmp/data_access/ipaddress.h>#include <net-snmp/data_access/interface.h>#include "ip-mib/ipAddressTable/ipAddressTable_constants.h"/**---------------------------------------------------------------------*//* * local static prototypes */static int _access_ipaddress_entry_compare_addr(const void *lhs,                                                const void *rhs);static void _access_ipaddress_entry_release(netsnmp_ipaddress_entry * entry,                                            void *unused);/**---------------------------------------------------------------------*//* * external per-architecture functions prototypes * * These shouldn't be called by the general public, so they aren't in * the header file. */extern intnetsnmp_arch_ipaddress_container_load(netsnmp_container* container,                                      u_int load_flags);extern intnetsnmp_arch_ipaddress_entry_init(netsnmp_ipaddress_entry *entry);extern intnetsnmp_arch_ipaddress_entry_copy(netsnmp_ipaddress_entry *lhs,                                  netsnmp_ipaddress_entry *rhs);extern voidnetsnmp_arch_ipaddress_entry_cleanup(netsnmp_ipaddress_entry *entry);/**---------------------------------------------------------------------*//* * container functions *//** */netsnmp_container *netsnmp_access_ipaddress_container_init(u_int flags){    netsnmp_container *container1;    DEBUGMSGTL(("access:ipaddress:container", "init\n"));    /*     * create the containers. one indexed by ifIndex, the other     * indexed by ifName.     */    container1 = netsnmp_container_find("access_ipaddress:table_container");    if (NULL == container1) {        snmp_log(LOG_ERR, "ipaddress primary container not found\n");        return NULL;    }    container1->container_name = strdup("ia_index");    if (flags & NETSNMP_ACCESS_IPADDRESS_INIT_ADDL_IDX_BY_ADDR) {        netsnmp_container *container2 =            netsnmp_container_find("ipaddress_addr:access_ipaddress:table_container");        if (NULL == container2) {            snmp_log(LOG_ERR, "ipaddress secondary container not found\n");            CONTAINER_FREE(container1);            return NULL;        }                container2->compare = _access_ipaddress_entry_compare_addr;        container2->container_name = strdup("ia_addr");                netsnmp_container_add_index(container1, container2);    }    return container1;}/** * @retval NULL  error * @retval !NULL pointer to container */netsnmp_container*netsnmp_access_ipaddress_container_load(netsnmp_container* container, u_int load_flags){    int rc;    DEBUGMSGTL(("access:ipaddress:container", "load\n"));    if (NULL == container)        container = netsnmp_access_ipaddress_container_init(load_flags);    if (NULL == container) {        snmp_log(LOG_ERR, "no container specified/found for access_ipaddress\n");        return NULL;    }    rc =  netsnmp_arch_ipaddress_container_load(container, load_flags);    if (0 != rc) {        netsnmp_access_ipaddress_container_free(container,                                                NETSNMP_ACCESS_IPADDRESS_FREE_NOFLAGS);        container = NULL;    }    return container;}voidnetsnmp_access_ipaddress_container_free(netsnmp_container *container, u_int free_flags){    DEBUGMSGTL(("access:ipaddress:container", "free\n"));    if (NULL == container) {        snmp_log(LOG_ERR, "invalid container for netsnmp_access_ipaddress_free\n");        return;    }    if(! (free_flags & NETSNMP_ACCESS_IPADDRESS_FREE_DONT_CLEAR)) {        /*         * free all items.         */        CONTAINER_CLEAR(container,                        (netsnmp_container_obj_func*)_access_ipaddress_entry_release,                        NULL);    }    CONTAINER_FREE(container);}/**---------------------------------------------------------------------*//* * ipaddress_entry functions *//** *//** */netsnmp_ipaddress_entry *netsnmp_access_ipaddress_entry_create(void){    netsnmp_ipaddress_entry *entry =        SNMP_MALLOC_TYPEDEF(netsnmp_ipaddress_entry);    int rc = 0;    entry->oid_index.len = 1;    entry->oid_index.oids = &entry->ns_ia_index;    /*     * set up defaults     */    entry->ia_type = IPADDRESSTYPE_UNICAST;    entry->ia_status = IPADDRESSSTATUSTC_PREFERRED;    entry->ia_storagetype = STORAGETYPE_VOLATILE;    rc = netsnmp_arch_ipaddress_entry_init(entry);    if (SNMP_ERR_NOERROR != rc) {        DEBUGMSGT(("access:ipaddress:create","error %d in arch init\n"));        netsnmp_access_ipaddress_entry_free(entry);    }    return entry;}/** */voidnetsnmp_access_ipaddress_entry_free(netsnmp_ipaddress_entry * entry){    if (NULL == entry)        return;    if (NULL != entry->ia_prefix_oid)        free(entry->ia_prefix_oid);    if (NULL != entry->arch_data)        netsnmp_arch_ipaddress_entry_cleanup(entry);    free(entry);}/** * update underlying data store (kernel) for entry * * @retval  0 : success * @retval -1 : error */intnetsnmp_access_ipaddress_entry_set(netsnmp_ipaddress_entry * entry){    int rc = SNMP_ERR_NOERROR;    if (NULL == entry) {        netsnmp_assert(NULL != entry);        return -1;    }        /*     * make sure interface and ifIndex match up     */    if (NULL == netsnmp_access_interface_name_find(entry->if_index)) {        DEBUGMSGT(("access:ipaddress:set", "cant find name for index %d\n",                  entry->if_index));        return -1;    }    /*     * don't support non-volatile yet     */    if (STORAGETYPE_VOLATILE != entry->ia_storagetype) {        DEBUGMSGT(("access:ipaddress:set",                   "non-volatile storagetypes unsupported\n"));        return -1;    }    /*     *     */    rc = -1;    if (entry->flags & NETSNMP_ACCESS_IPADDRESS_CREATE) {        rc = netsnmp_arch_ipaddress_create(entry);    }    else if (entry->flags & NETSNMP_ACCESS_IPADDRESS_CHANGE) {    }    else if (entry->flags & NETSNMP_ACCESS_IPADDRESS_DELETE) {        rc = netsnmp_arch_ipaddress_delete(entry);    }    else {        snmp_log(LOG_ERR,"netsnmp_access_ipaddress_entry_set with no mode\n");        netsnmp_assert("ipaddress_entry_set" == "unknown mode");         rc = -1;    }        return rc;}/** * update an old ipaddress_entry from a new one * * @note: only mib related items are compared. Internal objects * such as oid_index, ns_ia_index and flags are not compared. * * @retval -1  : error * @retval >=0 : number of fields updated */intnetsnmp_access_ipaddress_entry_update(netsnmp_ipaddress_entry *lhs,                                      netsnmp_ipaddress_entry *rhs){    int rc, changed = 0;    /*     * do any memory allocations first, using temp vars, so a failure can     * return w/out chaning lhs entry. length is dealt with right afterwards.     */    if (lhs->ia_prefix_oid != rhs->ia_prefix_oid) {        oid *tmp_oid;        if (NULL != rhs->ia_prefix_oid) {            int tmp_len = rhs->ia_prefix_oid_len * sizeof(oid);            tmp_oid = malloc(tmp_len);            if (NULL == tmp_oid) {                snmp_log(LOG_ERR, "malloc failed\n");                return -1;            }            memcpy(tmp_oid,rhs->ia_prefix_oid, tmp_len);        }        else            tmp_oid = NULL;        if (NULL != lhs->ia_prefix_oid)            SNMP_FREE(lhs->ia_prefix_oid);        lhs->ia_prefix_oid = tmp_oid;        ++changed;    }    if (lhs->ia_prefix_oid_len != rhs->ia_prefix_oid_len) {        ++changed;        lhs->ia_prefix_oid_len = rhs->ia_prefix_oid_len;    }    /*     * copy arch stuff. we don't care if it changed     */    rc = netsnmp_arch_ipaddress_entry_copy(lhs,rhs);    if (0 != rc) {        snmp_log(LOG_ERR,"arch ipaddress copy failed\n");        return -1;    }    if (lhs->if_index != rhs->if_index) {        ++changed;        lhs->if_index = rhs->if_index;    }    if (lhs->ia_storagetype != rhs->ia_storagetype) {        ++changed;        lhs->ia_storagetype = rhs->ia_storagetype;    }    if (lhs->ia_address_len != rhs->ia_address_len) {        changed += 2;        lhs->ia_address_len = rhs->ia_address_len;        memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len);    }    else if (memcmp(lhs->ia_address, rhs->ia_address, rhs->ia_address_len) != 0) {        ++changed;        memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len);    }    if (lhs->ia_type != rhs->ia_type) {        ++changed;        lhs->ia_type = rhs->ia_type;    }    if (lhs->ia_status != rhs->ia_status) {        ++changed;        lhs->ia_status = rhs->ia_status;    }    if (lhs->ia_origin != rhs->ia_origin) {        ++changed;        lhs->ia_origin = rhs->ia_origin;    }    return changed;}/** * copy an  ipaddress_entry * * @retval -1  : error * @retval 0   : no error */intnetsnmp_access_ipaddress_entry_copy(netsnmp_ipaddress_entry *lhs,                                    netsnmp_ipaddress_entry *rhs){    int rc;    if (NULL != lhs->ia_prefix_oid)        SNMP_FREE(lhs->ia_prefix_oid);    snmp_clone_mem((void **) &lhs->ia_prefix_oid, rhs->ia_prefix_oid,                   rhs->ia_prefix_oid_len * sizeof(oid));    lhs->ia_prefix_oid_len = rhs->ia_prefix_oid_len;    /*     * copy arch stuff. we don't care if it changed     */    rc = netsnmp_arch_ipaddress_entry_copy(lhs,rhs);    if (0 != rc) {        snmp_log(LOG_ERR,"arch ipaddress copy failed\n");        return -1;    }    lhs->if_index = rhs->if_index;    lhs->ia_storagetype = rhs->ia_storagetype;    lhs->ia_address_len = rhs->ia_address_len;    memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len);    lhs->ia_type = rhs->ia_type;    lhs->ia_status = rhs->ia_status;    lhs->ia_origin = rhs->ia_origin;        return 0;}/**---------------------------------------------------------------------*//* * Utility routines *//** */void_access_ipaddress_entry_release(netsnmp_ipaddress_entry * entry, void *context){    netsnmp_access_ipaddress_entry_free(entry);}static int _access_ipaddress_entry_compare_addr(const void *lhs,                                                const void *rhs){    const netsnmp_ipaddress_entry *lh = (const netsnmp_ipaddress_entry *)lhs;    const netsnmp_ipaddress_entry *rh = (const netsnmp_ipaddress_entry *)rhs;    netsnmp_assert(NULL != lhs);    netsnmp_assert(NULL != rhs);    /*     * compare address length     */    if (lh->ia_address_len < rh->ia_address_len)        return -1;    else if (lh->ia_address_len > rh->ia_address_len)        return 1;    /*     * length equal, compare address     */    return memcmp(lh->ia_address, rh->ia_address, lh->ia_address_len);}

⌨️ 快捷键说明

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