netsnmp_variable_list * nsVacmAccessTable_get_first_data_point(void **my_loop_context, void **my_data_context, netsnmp_variable_list *put_index_data, netsnmp_iterator_info *mydata) { vacm_scanAccessInit(); *my_loop_context = vacm_scanAccessNext(); nsViewIdx = 0; return nsVacmAccessTable_get_next_data_point(my_loop_context, my_data_context, put_index_data, mydata); }
netsnmp_variable_list * nsVacmAccessTable_get_next_data_point(void **my_loop_context, void **my_data_context, netsnmp_variable_list *put_index_data, netsnmp_iterator_info *mydata) { struct vacm_accessEntry *entry = (struct vacm_accessEntry *) *my_loop_context; netsnmp_variable_list *idx; int len; char *cp; newView: idx = put_index_data; if ( nsViewIdx == VACM_MAX_VIEWS ) { entry = vacm_scanAccessNext(); nsViewIdx = 0; } if (entry) { len = entry->groupName[0]; snmp_set_var_value(idx, (u_char *)entry->groupName+1, len); idx = idx->next_variable; len = entry->contextPrefix[0]; snmp_set_var_value(idx, (u_char *)entry->contextPrefix+1, len); idx = idx->next_variable; snmp_set_var_value(idx, (u_char *)&entry->securityModel, sizeof(entry->securityModel)); idx = idx->next_variable; snmp_set_var_value(idx, (u_char *)&entry->securityLevel, sizeof(entry->securityLevel)); /* * Find the next valid authType view - skipping unused entries */ idx = idx->next_variable; for (; nsViewIdx < VACM_MAX_VIEWS; nsViewIdx++) { if ( entry->views[ nsViewIdx ][0] ) break; } if ( nsViewIdx == VACM_MAX_VIEWS ) goto newView; cp = se_find_label_in_slist(VACM_VIEW_ENUM_NAME, nsViewIdx++); DEBUGMSGTL(("nsVacm", "nextDP %s:%s (%d)\n", entry->groupName+1, cp, nsViewIdx-1)); snmp_set_var_value(idx, (u_char *)cp, strlen(cp)); idx = idx->next_variable; *my_data_context = (void *) entry; *my_loop_context = (void *) entry; return put_index_data; } else { return NULL; } }
u_char *var_vacm_access(struct variable *vp, oid *name, int *length, int exact, int *var_len, WriteMethod **write_method) { struct vacm_accessEntry *gp; int secmodel; int seclevel; char groupName[32]; char contextPrefix[32]; oid *op; int len; char *cp; int cmp; write_method = NULL; if (memcmp(name, vp->name, sizeof(oid)*vp->namelen) != 0) { memcpy(name, vp->name, sizeof(oid)*vp->namelen); *length = vp->namelen; } if (exact) { if (*length < 15) return NULL; op = name+11; len = *op++; cp = groupName; while (len-- > 0) { *cp++ = *op++; } *cp = 0; len = *op++; cp = contextPrefix; while (len-- > 0) { *cp++ = *op++; } *cp = 0; secmodel = *op++; seclevel = *op++; if (op != name + *length) { return NULL; } gp = vacm_getAccessEntry(groupName, contextPrefix, secmodel, seclevel); } else { secmodel = seclevel = 0; groupName[0] = 0; contextPrefix[0] = 0; op = name+11; if (op >= name + *length) { } else { len = *op; cp = groupName; while (len-- >= 0) { *cp++ = *op++; } *cp = 0; } if (op >= name + *length) { } else { len = *op; cp = contextPrefix; while (len-- >= 0) { *cp++ = *op++; } *cp = 0; } if (op >= name + *length) { } else { secmodel = *op++; } if (op >= name + *length) { } else { seclevel = *op++; } vacm_scanAccessInit(); while ((gp = vacm_scanAccessNext()) != NULL) { cmp = strcmp(gp->groupName, groupName); if (cmp > 0) break; if (cmp < 0) continue; cmp = strcmp(gp->contextPrefix, contextPrefix); if (cmp > 0) break; if (cmp < 0) continue; if (gp->securityModel > secmodel) break; if (gp->securityModel < secmodel) continue; if (gp->securityLevel > seclevel) break; } if (gp) { *length = 11; cp = gp->groupName; do { name[(*length)++] = *cp++; } while (*cp); cp = gp->contextPrefix; do { name[(*length)++] = *cp++; } while (*cp); name[(*length)++] = gp->securityModel; name[(*length)++] = gp->securityLevel; } } if (!gp) return NULL; *var_len =sizeof(long_return); switch (vp->magic) { case ACCESSMATCH: long_return = gp->contextMatch; return (u_char *)&long_return; case ACCESSLEVEL: long_return = gp->securityLevel; return (u_char *)&long_return; case ACCESSMODEL: long_return = gp->securityModel; return (u_char *)&long_return; case ACCESSPREFIX: *var_len = *gp->contextPrefix; return (u_char *)&gp->contextPrefix[1]; case ACCESSREAD: *var_len = strlen(gp->readView); return (u_char *)gp->readView; case ACCESSWRITE: *var_len = strlen(gp->writeView); return (u_char *)gp->writeView; case ACCESSNOTIFY: *var_len = strlen(gp->notifyView); return (u_char *)gp->notifyView; case ACCESSSTORAGE: long_return = gp->storageType; return (u_char *)&long_return; case ACCESSSTATUS: long_return = gp->status; return (u_char *)&long_return; } return NULL; }