/* * Note: this file originally auto-generated by mib2c using * : mib2c.container.conf,v 1.8 2006/07/26 15:58:26 dts12 Exp $ */ /* Portions of this file are subject to the following copyright(s). See * the Net-SNMP's COPYING file for more details and other copyrights * that may apply: */ /* * Portions of this file are copyrighted by: * Copyright (C) 2007 Apple, Inc. All rights reserved. * Use is subject to license terms specified in the COPYING file * distributed with the Net-SNMP package. */ #include #include #include #include #include #include #include "data_access/swrun.h" #include "hrSWRunTable.h" #include #define MYTABLE "hrSWRunTable" static netsnmp_table_registration_info *table_info; /** Initializes the hrSWRunTable module */ void init_hrSWRunTable(void) { /* * here we initialize all the tables we're planning on supporting */ initialize_table_hrSWRunTable(); } void shutdown_hrSWRunTable(void) { if (table_info) { netsnmp_table_registration_info_free(table_info); table_info = NULL; } } oid hrSWRunTable_oid[] = { 1, 3, 6, 1, 2, 1, 25, 4, 2 }; size_t hrSWRunTable_oid_len = OID_LENGTH(hrSWRunTable_oid); /** Initialize the hrSWRunTable table by defining its contents and how it's structured */ void initialize_table_hrSWRunTable(void) { netsnmp_handler_registration *reg; netsnmp_mib_handler *handler = NULL; #ifndef NETSNMP_NO_WRITE_SUPPORT #ifdef NETSNMP_INCLUDE_HRSWRUN_WRITE_SUPPORT # define SWRUN_ACCESS_LEVEL HANDLER_CAN_RWRITE #else # define SWRUN_ACCESS_LEVEL HANDLER_CAN_RONLY #endif #else /* !NETSNMP_NO_WRITE_SUPPORT */ # define SWRUN_ACCESS_LEVEL HANDLER_CAN_RONLY #endif /* !NETSNMP_NO_WRITE_SUPPORT */ reg = netsnmp_create_handler_registration(MYTABLE, hrSWRunTable_handler, hrSWRunTable_oid, hrSWRunTable_oid_len, SWRUN_ACCESS_LEVEL); if (NULL == reg) { snmp_log(LOG_ERR,"error creating handler registration for " MYTABLE "\n"); goto bail; } reg->modes |= HANDLER_CAN_NOT_CREATE; table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); if (NULL == table_info) { snmp_log(LOG_ERR,"error allocating table registration for " MYTABLE "\n"); goto bail; } netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, /* index: hrSWRunIndex */ 0); table_info->min_column = COLUMN_HRSWRUNINDEX; table_info->max_column = COLUMN_HRSWRUNSTATUS; /************************************************* * * inject container_table helper */ handler = netsnmp_container_table_handler_get(table_info, netsnmp_swrun_container(), TABLE_CONTAINER_KEY_NETSNMP_INDEX); if (NULL == handler) { snmp_log(LOG_ERR,"error allocating table registration for " MYTABLE "\n"); goto bail; } if (SNMPERR_SUCCESS != netsnmp_inject_handler(reg, handler)) { snmp_log(LOG_ERR,"error injecting container_table handler for " MYTABLE "\n"); goto bail; } handler = NULL; /* reg has it, will reuse below */ /************************************************* * * inject cache helper */ handler = netsnmp_cache_handler_get(netsnmp_swrun_cache()); if (NULL == handler) { snmp_log(LOG_ERR, "error creating cache handler for " MYTABLE "\n"); goto bail; } if (SNMPERR_SUCCESS != netsnmp_inject_handler(reg, handler)) { snmp_log(LOG_ERR,"error injecting cache handler for " MYTABLE "\n"); goto bail; } handler = NULL; /* reg has it*/ if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { snmp_log(LOG_ERR,"error registering table handler for " MYTABLE "\n"); reg = NULL; /* it was freed inside netsnmp_register_table */ goto bail; } return; /* ok */ bail: /* not ok */ if (handler) netsnmp_handler_free(handler); if (table_info) netsnmp_table_registration_info_free(table_info); if (reg) netsnmp_handler_registration_free(reg); } /** handles requests for the hrSWRunTable table */ int hrSWRunTable_handler(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { netsnmp_request_info *request; netsnmp_table_request_info *table_info; netsnmp_swrun_entry *table_entry; switch (reqinfo->mode) { /* * Read-support (also covers GetNext requests) */ case MODE_GET: for (request = requests; request; request = request->next) { if (request->processed) continue; table_entry = (netsnmp_swrun_entry *) netsnmp_container_table_extract_context(request); table_info = netsnmp_extract_table_info(request); if ((NULL == table_entry) || (NULL == table_info)) { snmp_log(LOG_ERR, "could not extract table entry or info for " MYTABLE "\n"); snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR, NULL, 0); continue; } switch (table_info->colnum) { case COLUMN_HRSWRUNINDEX: snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, table_entry->hrSWRunIndex); break; case COLUMN_HRSWRUNNAME: snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) table_entry-> hrSWRunName, table_entry->hrSWRunName_len); break; case COLUMN_HRSWRUNID: snmp_set_var_typed_value(request->requestvb, ASN_OBJECT_ID, #ifdef NETSNMP_SWRUN_HAVE_ID (u_char *) table_entry->hrSWRunID, table_entry->hrSWRunID_len #else (u_char *) &nullOid, nullOidLen #endif ); break; case COLUMN_HRSWRUNPATH: snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) table_entry-> hrSWRunPath, table_entry->hrSWRunPath_len); break; case COLUMN_HRSWRUNPARAMETERS: snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) table_entry-> hrSWRunParameters, table_entry-> hrSWRunParameters_len); break; case COLUMN_HRSWRUNTYPE: snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, table_entry->hrSWRunType); break; case COLUMN_HRSWRUNSTATUS: snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, table_entry->hrSWRunStatus); break; default: /* * An unsupported/unreadable column (if applicable) */ snmp_set_var_typed_value(request->requestvb, SNMP_NOSUCHOBJECT, NULL, 0); } } break; #ifndef NETSNMP_NO_WRITE_SUPPORT #ifdef NETSNMP_INCLUDE_HRSWRUN_WRITE_SUPPORT /* * Write-support */ case MODE_SET_RESERVE1: for (request = requests; request; request = request->next) { int pid; if (request->processed) continue; table_entry = (netsnmp_swrun_entry *) netsnmp_container_table_extract_context(request); table_info = netsnmp_extract_table_info(request); if ((NULL == table_entry) || (NULL == table_info)) { snmp_log(LOG_ERR, "could not extract table entry or info for " MYTABLE "\n"); snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR, NULL, 0); continue; } switch (table_info->colnum) { case COLUMN_HRSWRUNSTATUS: if (*request->requestvb->val.integer != HRSWRUNSTATUS_INVALID) { netsnmp_set_request_error(reqinfo, request, SNMP_ERR_WRONGVALUE); return SNMP_ERR_NOERROR; } pid = request->requestvb->name[request->requestvb->name_length-1]; if (1 == pid) { snmp_log(LOG_WARNING,"refusing to kill pid 1\n"); netsnmp_set_request_error(reqinfo, request, SNMP_ERR_NOACCESS); return SNMP_ERR_NOERROR; } break; default: netsnmp_set_request_error(reqinfo, request, SNMP_ERR_NOTWRITABLE); return SNMP_ERR_NOERROR; } } break; case MODE_SET_RESERVE2: break; case MODE_SET_FREE: break; case MODE_SET_ACTION: for (request = requests; request; request = request->next) { if (request->processed) continue; table_entry = (netsnmp_swrun_entry *) netsnmp_container_table_extract_context(request); table_info = netsnmp_extract_table_info(request); if ((NULL == table_entry) || (NULL == table_info)) { snmp_log(LOG_ERR, "could not extract table entry or info for " MYTABLE "\n"); snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR, NULL, 0); continue; } switch (table_info->colnum) { case COLUMN_HRSWRUNSTATUS: table_entry->old_hrSWRunStatus = table_entry->hrSWRunStatus; table_entry->hrSWRunStatus = *request->requestvb->val.integer; break; } } break; case MODE_SET_UNDO: for (request = requests; request; request = request->next) { if (request->processed) continue; container = netsnmp_container_table_extract_context(request); table_entry = (netsnmp_swrun_entry *) netsnmp_container_table_extract_context(request); table_info = netsnmp_extract_table_info(request); if ((NULL == table_entry) || (NULL == table_info)) { snmp_log(LOG_ERR, "could not extract table entry or info for " MYTABLE "\n"); snmp_set_var_typed_value(request->requestvb, SNMP_ERR_GENERR, NULL, 0); continue; } switch (table_info->colnum) { case COLUMN_HRSWRUNSTATUS: table_entry->hrSWRunStatus = table_entry->old_hrSWRunStatus; table_entry->old_hrSWRunStatus = 0; break; } } break; case MODE_SET_COMMIT: for (request = requests; request; request = request->next) { int pid; if (request->processed) continue; pid = request->requestvb->name[request->requestvb->name_length-1]; DEBUGMSGTL(("hrSWRunTable:commit", "kill(%d,TERM)\n", pid)); kill(pid, SIGTERM); } break; #endif /* NETSNMP_INCLUDE_HRSWRUN_WRITE_SUPPORT */ #endif /* !NETSNMP_NO_WRITE_SUPPORT */ } return SNMP_ERR_NOERROR; }