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

📄 dlmod.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
 * length  IN/OUT  - length of IN/OUT oid's  * exact   IN      - TRUE if an exact match was requested * var_len OUT     - length of variable or 0 if function returned * write_method */static intheader_dlmod(struct variable *vp,             oid * name,             size_t * length,             int exact, size_t * var_len, WriteMethod ** write_method){#define DLMOD_NAME_LENGTH 10    oid             newname[MAX_OID_LEN];    int             result;    memcpy((char *) newname, (char *) vp->name,           (int) vp->namelen * sizeof(oid));    newname[DLMOD_NAME_LENGTH] = 0;    result =        snmp_oid_compare(name, *length, newname, (int) vp->namelen + 1);    if ((exact && (result != 0)) || (!exact && (result >= 0))) {        return MATCH_FAILED;    }    memcpy((char *) name, (char *) newname,           ((int) vp->namelen + 1) * sizeof(oid));    *length = vp->namelen + 1;    *write_method = 0;    *var_len = sizeof(long);    /* default to 'long' results */    return MATCH_SUCCEEDED;}u_char         *var_dlmod(struct variable * vp,          oid * name,          size_t * length,          int exact, size_t * var_len, WriteMethod ** write_method){    /*     * variables we may use later      */    *write_method = 0;          /* assume it isnt writable for the time being */    *var_len = sizeof(int);     /* assume an integer and change later                                 * if not */    if (header_dlmod(vp, name, length, exact,                     var_len, write_method) == MATCH_FAILED)        return 0;    /*     * this is where we do the value assignments for the mib results.      */    switch (vp->magic) {    case DLMODNEXTINDEX:        long_return = dlmod_next_index;        return (unsigned char *) &long_return;    default:        DEBUGMSGTL(("dlmod", "unknown sub-id %d in var_dlmod\n",                    vp->magic));    }    return 0;}/* * header_dlmodEntry(... * Arguments: * vp     IN      - pointer to variable entry that points here * name    IN/OUT  - IN/name requested, OUT/name found * length  IN/OUT  - length of IN/OUT oid's  * exact   IN      - TRUE if an exact match was requested * var_len OUT     - length of variable or 0 if function returned * write_method *  */static struct dlmod *header_dlmodEntry(struct variable *vp,                  oid * name,                  size_t * length,                  int exact, size_t * var_len, WriteMethod ** write_method){#define DLMODENTRY_NAME_LENGTH 12    oid             newname[MAX_OID_LEN];    int             result;    struct dlmod   *dlm = 0;    int             dlmod_index;    memcpy((char *) newname, (char *) vp->name,           (int) vp->namelen * sizeof(oid));    *write_method = 0;    for (dlmod_index = 1; dlmod_index < dlmod_next_index; dlmod_index++) {        dlm = dlmod_get_by_index(dlmod_index);        DEBUGMSGTL(("dlmod", "dlmodEntry dlm: %p dlmod_index: %d\n",                    dlm, dlmod_index));        if (dlm) {            newname[12] = dlmod_index;            result = snmp_oid_compare(name, *length, newname,                                      (int) vp->namelen + 1);            if ((exact && (result == 0)) || (!exact && (result < 0)))                break;        }    }    if (dlmod_index >= dlmod_next_index) {        if (dlmod_index == dlmod_next_index &&            exact && vp->magic == DLMODSTATUS)            *write_method = write_dlmodStatus;        return NULL;    }    memcpy((char *) name, (char *) newname,           ((int) vp->namelen + 1) * sizeof(oid));    *length = vp->namelen + 1;    *var_len = sizeof(long);    return dlm;}u_char         *var_dlmodEntry(struct variable * vp,               oid * name,               size_t * length,               int exact, size_t * var_len, WriteMethod ** write_method){    /*     * variables we may use later      */    struct dlmod   *dlm;    *var_len = sizeof(int);     /* assume an integer and change later                                 * if not */    dlm =        header_dlmodEntry(vp, name, length, exact, var_len, write_method);    if (dlm == NULL)        return 0;    /*     * this is where we do the value assignments for the mib results.      */    switch (vp->magic) {    case DLMODNAME:        *write_method = write_dlmodName;        *var_len = strlen(dlm->name);        return (unsigned char *) dlm->name;    case DLMODPATH:        *write_method = write_dlmodPath;        *var_len = strlen(dlm->path);        return (unsigned char *) dlm->path;    case DLMODERROR:        *var_len = strlen(dlm->error);        return (unsigned char *) dlm->error;    case DLMODSTATUS:        *write_method = write_dlmodStatus;        long_return = dlm->status;        return (unsigned char *) &long_return;    default:        DEBUGMSGTL(("dlmod", "unknown sub-id %d in var_dlmodEntry\n",                    vp->magic));    }    return 0;}intwrite_dlmodName(int action,                u_char * var_val,                u_char var_val_type,                size_t var_val_len,                u_char * statP, oid * name, size_t name_len){    static struct dlmod *dlm;    if (var_val_type != ASN_OCTET_STR) {        snmp_log(LOG_ERR, "write to dlmodName not ASN_OCTET_STR\n");        return SNMP_ERR_WRONGTYPE;    }    if (var_val_len > sizeof(dlm->name)) {        snmp_log(LOG_ERR, "write to dlmodName: bad length\n");        return SNMP_ERR_WRONGLENGTH;    }    if (action == COMMIT) {        dlm = dlmod_get_by_index(name[12]);        if (!dlm || dlm->status == DLMOD_LOADED)            return SNMP_ERR_RESOURCEUNAVAILABLE;        strncpy(dlm->name, (const char *) var_val, var_val_len);        dlm->name[var_val_len] = 0;    }    return SNMP_ERR_NOERROR;}intwrite_dlmodPath(int action,                u_char * var_val,                u_char var_val_type,                size_t var_val_len,                u_char * statP, oid * name, size_t name_len){    static struct dlmod *dlm;    if (var_val_type != ASN_OCTET_STR) {        snmp_log(LOG_ERR, "write to dlmodPath not ASN_OCTET_STR\n");        return SNMP_ERR_WRONGTYPE;    }    if (var_val_len > sizeof(dlm->path)) {        snmp_log(LOG_ERR, "write to dlmodPath: bad length\n");        return SNMP_ERR_WRONGLENGTH;    }    if (action == COMMIT) {        dlm = dlmod_get_by_index(name[12]);        if (!dlm || dlm->status == DLMOD_LOADED)            return SNMP_ERR_RESOURCEUNAVAILABLE;        strncpy(dlm->path, (const char *) var_val, var_val_len);        dlm->path[var_val_len] = 0;    }    return SNMP_ERR_NOERROR;}intwrite_dlmodStatus(int action,                  u_char * var_val,                  u_char var_val_type,                  size_t var_val_len,                  u_char * statP, oid * name, size_t name_len){    /*     * variables we may use later      */    struct dlmod   *dlm;    if (var_val_type != ASN_INTEGER) {        snmp_log(LOG_ERR, "write to dlmodStatus not ASN_INTEGER\n");        return SNMP_ERR_WRONGTYPE;    }    if (var_val_len > sizeof(long)) {        snmp_log(LOG_ERR, "write to dlmodStatus: bad length\n");        return SNMP_ERR_WRONGLENGTH;    }    if (action == COMMIT) {        /*         * object identifier in form .1.3.6.1.4.1.2021.13.14.2.1.4.x          * where X is index with offset 12          */        dlm = dlmod_get_by_index(name[12]);        switch (*((long *) var_val)) {        case DLMOD_CREATE:            if (dlm || (name[12] != dlmod_next_index))                return SNMP_ERR_RESOURCEUNAVAILABLE;            dlm = dlmod_create_module();            if (!dlm)                return SNMP_ERR_RESOURCEUNAVAILABLE;            break;        case DLMOD_LOAD:            if (!dlm || dlm->status == DLMOD_LOADED)                return SNMP_ERR_RESOURCEUNAVAILABLE;            dlmod_load_module(dlm);            break;        case DLMOD_UNLOAD:            if (!dlm || dlm->status != DLMOD_LOADED)                return SNMP_ERR_RESOURCEUNAVAILABLE;            dlmod_unload_module(dlm);            break;        case DLMOD_DELETE:            if (!dlm || dlm->status == DLMOD_LOADED)                return SNMP_ERR_RESOURCEUNAVAILABLE;            dlmod_delete_module(dlm);            break;        default:            return SNMP_ERR_WRONGVALUE;        }    }    return SNMP_ERR_NOERROR;}#else                           /* no dlopen support */voidinit_dlmod(void){    DEBUGMSGTL(("dlmod",                "Dynamic modules not support on this platform\n"));}#endif

⌨️ 快捷键说明

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