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

📄 nsdebug.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
字号:
#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/agent/scalar.h>#ifdef HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#include "agent/nsDebug.h"#include "util_funcs.h"/* * OIDs for the debugging control scalar objects * * Note that these we're registering the full object rather *  than the (sole) valid instance in each case, in order *  to handle requests for invalid instances properly. */oid nsDebugEnabled_oid[]    = { 1, 3, 6, 1, 4, 1, 8072, 1, 7, 1, 1};oid nsDebugOutputAll_oid[]  = { 1, 3, 6, 1, 4, 1, 8072, 1, 7, 1, 2};oid nsDebugDumpPdu_oid[]    = { 1, 3, 6, 1, 4, 1, 8072, 1, 7, 1, 3};/* * ... and for the token table. */#define  DBGTOKEN_PREFIX	2#define  DBGTOKEN_ENABLED	3#define  DBGTOKEN_STATUS	4oid nsDebugTokenTable_oid[] = { 1, 3, 6, 1, 4, 1, 8072, 1, 7, 1, 4};voidinit_nsDebug(void){    netsnmp_table_registration_info *table_info;    netsnmp_iterator_info           *iinfo;    /*     * Register the scalar objects...     */    DEBUGMSGTL(("nsDebugScalars", "Initializing\n"));    netsnmp_register_scalar(        netsnmp_create_handler_registration(            "nsDebugEnabled", handle_nsDebugEnabled,            nsDebugEnabled_oid, OID_LENGTH(nsDebugEnabled_oid),            HANDLER_CAN_RWRITE)        );    netsnmp_register_scalar(        netsnmp_create_handler_registration(            "nsDebugOutputAll", handle_nsDebugOutputAll,            nsDebugOutputAll_oid, OID_LENGTH(nsDebugOutputAll_oid),            HANDLER_CAN_RWRITE)        );    netsnmp_register_scalar(        netsnmp_create_handler_registration(            "nsDebugDumpPdu", handle_nsDebugDumpPdu,            nsDebugDumpPdu_oid, OID_LENGTH(nsDebugDumpPdu_oid),            HANDLER_CAN_RWRITE)        );    /*     * ... and the table.     * We need to define the column structure and indexing....     */    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);    if (!table_info) {        return;    }    netsnmp_table_helper_add_indexes(table_info, ASN_PRIV_IMPLIED_OCTET_STR, 0);    table_info->min_column = DBGTOKEN_STATUS;    table_info->max_column = DBGTOKEN_STATUS;    /*     * .... and the iteration information ....     */    iinfo      = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);    if (!iinfo) {        return;    }    iinfo->get_first_data_point = get_first_debug_entry;    iinfo->get_next_data_point = get_next_debug_entry;    iinfo->table_reginfo        = table_info;    /*     * .... and register the table with the agent.     */    netsnmp_register_table_iterator(        netsnmp_create_handler_registration(            "tzDebugTable", handle_nsDebugTable,            nsDebugTokenTable_oid, OID_LENGTH(nsDebugTokenTable_oid),            HANDLER_CAN_RWRITE),        iinfo);}inthandle_nsDebugEnabled(netsnmp_mib_handler *handler,                netsnmp_handler_registration *reginfo,                netsnmp_agent_request_info *reqinfo,                netsnmp_request_info *requests){    long enabled;    netsnmp_request_info *request=NULL;    switch (reqinfo->mode) {    case MODE_GET:	enabled = snmp_get_do_debugging();	if ( enabled==0 )	    enabled=2;		/* false */	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;	    snmp_set_var_typed_value(request->requestvb, ASN_INTEGER,                                     (u_char*)&enabled, sizeof(enabled));	}	break;    case MODE_SET_RESERVE1:	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;            if ( request->status != 0 ) {                return SNMP_ERR_NOERROR;	/* Already got an error */            }            if ( request->requestvb->type != ASN_INTEGER ) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGTYPE);                return SNMP_ERR_WRONGTYPE;            }            if (( *request->requestvb->val.integer != 1 ) &&                ( *request->requestvb->val.integer != 2 )) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGVALUE);                return SNMP_ERR_WRONGVALUE;            }        }        break;    case MODE_SET_COMMIT:        enabled = *requests->requestvb->val.integer;	if (enabled == 2 )	/* false */	    enabled = 0;	snmp_set_do_debugging( enabled );        break;    }    return SNMP_ERR_NOERROR;}inthandle_nsDebugOutputAll(netsnmp_mib_handler *handler,                netsnmp_handler_registration *reginfo,                netsnmp_agent_request_info *reqinfo,                netsnmp_request_info *requests){    long enabled;    netsnmp_request_info *request=NULL;    switch (reqinfo->mode) {    case MODE_GET:	enabled = snmp_get_do_debugging();	if ( enabled==0 )	    enabled=2;		/* false */	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;	    snmp_set_var_typed_value(request->requestvb, ASN_INTEGER,                                     (u_char*)&enabled, sizeof(enabled));	}	break;    case MODE_SET_RESERVE1:	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;            if ( request->status != 0 ) {                return SNMP_ERR_NOERROR;	/* Already got an error */            }            if ( request->requestvb->type != ASN_INTEGER ) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGTYPE);                return SNMP_ERR_WRONGTYPE;            }            if (( *request->requestvb->val.integer != 1 ) &&                ( *request->requestvb->val.integer != 2 )) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGVALUE);                return SNMP_ERR_WRONGVALUE;            }        }        break;    case MODE_SET_COMMIT:        enabled = *requests->requestvb->val.integer;	if (enabled == 2 )	/* false */	    enabled = 0;	snmp_set_do_debugging( enabled );        break;    }    return SNMP_ERR_NOERROR;}inthandle_nsDebugDumpPdu(netsnmp_mib_handler *handler,                netsnmp_handler_registration *reginfo,                netsnmp_agent_request_info *reqinfo,                netsnmp_request_info *requests){    long enabled;    netsnmp_request_info *request=NULL;    switch (reqinfo->mode) {    case MODE_GET:	enabled = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID,	                                 NETSNMP_DS_LIB_DUMP_PACKET);	if ( enabled==0 )	    enabled=2;		/* false */	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;	    snmp_set_var_typed_value(request->requestvb, ASN_INTEGER,                                     (u_char*)&enabled, sizeof(enabled));	}	break;    case MODE_SET_RESERVE1:	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;            if ( request->status != 0 ) {                return SNMP_ERR_NOERROR;	/* Already got an error */            }            if ( request->requestvb->type != ASN_INTEGER ) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGTYPE);                return SNMP_ERR_WRONGTYPE;            }            if (( *request->requestvb->val.integer != 1 ) &&                ( *request->requestvb->val.integer != 2 )) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGVALUE);                return SNMP_ERR_WRONGVALUE;            }        }        break;    case MODE_SET_COMMIT:        enabled = *requests->requestvb->val.integer;	if (enabled == 2 )	/* false */	    enabled = 0;	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,	                       NETSNMP_DS_LIB_DUMP_PACKET, enabled);        break;    }    return SNMP_ERR_NOERROR;}/* * var_tzIntTableFixed(): *   Handle the tzIntTable as a fixed table of NUMBER_TZ_ENTRIES rows, *    with the timezone offset hardwired to be the same as the index. */netsnmp_variable_list *get_first_debug_entry(void **loop_context, void **data_context,                      netsnmp_variable_list *index,                      netsnmp_iterator_info *data){    int i;    for (i=0; i<debug_num_tokens; i++) {        if (dbg_tokens[i].token_name)            break;    }    if ( i==debug_num_tokens )        return NULL;    snmp_set_var_value(index, dbg_tokens[i].token_name,		       strlen(dbg_tokens[i].token_name));    *loop_context = (void*)i;    *data_context = (void*)&dbg_tokens[i];    return index;}netsnmp_variable_list *get_next_debug_entry(void **loop_context, void **data_context,                      netsnmp_variable_list *index,                      netsnmp_iterator_info *data){    int i = (int)*loop_context;    for (i++; i<debug_num_tokens; i++) {        if (dbg_tokens[i].token_name)            break;    }    if ( i==debug_num_tokens )        return NULL;    snmp_set_var_value(index, dbg_tokens[i].token_name,		       strlen(dbg_tokens[i].token_name));    *loop_context = (void*)i;    *data_context = (void*)&dbg_tokens[i];    return index;}inthandle_nsDebugTable(netsnmp_mib_handler *handler,                netsnmp_handler_registration *reginfo,                netsnmp_agent_request_info *reqinfo,                netsnmp_request_info *requests){    long status;    netsnmp_request_info       *request    =NULL;    netsnmp_table_request_info *table_info    =NULL;    netsnmp_token_descr        *debug_entry=NULL;    switch (reqinfo->mode) {    case MODE_GET:        for (request=requests; request; request=request->next) {            if (requests->processed != 0)                continue;            debug_entry = (netsnmp_token_descr*)                           netsnmp_extract_iterator_context(request);            if (!debug_entry)                continue;	    status = (debug_entry->enabled ? RS_ACTIVE : RS_NOTINSERVICE);	    snmp_set_var_typed_value(request->requestvb, ASN_INTEGER,                                     (u_char*)&status, sizeof(status));	}	break;    case MODE_SET_RESERVE1:	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;            if ( request->status != 0 ) {                return SNMP_ERR_NOERROR;	/* Already got an error */            }            if ( request->requestvb->type != ASN_INTEGER ) {                netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGTYPE);                return SNMP_ERR_WRONGTYPE;            }            debug_entry = (netsnmp_token_descr*)                           netsnmp_extract_iterator_context(request);            switch (*request->requestvb->val.integer) {            case RS_ACTIVE:            case RS_NOTINSERVICE:                /*		 * These operations require an existing row		 */                if (!debug_entry) {		    netsnmp_set_request_error(reqinfo, request,                                              SNMP_ERR_INCONSISTENTVALUE);                    return SNMP_ERR_INCONSISTENTVALUE;		}		break;            case RS_CREATEANDWAIT:            case RS_CREATEANDGO:                /*		 * These operations assume the row doesn't already exist		 */                if (debug_entry) {		    netsnmp_set_request_error(reqinfo, request,                                              SNMP_ERR_INCONSISTENTVALUE);                    return SNMP_ERR_INCONSISTENTVALUE;		}		break;            case RS_DESTROY:                /*		 * This operation can work regardless		 */		break;            case RS_NOTREADY:            default:		netsnmp_set_request_error(reqinfo, request,                                          SNMP_ERR_WRONGVALUE);                return SNMP_ERR_WRONGVALUE;	    }        }        break;    case MODE_SET_COMMIT:	for (request = requests; request; request=request->next) {            if (requests->processed != 0)                continue;            if ( request->status != 0 ) {                return SNMP_ERR_NOERROR;	/* Already got an error */            }            switch (*request->requestvb->val.integer) {            case RS_ACTIVE:            case RS_NOTINSERVICE:                /*		 * Update the enabled field appropriately		 */                debug_entry = (netsnmp_token_descr*)                               netsnmp_extract_iterator_context(request);                debug_entry->enabled =                    (*request->requestvb->val.integer == RS_ACTIVE);		break;            case RS_CREATEANDWAIT:            case RS_CREATEANDGO:                /*		 * Create the entry, and set the enabled field appropriately		 */                table_info = netsnmp_extract_table_info(request);                debug_register_tokens(table_info->indexes->val.string);#ifdef UMMMMM                if (*request->requestvb->val.integer == RS_CREATEANDWAIT) {		    /* XXX - how to locate the entry ??  */		    debug_entry->enabled = 0;		}#endif		break;            case RS_DESTROY:                /*		 * XXX - there's no "remove" API  :-(		 */                debug_entry = (netsnmp_token_descr*)                               netsnmp_extract_iterator_context(request);                if (debug_entry) {		    debug_entry->enabled = 0;		    free(debug_entry->token_name);		    debug_entry->token_name = NULL;		}		break;	    }        }        break;    }    return SNMP_ERR_NOERROR;}

⌨️ 快捷键说明

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