Many build fixes that turned up with GCC 4.6.
[collectd.git] / src / collectd.c
index 548a8fd..277d3b0 100644 (file)
  */
 char hostname_g[DATA_MAX_NAME_LEN];
 int  interval_g;
+int  timeout_g;
 #if HAVE_LIBKSTAT
 kstat_ctl_t *kc;
 #endif /* HAVE_LIBKSTAT */
 
 static int loop = 0;
 
-static void *do_flush (void *arg)
+static void *do_flush (void __attribute__((unused)) *arg)
 {
        INFO ("Flushing all data.");
        plugin_flush (NULL, -1, NULL);
@@ -56,17 +57,17 @@ static void *do_flush (void *arg)
        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;
@@ -102,9 +103,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));
@@ -150,6 +149,18 @@ static int init_global_variables (void)
        }
        DEBUG ("interval_g = %i;", interval_g);
 
+       str = global_option_get ("Timeout");
+       if (str == NULL)
+               str = "2";
+       timeout_g = atoi (str);
+       if (timeout_g <= 1)
+       {
+               fprintf (stderr, "Cannot set the timeout to a correct value.\n"
+                               "Please check your settings.\n");
+               return (-1);
+       }
+       DEBUG ("timeout_g = %i;", timeout_g);
+
        if (init_hostname () != 0)
                return (-1);
        DEBUG ("hostname_g = %s;", hostname_g);
@@ -261,9 +272,10 @@ static void exit_usage (int status)
 #endif
                        "    -h              Display help (this message)\n"
                        "\nBuiltin defaults:\n"
-                       "  Config-File       "CONFIGFILE"\n"
-                       "  PID-File          "PIDFILE"\n"
-                       "  Data-Directory    "PKGLOCALSTATEDIR"\n"
+                       "  Config file       "CONFIGFILE"\n"
+                       "  PID file          "PIDFILE"\n"
+                       "  Plugin directory  "PLUGINDIR"\n"
+                       "  Data directory    "PKGLOCALSTATEDIR"\n"
                        "\n"PACKAGE" "VERSION", http://collectd.org/\n"
                        "by Florian octo Forster <octo@verplant.org>\n"
                        "for contributions see `AUTHORS'\n");
@@ -301,6 +313,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)
@@ -331,14 +344,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)