Make sure that "PIDFile" option cannot be set when command-line option "-P" was used...
authorThomas D <whissi@whissi.de>
Wed, 12 Feb 2014 14:32:15 +0000 (15:32 +0100)
committerThomas D <whissi@whissi.de>
Wed, 12 Feb 2014 15:31:46 +0000 (16:31 +0100)
The "PIDFile" value from command-line option "-P", which should take
precedence over any "PIDFile" value from configuration files, could be
overwritten if a configuration file contained the "PIDFile" option.

We introduced a new global variable "pidfile_from_cli" which will be set
to 1 when the command-line option "-P" was detected and the
"global_option_set" function will only set the "PIDFile" option if
"pidfile_from_cli" is 0.

src/collectd.c
src/collectd.h
src/configfile.c

index d259753..6c37c61 100644 (file)
@@ -41,6 +41,7 @@
  */
 char hostname_g[DATA_MAX_NAME_LEN];
 cdtime_t interval_g;
+int  pidfile_from_cli = 0;
 int  timeout_g;
 #if HAVE_LIBKSTAT
 kstat_ctl_t *kc;
@@ -439,6 +440,7 @@ int main (int argc, char **argv)
 #if COLLECT_DAEMON
                        case 'P':
                                global_option_set ("PIDFile", optarg);
+                               pidfile_from_cli = 1;
                                break;
                        case 'f':
                                daemonize = 0;
index 969aeda..558dc7a 100644 (file)
@@ -296,6 +296,7 @@ typedef uint64_t cdtime_t;
 
 extern char     hostname_g[];
 extern cdtime_t interval_g;
+extern int      pidfile_from_cli;
 extern int      timeout_g;
 
 #endif /* COLLECTD_H */
index 0e54f26..c5d3e36 100644 (file)
@@ -891,6 +891,13 @@ int global_option_set (const char *option, const char *value)
        if (i >= cf_global_options_num)
                return (-1);
 
+       if (strcasecmp (option, "PIDFile") == 0 && pidfile_from_cli == 1)
+       {
+               DEBUG ("Configfile: Ignoring `PIDFILE' option because "
+                       "command-line option `-P' take precedence.");
+               return (0);
+       }
+
        sfree (cf_global_options[i].value);
 
        if (value != NULL)