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

📄 callback.c

📁 snmp up 2
💻 C
字号:
/* * callback.c: A generic callback mechanism  */#include <net-snmp/net-snmp-config.h>#include <sys/types.h>#include <stdio.h>#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_WINSOCK_H#include <winsock.h>#endif#if HAVE_NETINET_IN_H#include <netinet/in.h>#endif#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#if HAVE_DMALLOC_H#include <dmalloc.h>#endif#include <net-snmp/types.h>#include <net-snmp/output_api.h>#include <net-snmp/utilities.h>#include <net-snmp/library/callback.h>#include <net-snmp/library/snmp_api.h>static struct snmp_gen_callback               *thecallbacks[MAX_CALLBACK_IDS][MAX_CALLBACK_SUBIDS];/* * the chicken. or the egg.  You pick.  */voidinit_callbacks(void){    /*     * probably not needed? Should be full of 0's anyway?      */    /*     * (poses a problem if you put init_callbacks() inside of     * init_snmp() and then want the app to register a callback before     * init_snmp() is called in the first place.  -- Wes      */    /*     * memset(thecallbacks, 0, sizeof(thecallbacks));      */    DEBUGMSGTL(("callback", "initialized\n"));}intsnmp_register_callback(int major, int minor, SNMPCallback * new_callback,                       void *arg){    struct snmp_gen_callback *newscp = NULL, *scp = NULL;    struct snmp_gen_callback **prevNext = &(thecallbacks[major][minor]);    if (major >= MAX_CALLBACK_IDS || minor >= MAX_CALLBACK_SUBIDS) {        return SNMPERR_GENERR;    }    if ((newscp = SNMP_MALLOC_STRUCT(snmp_gen_callback)) == NULL) {        return SNMPERR_GENERR;    } else {        newscp->sc_client_arg = arg;        newscp->sc_callback = new_callback;        newscp->next = NULL;        for (scp = thecallbacks[major][minor]; scp != NULL;             scp = scp->next) {            prevNext = &(scp->next);        }        *prevNext = newscp;        DEBUGMSGTL(("callback", "registered (%d,%d) at %p\n", major, minor,                    newscp));        return SNMPERR_SUCCESS;    }}intsnmp_call_callbacks(int major, int minor, void *caller_arg){    struct snmp_gen_callback *scp;    unsigned int    count = 0;    if (major >= MAX_CALLBACK_IDS || minor >= MAX_CALLBACK_SUBIDS) {        return SNMPERR_GENERR;    }    DEBUGMSGTL(("callback", "START calling callbacks for maj=%d min=%d\n",                major, minor));    /*     * for each registered callback of type major and minor      */    for (scp = thecallbacks[major][minor]; scp != NULL; scp = scp->next) {        DEBUGMSGTL(("callback", "calling a callback for maj=%d min=%d\n",                    major, minor));        /*         * call them          */        (*(scp->sc_callback)) (major, minor, caller_arg,                               scp->sc_client_arg);        count++;    }    DEBUGMSGTL(("callback",                "END calling callbacks for maj=%d min=%d (%d called)\n",                major, minor, count));    return SNMPERR_SUCCESS;}intsnmp_count_callbacks(int major, int minor){    int             count = 0;    struct snmp_gen_callback *scp;    if (major >= MAX_CALLBACK_IDS || minor >= MAX_CALLBACK_SUBIDS) {        return SNMPERR_GENERR;    }    for (scp = thecallbacks[major][minor]; scp != NULL; scp = scp->next) {        count++;    }    return count;}intsnmp_callback_available(int major, int minor){    if (major >= MAX_CALLBACK_IDS || minor >= MAX_CALLBACK_SUBIDS) {        return SNMPERR_GENERR;    }    if (thecallbacks[major][minor] != NULL) {        return SNMPERR_SUCCESS;    }    return SNMPERR_GENERR;}intsnmp_unregister_callback(int major, int minor, SNMPCallback * target,                         void *arg, int matchargs){    struct snmp_gen_callback *scp = thecallbacks[major][minor];    struct snmp_gen_callback **prevNext = &(thecallbacks[major][minor]);    int             count = 0;    while (scp != NULL) {        if ((scp->sc_callback == target) &&            (!matchargs || (scp->sc_client_arg == arg))) {            DEBUGMSGTL(("callback", "unregistering (%d,%d) at %p\n", major,                        minor, scp));            *prevNext = scp->next;            SNMP_FREE(scp);            scp = *prevNext;            count++;        } else {            prevNext = &(scp->next);            scp = scp->next;        }    }    return count;}struct snmp_gen_callback *snmp_callback_list(int major, int minor){    return (thecallbacks[major][minor]);}

⌨️ 快捷键说明

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