/** * open file and get stats */ netsnmp_file * netsnmp_file_new(const char *name, int fs_flags, mode_t mode, u_int ns_flags) { netsnmp_file *filei = netsnmp_file_fill(NULL, name, fs_flags, mode, 0); if (NULL == filei) return NULL; if (ns_flags & NETSNMP_FILE_STATS) { filei->stats = (struct stat*)calloc(1, sizeof(*(filei->stats))); if (NULL == filei->stats) DEBUGMSGT(("nsfile:new", "no memory for stats\n")); else if (stat(name, filei->stats) != 0) DEBUGMSGT(("nsfile:new", "error getting stats\n")); } if (ns_flags & NETSNMP_FILE_AUTO_OPEN) netsnmp_file_open(filei); return filei; }
/** * 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; }