📄 snap_svc_handler.c
字号:
/* snap service handler main source file (c) 2003 Willem de Bruijn some code has been copied from the base SNAP package by Jon Moore all code falls under the BSD License*/#ifdef CONFIG_IP_SNAP_SVCS#include <stdlib.h>#include <snap_svc.h>#include "d_printf.h"#include "snap_svc_conversion.h"#include "snap_svc_reg_table.h"#include "snap_svc_reg_handler.h"#include "snap_svc_handler.h"int snap_svc_initialized = 0;/* call a service additionally, stack values are converted to function arguments and return values are converted to stack values and placed on the stack*/int snap_svc_call_service(packet_t *p, char *name) { struct snap_svc_rec *sr = NULL; void** args = NULL; void* returnptr = NULL; int i = 0; if (!snap_svc_initialized || !p || !name){ d_printf(50,"snap_svc : tried to call a service incorrectly, skipping\n"); d_printf(100,"debugging code: init=%d packet=%u name=%s\n", snap_svc_initialized, p, name); } d_printf(100,"%s:%d: looking up service \"%s\"\n",__FILE__,__LINE__,name); sr = snap_svc_table_find(name); if (sr == NULL) { d_printf(50,"%s:%d: service not found\n",__FILE__,__LINE__); return -1; } d_printf(50,"%s:%d: svc takes %d args and returns %d values\n",__FILE__,__LINE__,sr->nargs,sr->nret); /* convert the arguments */ if (sr->nargs){ args = (void**) snap_svc_convert_stack2arguments(p, sr->nargs); if (!args) return -1; } /* now call the service */ d_printf(100,"%s:%d: about to call service...\n",__FILE__,__LINE__); switch (sr->nargs){ case 0 : returnptr = ((snapsvc_func_proto) (sr->snapsvc_func))(NULL); break; /* send a dummy variable, since every variable must take at least one parameter */ case 1 : returnptr = ((snapsvc_func_proto) (sr->snapsvc_func))(args[0]); break; case 2 : returnptr = ((snapsvc_func_proto) (sr->snapsvc_func))(args[0], args[1]); break; case 3 : returnptr = ((snapsvc_func_proto) (sr->snapsvc_func))(args[0], args[1], args[2]); break; case 4 : returnptr = ((snapsvc_func_proto) (sr->snapsvc_func))(args[0], args[1], args[2], args[3]); break; case 5 : returnptr = ((snapsvc_func_proto) (sr->snapsvc_func))(args[0], args[1], args[2], args[3], args[4]); break; default : d_printf(50,"snap : %s:%d: tried to call a function with too many arguments\n",__FILE__,__LINE__); } /* push up the direct results, if any */ if (sr->nret != SVC_SNMP_TYPE_NULL) snap_svc_convert_direct2stack(p, returnptr, sr->nret); /* check if it returned anything using a returnstruct */ returnptr = snap_svc_register_returnlaststruct(); if (returnptr){ d_printf(50,"snap : %s:%d: retrieved a result containing %d variables, ptr =(%p) \n",__FILE__,__LINE__,((struct svc_returnstruct*)returnptr)->length, returnptr); for (i=0; i < ((struct svc_returnstruct*) returnptr)->length; i++) snap_svc_convert_returnstruct2stack(p, p->sp, &((struct svc_returnstruct*) returnptr)->list[i]); returnptr = snap_svc_register_freelaststruct(); } free(args); return 0;}/* load the services */void snap_svc_handler_init() { snap_svc_table_init(); /* initialize the hashtable */ snap_svc_registerall(); /* register services */ snap_svc_initialized = 1;}/* unload the services */void snap_svc_handler_close() { snap_svc_unregisterall(); /* register services */ snap_svc_table_fini(); /* initialize the hashtable */ snap_svc_initialized = 1;}/* reinitialize the services */void snap_svc_handler_reinit(){ snap_svc_handler_close(); snap_svc_handler_init();}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -