📄 callback.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 + -