diff options
Diffstat (limited to 'lib/parse_ini.c')
-rw-r--r-- | lib/parse_ini.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/lib/parse_ini.c b/lib/parse_ini.c index b33ce089..2e47e06d 100644 --- a/lib/parse_ini.c +++ b/lib/parse_ini.c | |||
@@ -48,7 +48,7 @@ static char *default_ini_file_names[] = { | |||
48 | static char *default_ini_path_names[] = { | 48 | static char *default_ini_path_names[] = { |
49 | "/usr/local/etc/monitoring-plugins.ini", | 49 | "/usr/local/etc/monitoring-plugins.ini", |
50 | "/etc/monitoring-plugins.ini", | 50 | "/etc/monitoring-plugins.ini", |
51 | /* Deprecated path names (for backward compatibility): */ | 51 | /* deprecated path names (for backward compatibility): */ |
52 | "/etc/nagios/plugins.ini", | 52 | "/etc/nagios/plugins.ini", |
53 | "/usr/local/nagios/etc/plugins.ini", | 53 | "/usr/local/nagios/etc/plugins.ini", |
54 | "/usr/local/etc/nagios/plugins.ini", | 54 | "/usr/local/etc/nagios/plugins.ini", |
@@ -71,9 +71,10 @@ static int add_option(FILE *f, np_arg_list **optlst); | |||
71 | /* internal function to find default file */ | 71 | /* internal function to find default file */ |
72 | static char *default_file(void); | 72 | static char *default_file(void); |
73 | 73 | ||
74 | /* parse_locator decomposes a string of the form | 74 | /* |
75 | * Parse_locator decomposes a string of the form | ||
75 | * [stanza][@filename] | 76 | * [stanza][@filename] |
76 | * into its seperate parts | 77 | * into its seperate parts. |
77 | */ | 78 | */ |
78 | static void | 79 | static void |
79 | parse_locator(const char *locator, const char *def_stanza, np_ini_info *i) | 80 | parse_locator(const char *locator, const char *def_stanza, np_ini_info *i) |
@@ -105,7 +106,9 @@ parse_locator(const char *locator, const char *def_stanza, np_ini_info *i) | |||
105 | _("Cannot find config file in any standard location.\n")); | 106 | _("Cannot find config file in any standard location.\n")); |
106 | } | 107 | } |
107 | 108 | ||
108 | /* this is the externally visible function used by extra_opts */ | 109 | /* |
110 | * This is the externally visible function used by extra_opts. | ||
111 | */ | ||
109 | np_arg_list * | 112 | np_arg_list * |
110 | np_get_defaults(const char *locator, const char *default_section) | 113 | np_get_defaults(const char *locator, const char *default_section) |
111 | { | 114 | { |
@@ -133,11 +136,12 @@ np_get_defaults(const char *locator, const char *default_section) | |||
133 | return defaults; | 136 | return defaults; |
134 | } | 137 | } |
135 | 138 | ||
136 | /* read_defaults is where the meat of the parsing takes place. | 139 | /* |
140 | * The read_defaults() function is where the meat of the parsing takes place. | ||
137 | * | 141 | * |
138 | * note that this may be called by a setuid binary, so we need to | 142 | * Note that this may be called by a setuid binary, so we need to |
139 | * be extra careful about user-supplied input (i.e. avoiding possible | 143 | * be extra careful about user-supplied input (i.e. avoiding possible |
140 | * format string vulnerabilities, etc) | 144 | * format string vulnerabilities, etc). |
141 | */ | 145 | */ |
142 | static int | 146 | static int |
143 | read_defaults(FILE *f, const char *stanza, np_arg_list **opts) | 147 | read_defaults(FILE *f, const char *stanza, np_arg_list **opts) |
@@ -148,7 +152,7 @@ read_defaults(FILE *f, const char *stanza, np_arg_list **opts) | |||
148 | 152 | ||
149 | stanza_len = strlen(stanza); | 153 | stanza_len = strlen(stanza); |
150 | 154 | ||
151 | /* our little stanza-parsing state machine. */ | 155 | /* our little stanza-parsing state machine */ |
152 | while ((c = fgetc(f)) != EOF) { | 156 | while ((c = fgetc(f)) != EOF) { |
153 | /* gobble up leading whitespace */ | 157 | /* gobble up leading whitespace */ |
154 | if (isspace(c)) | 158 | if (isspace(c)) |
@@ -159,12 +163,12 @@ read_defaults(FILE *f, const char *stanza, np_arg_list **opts) | |||
159 | case '#': | 163 | case '#': |
160 | GOBBLE_TO(f, c, '\n'); | 164 | GOBBLE_TO(f, c, '\n'); |
161 | break; | 165 | break; |
162 | /* start of a stanza. check to see if it matches */ | 166 | /* start of a stanza, check to see if it matches */ |
163 | case '[': | 167 | case '[': |
164 | stanzastate = WRONGSTANZA; | 168 | stanzastate = WRONGSTANZA; |
165 | for (i = 0; i < stanza_len; i++) { | 169 | for (i = 0; i < stanza_len; i++) { |
166 | c = fgetc(f); | 170 | c = fgetc(f); |
167 | /* Strip leading whitespace */ | 171 | /* strip leading whitespace */ |
168 | if (i == 0) | 172 | if (i == 0) |
169 | for (; isspace(c); c = fgetc(f)) | 173 | for (; isspace(c); c = fgetc(f)) |
170 | continue; | 174 | continue; |
@@ -177,7 +181,7 @@ read_defaults(FILE *f, const char *stanza, np_arg_list **opts) | |||
177 | /* if it matched up to here and the next char is ']'... */ | 181 | /* if it matched up to here and the next char is ']'... */ |
178 | if (i == stanza_len) { | 182 | if (i == stanza_len) { |
179 | c = fgetc(f); | 183 | c = fgetc(f); |
180 | /* Strip trailing whitespace */ | 184 | /* strip trailing whitespace */ |
181 | for (; isspace(c); c = fgetc(f)) | 185 | for (; isspace(c); c = fgetc(f)) |
182 | continue; | 186 | continue; |
183 | if (c == ']') | 187 | if (c == ']') |
@@ -214,9 +218,9 @@ read_defaults(FILE *f, const char *stanza, np_arg_list **opts) | |||
214 | } | 218 | } |
215 | 219 | ||
216 | /* | 220 | /* |
217 | * read one line of input in the format | 221 | * Read one line of input in the format |
218 | * ^option[[:space:]]*(=[[:space:]]*value)? | 222 | * ^option[[:space:]]*(=[[:space:]]*value)? |
219 | * and creates it as a cmdline argument | 223 | * and create it as a cmdline argument |
220 | * --option[=value] | 224 | * --option[=value] |
221 | * appending it to the linked list optbuf. | 225 | * appending it to the linked list optbuf. |
222 | */ | 226 | */ |
@@ -250,7 +254,7 @@ add_option(FILE *f, np_arg_list **optlst) | |||
250 | } | 254 | } |
251 | } | 255 | } |
252 | lineend = &linebuf[read_pos]; | 256 | lineend = &linebuf[read_pos]; |
253 | /* all that to read one line. isn't C fun? :) now comes the parsing :/ */ | 257 | /* all that to read one line, isn't C fun? :) now comes the parsing :/ */ |
254 | 258 | ||
255 | /* skip leading whitespace */ | 259 | /* skip leading whitespace */ |
256 | for (optptr = linebuf; optptr < lineend && isspace(*optptr); optptr++) | 260 | for (optptr = linebuf; optptr < lineend && isspace(*optptr); optptr++) |
@@ -276,7 +280,7 @@ add_option(FILE *f, np_arg_list **optlst) | |||
276 | for (valend = valptr; valend < lineend; valend++) | 280 | for (valend = valptr; valend < lineend; valend++) |
277 | continue; | 281 | continue; |
278 | --valend; | 282 | --valend; |
279 | /* Finally trim off trailing spaces */ | 283 | /* finally trim off trailing spaces */ |
280 | for (; isspace(*valend); valend--) | 284 | for (; isspace(*valend); valend--) |
281 | continue; | 285 | continue; |
282 | /* calculate the length of "--foo" */ | 286 | /* calculate the length of "--foo" */ |
@@ -297,7 +301,7 @@ add_option(FILE *f, np_arg_list **optlst) | |||
297 | equals = 1; | 301 | equals = 1; |
298 | cfg_len += 1; | 302 | cfg_len += 1; |
299 | } | 303 | } |
300 | /* A line with no equal sign isn't valid */ | 304 | /* a line with no equal sign isn't valid */ |
301 | if (equals == 0) | 305 | if (equals == 0) |
302 | die(STATE_UNKNOWN, "%s\n", _("Config file error")); | 306 | die(STATE_UNKNOWN, "%s\n", _("Config file error")); |
303 | 307 | ||