Code

Removed suffix of "-rate" and let user decide label via --label
[nagiosplug.git] / lib / parse_ini.c
index d5661c9e70755146e212d75ee7eb97a5638c242e..004396fe803378c18c501bb17743364b8cb6508b 100644 (file)
@@ -5,9 +5,6 @@
 * License: GPL
 * Copyright (c) 2007 Nagios Plugins Development Team
 * 
-* Last Modified: $Date$
-* 
-* 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
@@ -21,7 +18,6 @@
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
-* $Id$
 * 
 *****************************************************************************/
 
@@ -34,7 +30,6 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-/* TODO: die like N::P if section is not found */
 /* TODO: die like N::P if config file is not found */
 
 /* np_ini_info contains the result of parsing a "locator" in the format
@@ -80,10 +75,13 @@ static void parse_locator(const char *locator, const char *def_stanza, np_ini_in
        /* if there is no @file part */
        if(stanza_len==locator_len){
                i->file=default_file();
+               if(strcmp(i->file, "") == 0){
+                       die(STATE_UNKNOWN, _("Cannot find '%s' or '%s' in any standard location.\n"), NP_DEFAULT_INI_FILENAME1, NP_DEFAULT_INI_FILENAME2);
+               }
        } else {
                i->file=strdup(&(locator[stanza_len+1]));
        }
-       
+
        if(i->file==NULL || i->stanza==NULL){
                die(STATE_UNKNOWN, _("malloc() failed!\n"));
        }
@@ -104,17 +102,14 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){
                        inifile=fopen(i.file, "r");
                }
                if(inifile==NULL) die(STATE_UNKNOWN, _("Can't read config file"));
-               if(read_defaults(inifile, i.stanza, &defaults)==FALSE && strcmp(i.stanza, default_section) && inifile!=stdin) {
-                       /* We got nothing, try the default section */
-                       rewind(inifile);
-                       read_defaults(inifile, default_section, &defaults);
-               }
+               if(read_defaults(inifile, i.stanza, &defaults)==FALSE)
+                       die(STATE_UNKNOWN, _("Invalid section '%s' in config file '%s'\n"), i.stanza, i.file);
 
                free(i.file);
                if(inifile!=stdin) fclose(inifile);
        }
        free(i.stanza);
-       return defaults;        
+       return defaults;
 }
 
 /* read_defaults is where the meat of the parsing takes place.
@@ -136,6 +131,7 @@ static int read_defaults(FILE *f, const char *stanza, np_arg_list **opts){
                if(isspace(c)) continue;
                switch(c){
                        /* globble up coment lines */
+                       case ';':
                        case '#':
                                GOBBLE_TO(f, c, '\n');
                                break;
@@ -164,7 +160,7 @@ static int read_defaults(FILE *f, const char *stanza, np_arg_list **opts){
                        default:
                                switch(stanzastate){
                                        /* we never found the start of the first stanza, so
-                                        * we're dealing with a config error 
+                                        * we're dealing with a config error
                                         */
                                        case NOSTANZA:
                                                die(STATE_UNKNOWN, _("Config file error"));
@@ -236,10 +232,8 @@ static int add_option(FILE *f, np_arg_list **optlst){
        if(optptr==eqptr) die(STATE_UNKNOWN, _("Config file error\n"));
        /* continue from '=' to start of value or EOL */
        for(valptr=eqptr+1; valptr<lineend && isspace(*valptr); valptr++);
-       /* continue to the end of value (FIXME: watching for trailing comments) */
-       for(valend=valptr; valend<lineend; valend++)
-               /* FIXME: N::P doesn't allow comments here. Remove next line and parse_ini won't either */
-               if(*valend=='#') break;
+       /* continue to the end of value */
+       for(valend=valptr; valend<lineend; valend++);
        --valend;
        /* Finally trim off trailing spaces */
        for(valend; isspace(*valend); valend--);
@@ -308,7 +302,7 @@ static char* default_file(void){
        size_t len;
 
        if((np_env=getenv("NAGIOS_CONFIG_PATH"))!=NULL) {
-               /* skip ant starting colon... */
+               /* skip any starting colon... */
                while(*np_env==':') np_env++;
                /* Look for NP_DEFAULT_INI_FILENAME1 and NP_DEFAULT_INI_FILENAME2 in
                 * every PATHs defined (colon-separated).
@@ -344,8 +338,8 @@ static char* default_file(void){
                        default_file=strdup(temp_file);
        }
 
-       /* Return default_file or empty string (should return NULL if we want to
-        * die there...
+       /* Return default_file or empty string (should return NULL if we want plugins
+        * to die there)...
         */
        if(default_file)
                return default_file;
@@ -358,7 +352,7 @@ static char* default_file(void){
 static int test_file(const char* env, int len, const char* file, char* temp_file){
        struct stat sb;
 
-       /* test for len + filelen + '/' + '\0' */
+       /* test if len + filelen + '/' + '\0' fits in temp_file */
        if((len+strlen(file)+2)>MAX_INPUT_BUFFER)       return -1;
 
        strncpy(temp_file,env,len);