vacm.c

来自「eCos操作系统源码」· C语言 代码 · 共 558 行 · 第 1/2 页

C
558
字号
    if (vp->reserved)	free(vp->reserved);    free(vp);    return;}void vacm_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;}void vacm_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)	    && !memcmp(vp->contextPrefix, context, clen+1))	  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;}void vacm_destroyAllAccessEntries (void){    struct vacm_accessEntry *ap;    while ((ap = accessList)) {	accessList = ap->next;	if (ap->reserved) free(ap->reserved);	free(ap);    }}/* 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 */int vacm_is_configured(void) {    if (viewList == NULL && accessList == NULL && groupList == NULL)        return 0;    return 1;}#endif /* CYGPKG_SNMPAGENT_V3_SUPPORT */

⌨️ 快捷键说明

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