/** * release a netsnmp_file structure * * @retval see close() man page */ int netsnmp_file_release(netsnmp_file * filei) { int rc = 0; if (NULL == filei) return -1; if ((filei->fd > 0) && NS_FI_AUTOCLOSE(filei->ns_flags)) rc = close(filei->fd); if (NULL != filei->name) free(filei->name); /* no point in SNMP_FREE */ if (NULL != filei->extras) netsnmp_free_all_list_data(filei->extras); if (NULL != filei->stats) free(filei->stats); SNMP_FREE(filei); return rc; }
/** * process text file, reading into extras */ netsnmp_container * netsnmp_file_text_parse(netsnmp_file *f, netsnmp_container *cin, int parse_mode, u_int flags, void *context) { netsnmp_container *c = cin; FILE *fin; int rc; if (NULL == f) return NULL; if ((NULL == c) && (!(flags & PM_FLAG_NO_CONTAINER))) { c = netsnmp_container_find("text_parse:binary_array"); if (NULL == c) return NULL; } rc = netsnmp_file_open(f); if (rc < 0) { /** error already logged */ if ((NULL !=c) && (c != cin)) CONTAINER_FREE(c); return NULL; } /* * get a stream from the file descriptor. This DOES NOT rewind the * file (if fd was previously opened). */ fin = fdopen(f->fd, "r"); if (NULL == fin) { if (NS_FI_AUTOCLOSE(f->ns_flags)) close(f->fd); if ((NULL !=c) && (c != cin)) CONTAINER_FREE(c); return NULL; } switch (parse_mode) { case PM_SAVE_EVERYTHING: _pm_save_everything(fin, c, flags); break; case PM_INDEX_STRING_STRING: _pm_save_index_string_string(fin, c, flags); break; case PM_USER_FUNCTION: if (NULL != context) _pm_user_function(fin, c, (netsnmp_line_process_info*)context, flags); break; default: snmp_log(LOG_ERR, "unknown parse mode %d\n", parse_mode); break; } /* * close the stream, which will have the side effect of also closing * the file descriptor, so we need to reset it. */ fclose(fin); f->fd = -1; return c; }