📄 dlmod.c
字号:
* 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 + -