From 92b969e2391936cbb66a8f547a77f94f05430419 Mon Sep 17 00:00:00 2001 From: Thomas Guyot-Sionnest Date: Sat, 15 Mar 2008 22:42:01 +0000 Subject: parse_ini now reads the default section if the request one can't be found. All tests should return ok now. git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1950 f882894a-f735-0410-b71e-b25c423dba1c --- lib/parse_ini.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'lib/parse_ini.c') diff --git a/lib/parse_ini.c b/lib/parse_ini.c index 3f2aa3b8..70da7f14 100644 --- a/lib/parse_ini.c +++ b/lib/parse_ini.c @@ -42,7 +42,7 @@ typedef struct { #define GOBBLE_TO(f, c, n) do { (c)=fgetc((f)); } while((c)!=EOF && (c)!=(n)) /* internal function that returns the constructed defaults options */ -static np_arg_list* read_defaults(FILE *f, const char *stanza); +static int read_defaults(FILE *f, const char *stanza, np_arg_list **opts); /* internal function that converts a single line into options format */ static int add_option(FILE *f, np_arg_list **optlst); @@ -90,7 +90,12 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){ inifile=fopen(i.file, "r"); } if(inifile==NULL) die(STATE_UNKNOWN, _("Config file error")); - defaults=read_defaults(inifile, i.stanza); + if(read_defaults(inifile, i.stanza, &defaults)==FALSE && strcmp(i.stanza, default_section) && inifile!=stdout) { /* FIXME: Shouldn't it be 'stdin' ??? */ + /* We got nothing, try the default section */ + rewind(inifile); + read_defaults(inifile, default_section, &defaults); + } + free(i.file); if(inifile!=stdout) fclose(inifile); /* FIXME: Shouldn't it be 'stdin' ??? */ } @@ -104,9 +109,8 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){ * be extra careful about user-supplied input (i.e. avoiding possible * format string vulnerabilities, etc) */ -static np_arg_list* read_defaults(FILE *f, const char *stanza){ - int c; - np_arg_list *opts=NULL; +static int read_defaults(FILE *f, const char *stanza, np_arg_list **opts){ + int c, status=FALSE; size_t i, stanza_len; enum { NOSTANZA, WRONGSTANZA, RIGHTSTANZA } stanzastate=NOSTANZA; @@ -158,15 +162,16 @@ static np_arg_list* read_defaults(FILE *f, const char *stanza){ /* okay, this is where we start taking the config */ case RIGHTSTANZA: ungetc(c, f); - if(add_option(f, &opts)){ + if(add_option(f, opts)){ die(STATE_UNKNOWN, _("Config file error")); } + status=TRUE; break; } break; } } - return opts; + return status; } /* -- cgit v1.2.3