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

📄 snap_svc_handler.c

📁 一个学习SNMP项目:tmoerlan.
💻 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 + -