/** stores data in a starsh tree to peristent storage. This function can be called to save all data in a stash tree to Net-SNMP's percent storage. Make sure you register a parsing function with the read_config system to re-incorperate your saved data into future trees. @param root the top of the stash to store. @param tokenname the file token name to save in (passing "snmpd" will save things into snmpd.conf). @param dumpfn A function which can dump the data stored at a particular node into a char buffer. @param curoid must be a pointer to a OID array of length MAX_OID_LEN. @param curoid_len must be 0 for the top level call. */ void netsnmp_oid_stash_store(netsnmp_oid_stash_node *root, const char *tokenname, NetSNMPStashDump *dumpfn, oid *curoid, size_t curoid_len) { char buf[SNMP_MAXBUF]; netsnmp_oid_stash_node *tmpp; char *cp; char *appname = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPTYPE); int i; if (!tokenname || !root || !curoid || !dumpfn) return; for (i = 0; i < (int)root->children_size; i++) { if (root->children[i]) { for (tmpp = root->children[i]; tmpp; tmpp = tmpp->next_sibling) { curoid[curoid_len] = tmpp->value; if (tmpp->thedata) { snprintf(buf, sizeof(buf), "%s ", tokenname); cp = read_config_save_objid(buf+strlen(buf), curoid, curoid_len+1); *cp++ = ' '; *cp = '\0'; if ((*dumpfn)(cp, sizeof(buf) - strlen(buf), tmpp->thedata, tmpp)) read_config_store(appname, buf); } netsnmp_oid_stash_store(tmpp, tokenname, dumpfn, curoid, curoid_len+1); } } } }
/* * vacm_save_view(): saves a view entry to the persistent cache */ void vacm_save_view(struct vacm_viewEntry *view, const char *token, const char *type) { char line[4096]; char *cptr; memset(line, 0, sizeof(line)); snprintf(line, sizeof(line), "%s%s %d %d %d ", token, "View", view->viewStatus, view->viewStorageType, view->viewType); line[ sizeof(line)-1 ] = 0; cptr = &line[strlen(line)]; /* the NULL */ cptr = read_config_save_octet_string(cptr, (u_char *) view->viewName + 1, view->viewName[0]); *cptr++ = ' '; cptr = read_config_save_objid(cptr, view->viewSubtree+1, view->viewSubtreeLen-1); *cptr++ = ' '; cptr = read_config_save_octet_string(cptr, (u_char *) view->viewMask, view->viewMaskLen); read_config_store(type, line); }
/* read_config_read_data(): reads data of a given type from a token(s) on a configuration line. Returns: character pointer to the next token in the configuration line. NULL if none left. NULL if an unknown type. */ char *read_config_store_data(int type, char *storeto, void *dataptr, size_t *len) { int *intp; u_char **charpp; oid **oidpp; if (dataptr == NULL || storeto == NULL) return NULL; switch(type) { case ASN_INTEGER: intp = (int *) dataptr; sprintf(storeto," %d", *intp); return (storeto + strlen(storeto)); case ASN_OCTET_STR: charpp = (u_char **) dataptr; return read_config_save_octet_string(storeto, *charpp, *len); case ASN_OBJECT_ID: oidpp = (oid **) dataptr; return read_config_save_objid(storeto, *oidpp, *len); default: DEBUGMSGTL(("read_config_store_data","Fail: Unknown type: %d", type)); return NULL; } return NULL; }