📄 dlmod.c
字号:
/* * Dynamic Loadable Agent Modules MIB (UCD-DLMOD-MIB) - dlmod.c * */#include <net-snmp/net-snmp-config.h>#if HAVE_STDLIB_H#include <stdlib.h>#endif#include <stdio.h>#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#include <ctype.h>#if HAVE_WINSOCK_H#include <winsock.h>#endif#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include "struct.h"#include "util_funcs.h"#if defined(HAVE_DLFCN_H) && ( defined(HAVE_DLOPEN) || defined(HAVE_LIBDL) )#include <dlfcn.h>#include "dlmod.h"static struct dlmod *dlmods = NULL;static int dlmod_next_index = 1;static char dlmod_path[1024];static void dlmod_parse_config(const char *, char *);static void dlmod_free_config(void);/* * this variable defines function callbacks and type return * information for the dlmod mib */static struct variable4 dlmod_variables[] = { {DLMODNEXTINDEX, ASN_INTEGER, RONLY, var_dlmod, 1, {1}}, {DLMODNAME, ASN_OCTET_STR, RWRITE, var_dlmodEntry, 3, {2, 1, 2}}, {DLMODPATH, ASN_OCTET_STR, RWRITE, var_dlmodEntry, 3, {2, 1, 3}}, {DLMODERROR, ASN_OCTET_STR, RONLY, var_dlmodEntry, 3, {2, 1, 4}}, {DLMODSTATUS, ASN_INTEGER, RWRITE, var_dlmodEntry, 3, {2, 1, 5}},};static oid dlmod_variables_oid[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 14 };static int dlmod_variables_oid_len = 9;voidinit_dlmod(void){ char *p; int len; REGISTER_MIB("dlmod", dlmod_variables, variable4, dlmod_variables_oid); /* * TODO: REGISTER_SYSOR_ENTRY */ DEBUGMSGTL(("dlmod", "register mib\n")); snmpd_register_config_handler("dlmod", dlmod_parse_config, dlmod_free_config, "module-name module-path"); p = getenv("SNMPDLMODPATH"); strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path)); dlmod_path[ sizeof(dlmod_path)-1 ] = 0; if (p) { if (p[0] == ':') { len = strlen(dlmod_path); if (dlmod_path[len - 1] != ':') { strncat(dlmod_path, ":", sizeof(dlmod_path) - len -1); len++; } strncat(dlmod_path, p + 1, sizeof(dlmod_path) - len); } else strncpy(dlmod_path, p, sizeof(dlmod_path)); } dlmod_path[ sizeof(dlmod_path)-1 ] = 0; DEBUGMSGTL(("dlmod", "dlmod_path: %s\n", dlmod_path));}voiddeinit_dlmod(void){ unregister_mib(dlmod_variables_oid, dlmod_variables_oid_len); snmpd_unregister_config_handler("dlmod");}struct dlmod *dlmod_create_module(void){ struct dlmod **pdlmod, *dlm; DEBUGMSGTL(("dlmod", "dlmod_create_module\n")); dlm = (struct dlmod *) calloc(1, sizeof(struct dlmod)); if (dlm == NULL) return NULL; dlm->index = dlmod_next_index++; dlm->status = DLMOD_UNLOADED; for (pdlmod = &dlmods; *pdlmod != NULL; pdlmod = &((*pdlmod)->next)); (*pdlmod) = dlm; return dlm;}voiddlmod_delete_module(struct dlmod *dlm){ struct dlmod **pdlmod; DEBUGMSGTL(("dlmod", "dlmod_delete_module\n")); if (!dlm || dlm->status != DLMOD_UNLOADED) return; for (pdlmod = &dlmods; *pdlmod; pdlmod = &((*pdlmod)->next)) if (*pdlmod == dlm) { *pdlmod = dlm->next; free(dlm); return; }}voiddlmod_load_module(struct dlmod *dlm){ char sym_init[64]; char *p, tmp_path[255]; int (*dl_init) (void); char *st; DEBUGMSGTL(("dlmod", "dlmod_load_module %s: %s\n", dlm->name, dlm->path)); if (!dlm || !dlm->path || !dlm->name || (dlm->status != DLMOD_UNLOADED && dlm->status != DLMOD_ERROR)) return; if (dlm->path[0] == '/') {#ifdef RTLD_NOW dlm->handle = dlopen(dlm->path, RTLD_NOW);#else dlm->handle = dlopen(dlm->path, RTLD_LAZY);#endif if (dlm->handle == NULL) { snprintf(dlm->error, sizeof(dlm->error), "dlopen failed: %s", dlerror()); dlm->status = DLMOD_ERROR; return; } } else { for (p = strtok_r(dlmod_path, ":", &st); p; p = strtok_r(NULL, ":", &st)) { snprintf(tmp_path, sizeof(tmp_path), "%s/%s.so", p, dlm->path); DEBUGMSGTL(("dlmod", "p: %s tmp_path: %s\n", p, tmp_path));#ifdef RTLD_NOW dlm->handle = dlopen(tmp_path, RTLD_NOW);#else dlm->handle = dlopen(tmp_path, RTLD_LAZY);#endif if (dlm->handle == NULL) { snprintf(dlm->error, sizeof(dlm->error), "dlopen failed: %s", dlerror()); dlm->status = DLMOD_ERROR; } } strncpy(dlm->path, tmp_path, sizeof(dlm->path)); if (dlm->status == DLMOD_ERROR) return; } snprintf(sym_init, sizeof(sym_init), "init_%s", dlm->name); dl_init = dlsym(dlm->handle, sym_init); if (dl_init == NULL) { dlclose(dlm->handle); snprintf(dlm->error, sizeof(dlm->error), "dlsym failed: can't find \'%s\'", sym_init); dlm->status = DLMOD_ERROR; return; } dl_init(); dlm->error[0] = '\0'; dlm->status = DLMOD_LOADED;}voiddlmod_unload_module(struct dlmod *dlm){ char sym_deinit[64]; int (*dl_deinit) (void); if (!dlm || dlm->status != DLMOD_LOADED) return; snprintf(sym_deinit, sizeof(sym_deinit), "deinit_%s", dlm->name); dl_deinit = dlsym(dlm->handle, sym_deinit); if (dl_deinit == NULL) { snprintf(dlm->error, sizeof(dlm->error), "dlsym failed: can't find \'%s\'", sym_deinit); } else { dl_deinit(); } dlclose(dlm->handle); dlm->status = DLMOD_UNLOADED; DEBUGMSGTL(("dlmod", "Module %s unloaded\n", dlm->name));}struct dlmod *dlmod_get_by_index(int iindex){ struct dlmod *dlmod; for (dlmod = dlmods; dlmod; dlmod = dlmod->next) if (dlmod->index == iindex) return dlmod; return NULL;}static voiddlmod_parse_config(const char *token, char *cptr){ char *dlm_name, *dlm_path; struct dlmod *dlm; char *st; if (cptr == NULL) { config_perror("Bad dlmod line"); return; } /* * remove comments */ *(cptr + strcspn(cptr, "#;\r\n")) = '\0'; dlm = dlmod_create_module(); if (!dlm) return; /* * dynamic module name */ dlm_name = strtok_r(cptr, "\t ", &st); if (dlm_name == NULL) { config_perror("Bad dlmod line"); dlmod_delete_module(dlm); return; } strncpy(dlm->name, dlm_name, sizeof(dlm->name)); /* * dynamic module path */ dlm_path = strtok_r(NULL, "\t ", &st); if (dlm_path) strncpy(dlm->path, dlm_path, sizeof(dlm->path)); else strncpy(dlm->path, dlm_name, sizeof(dlm->path)); dlmod_load_module(dlm); if (dlm->status == DLMOD_ERROR) snmp_log(LOG_ERR, "%s\n", dlm->error);}static voiddlmod_free_config(void){ struct dlmod *dtmp, *dtmp2; for (dtmp = dlmods; dtmp != NULL;) { dtmp2 = dtmp; dtmp = dtmp->next; dlmod_unload_module(dtmp2); free(dtmp2); } dlmods = NULL;}/* * header_dlmod(... * Arguments: * vp IN - pointer to variable entry that points here * name IN/OUT - IN/name requested, OUT/name found
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -