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

📄 dlmod.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  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 + -