aboutsummaryrefslogtreecommitdiff
path: root/lib/parse_ini.c
diff options
context:
space:
mode:
authorGravatar Thomas Guyot-Sionnest <dermoth@users.sourceforge.net> 2008-03-15 22:42:01 +0000
committerGravatar Thomas Guyot-Sionnest <dermoth@users.sourceforge.net> 2008-03-15 22:42:01 +0000
commit92b969e2391936cbb66a8f547a77f94f05430419 (patch)
tree3526b7993dc5b7061061e2ba5ceb6bfc934d2888 /lib/parse_ini.c
parent252d9a78ccaf08a175bb4fcbf91145761d47780d (diff)
downloadmonitoring-plugins-92b969e2391936cbb66a8f547a77f94f05430419.tar.gz
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
Diffstat (limited to 'lib/parse_ini.c')
-rw-r--r--lib/parse_ini.c19
1 files changed, 12 insertions, 7 deletions
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;
}
/*