X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcollectd.c;h=bc69a3b7fc47d2279f63b0d148b210f525bcf825;hb=0d5c879672770e3b8a740727fb223a6febdeaa27;hp=a3f63b48007336bc48621fa366cbf90a96ccff4c;hpb=7a36927e0c5411c701d9e1bfd3f02a9c2f254d0f;p=collectd.git diff --git a/src/collectd.c b/src/collectd.c index a3f63b48..bc69a3b7 100644 --- a/src/collectd.c +++ b/src/collectd.c @@ -47,26 +47,26 @@ kstat_ctl_t *kc; static int loop = 0; -static void *do_flush (void *arg) +static void *do_flush (void __attribute__((unused)) *arg) { INFO ("Flushing all data."); - plugin_flush_all (-1); + plugin_flush (NULL, -1, NULL); INFO ("Finished flushing all data."); pthread_exit (NULL); return NULL; } -static void sig_int_handler (int signal) +static void sig_int_handler (int __attribute__((unused)) signal) { loop++; } -static void sig_term_handler (int signal) +static void sig_term_handler (int __attribute__((unused)) signal) { loop++; } -static void sig_usr1_handler (int signal) +static void sig_usr1_handler (int __attribute__((unused)) signal) { pthread_t thread; pthread_attr_t attr; @@ -90,8 +90,7 @@ static int init_hostname (void) str = global_option_get ("Hostname"); if (str != NULL) { - strncpy (hostname_g, str, sizeof (hostname_g)); - hostname_g[sizeof (hostname_g) - 1] = '\0'; + sstrncpy (hostname_g, str, sizeof (hostname_g)); return (0); } @@ -103,9 +102,7 @@ static int init_hostname (void) } str = global_option_get ("FQDNLookup"); - if ((strcasecmp ("false", str) == 0) - || (strcasecmp ("no", str) == 0) - || (strcasecmp ("off", str) == 0)) + if (IS_FALSE (str)) return (0); memset (&ai_hints, '\0', sizeof (ai_hints)); @@ -127,8 +124,7 @@ static int init_hostname (void) if (ai_ptr->ai_canonname == NULL) continue; - strncpy (hostname_g, ai_ptr->ai_canonname, sizeof (hostname_g)); - hostname_g[sizeof (hostname_g) - 1] = '\0'; + sstrncpy (hostname_g, ai_ptr->ai_canonname, sizeof (hostname_g)); break; } @@ -246,7 +242,7 @@ static void update_kstat (void) /* TODO * Remove all settings but `-f' and `-C' */ -static void exit_usage (void) +static void exit_usage (int status) { printf ("Usage: "PACKAGE" [OPTIONS]\n\n" @@ -255,6 +251,7 @@ static void exit_usage (void) " -C Configuration file.\n" " Default: "CONFIGFILE"\n" " -t Test config and exit.\n" + " -T Test plugin read and exit.\n" " -P PID-file.\n" " Default: "PIDFILE"\n" #if COLLECT_DAEMON @@ -268,8 +265,8 @@ static void exit_usage (void) "\n"PACKAGE" "VERSION", http://collectd.org/\n" "by Florian octo Forster \n" "for contributions see `AUTHORS'\n"); - exit (0); -} /* static void exit_usage (char *name) */ + exit (status); +} /* static void exit_usage (int status) */ static int do_init (void) { @@ -302,6 +299,7 @@ static int do_loop (void) { struct timeval tv_now; struct timeval tv_next; + struct timeval tv_wait; struct timespec ts_wait; while (loop == 0) @@ -332,14 +330,17 @@ static int do_loop (void) return (-1); } - if (timeval_sub_timespec (&tv_next, &tv_now, &ts_wait) != 0) + if (timeval_cmp (tv_next, tv_now, &tv_wait) <= 0) { - WARNING ("Not sleeping because " - "`timeval_sub_timespec' returned " - "non-zero!"); + WARNING ("Not sleeping because the next interval is " + "%i.%06i seconds in the past!", + (int) tv_wait.tv_sec, (int) tv_wait.tv_usec); continue; } + ts_wait.tv_sec = tv_wait.tv_sec; + ts_wait.tv_nsec = (long) (1000 * tv_wait.tv_usec); + while ((loop == 0) && (nanosleep (&ts_wait, &ts_wait) == -1)) { if (errno != EINTR) @@ -400,19 +401,21 @@ int main (int argc, char **argv) struct sigaction sig_pipe_action; char *configfile = CONFIGFILE; int test_config = 0; + int test_readall = 0; const char *basedir; #if COLLECT_DAEMON struct sigaction sig_chld_action; pid_t pid; int daemonize = 1; #endif + int exit_status = 0; /* read options */ while (1) { int c; - c = getopt (argc, argv, "htC:" + c = getopt (argc, argv, "htTC:" #if COLLECT_DAEMON "fP:" #endif @@ -429,6 +432,13 @@ int main (int argc, char **argv) case 't': test_config = 1; break; + case 'T': + test_readall = 1; + global_option_set ("ReadThreads", "-1"); +#if COLLECT_DAEMON + daemonize = 0; +#endif /* COLLECT_DAEMON */ + break; #if COLLECT_DAEMON case 'P': global_option_set ("PIDFile", optarg); @@ -438,11 +448,16 @@ int main (int argc, char **argv) break; #endif /* COLLECT_DAEMON */ case 'h': + exit_usage (0); + break; default: - exit_usage (); + exit_usage (1); } /* switch (c) */ } /* while (1) */ + if (optind < argc) + exit_usage (1); + /* * Read options from the config file, the environment and the command * line (in that order, with later options overwriting previous ones in @@ -577,10 +592,20 @@ int main (int argc, char **argv) * run the actual loops */ do_init (); - do_loop (); + + if (test_readall) + { + if (plugin_read_all_once () != 0) + exit_status = 1; + } + else + { + INFO ("Initialization complete, entering read-loop."); + do_loop (); + } /* close syslog */ - INFO ("Exiting normally"); + INFO ("Exiting normally."); do_shutdown (); @@ -589,5 +614,5 @@ int main (int argc, char **argv) pidfile_remove (); #endif /* COLLECT_DAEMON */ - return (0); + return (exit_status); } /* int main */