📄 vacm.c
字号:
(struct vacm_viewEntry *) calloc(1, sizeof(struct vacm_viewEntry)); if (vp->reserved == NULL) { free(vp); return NULL; } vp->viewName[0] = glen; strcpy(vp->viewName + 1, viewName); vp->viewSubtree[0] = viewSubtreeLen; memcpy(vp->viewSubtree + 1, viewSubtree, viewSubtreeLen * sizeof(oid)); vp->viewSubtreeLen = viewSubtreeLen + 1; lp = viewList; while (lp) { cmp = memcmp(lp->viewName, vp->viewName, glen + 1); cmp2 = snmp_oid_compare(lp->viewSubtree, lp->viewSubtreeLen, vp->viewSubtree, vp->viewSubtreeLen); if (cmp == 0 && cmp2 > 0) break; if (cmp > 0) break; op = lp; lp = lp->next; } vp->next = lp; if (op) op->next = vp; else viewList = vp; return vp;}voidvacm_destroyViewEntry(const char *viewName, oid * viewSubtree, size_t viewSubtreeLen){ struct vacm_viewEntry *vp, *lastvp = NULL; if (viewList && !strcmp(viewList->viewName + 1, viewName) && viewList->viewSubtreeLen == viewSubtreeLen && !memcmp((char *) viewList->viewSubtree, (char *) viewSubtree, viewSubtreeLen * sizeof(oid))) { vp = viewList; viewList = viewList->next; } else { for (vp = viewList; vp; vp = vp->next) { if (!strcmp(vp->viewName + 1, viewName) && vp->viewSubtreeLen == viewSubtreeLen && !memcmp((char *) vp->viewSubtree, (char *) viewSubtree, viewSubtreeLen * sizeof(oid))) break; lastvp = vp; } if (!vp) return; lastvp->next = vp->next; } if (vp->reserved) free(vp->reserved); free(vp); return;}voidvacm_destroyAllViewEntries(void){ struct vacm_viewEntry *vp; while ((vp = viewList)) { viewList = vp->next; if (vp->reserved) free(vp->reserved); free(vp); }}struct vacm_groupEntry *vacm_getGroupEntry(int securityModel, const char *securityName){ struct vacm_groupEntry *vp; char secname[VACMSTRINGLEN]; int glen; glen = (int) strlen(securityName); if (glen < 0 || glen >= VACM_MAX_STRING) return NULL; secname[0] = glen; strcpy(secname + 1, securityName); for (vp = groupList; vp; vp = vp->next) { if ((securityModel == vp->securityModel || vp->securityModel == SNMP_SEC_MODEL_ANY) && !memcmp(vp->securityName, secname, glen + 1)) return vp; } return NULL;}voidvacm_scanGroupInit(void){ groupScanPtr = groupList;}struct vacm_groupEntry *vacm_scanGroupNext(void){ struct vacm_groupEntry *returnval = groupScanPtr; if (groupScanPtr) groupScanPtr = groupScanPtr->next; return returnval;}struct vacm_groupEntry *vacm_createGroupEntry(int securityModel, const char *securityName){ struct vacm_groupEntry *gp, *lg, *og; int cmp, glen; glen = (int) strlen(securityName); if (glen < 0 || glen >= VACM_MAX_STRING) return NULL; gp = (struct vacm_groupEntry *) calloc(1, sizeof(struct vacm_groupEntry)); if (gp == NULL) return NULL; gp->reserved = (struct vacm_groupEntry *) calloc(1, sizeof(struct vacm_groupEntry)); if (gp->reserved == NULL) { free(gp); return NULL; } gp->securityModel = securityModel; gp->securityName[0] = glen; strcpy(gp->securityName + 1, securityName); lg = groupList; og = NULL; while (lg) { if (lg->securityModel > securityModel) break; if (lg->securityModel == securityModel && (cmp = memcmp(lg->securityName, gp->securityName, glen + 1)) > 0) break; /* * if (lg->securityModel == securityModel && cmp == 0) abort(); */ og = lg; lg = lg->next; } gp->next = lg; if (og == NULL) groupList = gp; else og->next = gp; return gp;}voidvacm_destroyGroupEntry(int securityModel, const char *securityName){ struct vacm_groupEntry *vp, *lastvp = NULL; if (groupList && groupList->securityModel == securityModel && !strcmp(groupList->securityName + 1, securityName)) { vp = groupList; groupList = groupList->next; } else { for (vp = groupList; vp; vp = vp->next) { if (vp->securityModel == securityModel && !strcmp(vp->securityName + 1, securityName)) break; lastvp = vp; } if (!vp) return; lastvp->next = vp->next; } if (vp->reserved) free(vp->reserved); free(vp); return;}voidvacm_destroyAllGroupEntries(void){ struct vacm_groupEntry *gp; while ((gp = groupList)) { groupList = gp->next; if (gp->reserved) free(gp->reserved); free(gp); }}struct vacm_accessEntry *vacm_getAccessEntry(const char *groupName, const char *contextPrefix, int securityModel, int securityLevel){ struct vacm_accessEntry *vp; char group[VACMSTRINGLEN]; char context[VACMSTRINGLEN]; int glen, clen; glen = (int) strlen(groupName); if (glen < 0 || glen >= VACM_MAX_STRING) return NULL; clen = (int) strlen(contextPrefix); if (clen < 0 || clen >= VACM_MAX_STRING) return NULL; group[0] = glen; strcpy(group + 1, groupName); context[0] = clen; strcpy(context + 1, contextPrefix); for (vp = accessList; vp; vp = vp->next) { if ((securityModel == vp->securityModel || vp->securityModel == SNMP_SEC_MODEL_ANY) && securityLevel >= vp->securityLevel && !memcmp(vp->groupName, group, glen + 1) && ((vp->contextMatch == CONTEXT_MATCH_EXACT && clen == vp->contextPrefix[0] && (memcmp(vp->contextPrefix, context, clen + 1) == 0)) || (vp->contextMatch == CONTEXT_MATCH_PREFIX && clen >= vp->contextPrefix[0] && (memcmp(vp->contextPrefix + 1, context + 1, vp->contextPrefix[0]) == 0)))) return vp; } return NULL;}voidvacm_scanAccessInit(void){ accessScanPtr = accessList;}struct vacm_accessEntry *vacm_scanAccessNext(void){ struct vacm_accessEntry *returnval = accessScanPtr; if (accessScanPtr) accessScanPtr = accessScanPtr->next; return returnval;}struct vacm_accessEntry *vacm_createAccessEntry(const char *groupName, const char *contextPrefix, int securityModel, int securityLevel){ struct vacm_accessEntry *vp, *lp, *op = NULL; int cmp, glen, clen; glen = (int) strlen(groupName); if (glen < 0 || glen >= VACM_MAX_STRING) return NULL; clen = (int) strlen(contextPrefix); if (clen < 0 || clen >= VACM_MAX_STRING) return NULL; vp = (struct vacm_accessEntry *) calloc(1, sizeof(struct vacm_accessEntry)); if (vp == NULL) return NULL; vp->reserved = (struct vacm_accessEntry *) calloc(1, sizeof(struct vacm_accessEntry)); if (vp->reserved == NULL) { free(vp); return NULL; } vp->securityModel = securityModel; vp->securityLevel = securityLevel; vp->groupName[0] = glen; strcpy(vp->groupName + 1, groupName); vp->contextPrefix[0] = clen; strcpy(vp->contextPrefix + 1, contextPrefix); lp = accessList; while (lp) { cmp = memcmp(lp->groupName, vp->groupName, glen + 1); if (cmp > 0) break; if (cmp < 0) goto next; cmp = memcmp(lp->contextPrefix, vp->contextPrefix, clen + 1); if (cmp > 0) break; if (cmp < 0) goto next; if (lp->securityModel > securityModel) break; if (lp->securityModel < securityModel) goto next; if (lp->securityLevel > securityLevel) break; next: op = lp; lp = lp->next; } vp->next = lp; if (op == NULL) accessList = vp; else op->next = vp; return vp;}voidvacm_destroyAccessEntry(const char *groupName, const char *contextPrefix, int securityModel, int securityLevel){ struct vacm_accessEntry *vp, *lastvp = NULL; if (accessList && accessList->securityModel == securityModel && accessList->securityModel == securityModel && !strcmp(accessList->groupName + 1, groupName) && !strcmp(accessList->contextPrefix + 1, contextPrefix)) { vp = accessList; accessList = accessList->next; } else { for (vp = accessList; vp; vp = vp->next) { if (vp->securityModel == securityModel && vp->securityLevel == securityLevel && !strcmp(vp->groupName + 1, groupName) && !strcmp(vp->contextPrefix + 1, contextPrefix)) break; lastvp = vp; } if (!vp) return; lastvp->next = vp->next; } if (vp->reserved) free(vp->reserved); free(vp); return;}voidvacm_destroyAllAccessEntries(void){ struct vacm_accessEntry *ap; while ((ap = accessList)) { accessList = ap->next; if (ap->reserved) free(ap->reserved); free(ap); }}intstore_vacm(int majorID, int minorID, void *serverarg, void *clientarg){ /* * figure out our application name */ char *appname = (char *) clientarg; if (appname == NULL) { appname = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPTYPE); } /* * save the VACM MIB */ vacm_save("vacm", appname); return SNMPERR_SUCCESS;}/* * returns 1 if vacm has *any* configuration entries in it (regardless * of weather or not there is enough to make a decision based on it), * else return 0 */intvacm_is_configured(void){ if (viewList == NULL && accessList == NULL && groupList == NULL) { return 0; } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -