Merge branch 'collectd-4.5' into collectd-4.6
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 28 Feb 2009 09:35:04 +0000 (10:35 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 28 Feb 2009 09:35:04 +0000 (10:35 +0100)
1  2 
src/common.c
src/dns.c

diff --combined src/common.c
@@@ -18,8 -18,6 +18,8 @@@
   * Authors:
   *   Florian octo Forster <octo at verplant.org>
   *   Niki W. Waibel <niki.waibel@gmx.net>
 + *   Sebastian Harl <sh at tokkee.org>
 + *   Michał Mirosław <mirq-linux at rere.qmqm.pl>
  **/
  
  #if HAVE_CONFIG_H
@@@ -79,21 -77,15 +79,21 @@@ int ssnprintf (char *dest, size_t n, co
  char *sstrdup (const char *s)
  {
        char *r;
 +      size_t sz;
  
        if (s == NULL)
                return (NULL);
  
 -      if((r = strdup (s)) == NULL)
 +      /* Do not use `strdup' here, because it's not specified in POSIX. It's
 +       * ``only'' an XSI extension. */
 +      sz = strlen (s) + 1;
 +      r = (char *) malloc (sizeof (char) * sz);
 +      if (r == NULL)
        {
 -              ERROR ("Not enough memory.");
 +              ERROR ("sstrdup: Out of memory.");
                exit (3);
        }
 +      memcpy (r, s, sizeof (char) * sz);
  
        return (r);
  } /* char *sstrdup */
@@@ -349,56 -341,28 +349,56 @@@ int escape_slashes (char *buf, int buf_
        return (0);
  } /* int escape_slashes */
  
 -int timeval_sub_timespec (struct timeval *tv0, struct timeval *tv1, struct timespec *ret)
 +int timeval_cmp (struct timeval tv0, struct timeval tv1, struct timeval *delta)
  {
 -      if ((tv0 == NULL) || (tv1 == NULL) || (ret == NULL))
 -              return (-2);
 +      struct timeval *larger;
 +      struct timeval *smaller;
  
 -      if ((tv0->tv_sec < tv1->tv_sec)
 -                      || ((tv0->tv_sec == tv1->tv_sec) && (tv0->tv_usec < tv1->tv_usec)))
 -              return (-1);
 +      int status;
  
 -      ret->tv_sec  = tv0->tv_sec - tv1->tv_sec;
 -      ret->tv_nsec = 1000 * ((long) (tv0->tv_usec - tv1->tv_usec));
 +      NORMALIZE_TIMEVAL (tv0);
 +      NORMALIZE_TIMEVAL (tv1);
  
 -      if (ret->tv_nsec < 0)
 +      if ((tv0.tv_sec == tv1.tv_sec) && (tv0.tv_usec == tv1.tv_usec))
        {
 -              assert (ret->tv_sec > 0);
 +              if (delta != NULL) {
 +                      delta->tv_sec  = 0;
 +                      delta->tv_usec = 0;
 +              }
 +              return (0);
 +      }
  
 -              ret->tv_nsec += 1000000000;
 -              ret->tv_sec  -= 1;
 +      if ((tv0.tv_sec < tv1.tv_sec)
 +                      || ((tv0.tv_sec == tv1.tv_sec) && (tv0.tv_usec < tv1.tv_usec)))
 +      {
 +              larger  = &tv1;
 +              smaller = &tv0;
 +              status  = -1;
 +      }
 +      else
 +      {
 +              larger  = &tv0;
 +              smaller = &tv1;
 +              status  = 1;
        }
  
 -      return (0);
 -}
 +      if (delta != NULL) {
 +              delta->tv_sec = larger->tv_sec - smaller->tv_sec;
 +
 +              if (smaller->tv_usec <= larger->tv_usec)
 +                      delta->tv_usec = larger->tv_usec - smaller->tv_usec;
 +              else
 +              {
 +                      --delta->tv_sec;
 +                      delta->tv_usec = 1000000 + larger->tv_usec - smaller->tv_usec;
 +              }
 +      }
 +
 +      assert ((delta == NULL)
 +                      || ((0 <= delta->tv_usec) && (delta->tv_usec < 1000000)));
 +
 +      return (status);
 +} /* int timeval_cmp */
  
  int check_create_dir (const char *file_orig)
  {
        char *saveptr;
        int   last_is_file = 1;
        int   path_is_absolute = 0;
 -      int   len;
 +      size_t len;
        int   i;
  
        /*
                 */
                if (fields[i][0] == '.')
                {
-                       ERROR ("Cowardly refusing to create a directory that begins with a `.' (dot): `%s'", file_orig);
+                       ERROR ("Cowardly refusing to create a directory that "
+                                       "begins with a `.' (dot): `%s'", file_orig);
                        return (-2);
                }
  
                        return (-1);
                }
  
-               if (stat (dir, &statbuf) == -1)
-               {
-                       if (errno == ENOENT)
+               while (42) {
+                       if (stat (dir, &statbuf) == -1)
                        {
-                               if (mkdir (dir, 0755) == -1)
+                               if (errno == ENOENT)
                                {
+                                       if (mkdir (dir, 0755) == 0)
+                                               break;
+                                       /* this might happen, if a different thread created
+                                        * the directory in the meantime
+                                        * => call stat() again to check for S_ISDIR() */
+                                       if (EEXIST == errno)
+                                               continue;
                                        char errbuf[1024];
                                        ERROR ("check_create_dir: mkdir (%s): %s", dir,
                                                        sstrerror (errno,
                                                                errbuf, sizeof (errbuf)));
                                        return (-1);
                                }
+                               else
+                               {
+                                       char errbuf[1024];
+                                       ERROR ("check_create_dir: stat (%s): %s", dir,
+                                                       sstrerror (errno, errbuf,
+                                                               sizeof (errbuf)));
+                                       return (-1);
+                               }
                        }
-                       else
+                       else if (!S_ISDIR (statbuf.st_mode))
                        {
-                               char errbuf[1024];
-                               ERROR ("stat (%s): %s", dir,
-                                               sstrerror (errno, errbuf,
-                                                       sizeof (errbuf)));
+                               ERROR ("check_create_dir: `%s' exists but is not "
+                                               "a directory!", dir);
                                return (-1);
                        }
-               }
-               else if (!S_ISDIR (statbuf.st_mode))
-               {
-                       ERROR ("stat (%s): Not a directory!", dir);
-                       return (-1);
+                       break;
                }
        }
  
@@@ -955,22 -930,4 +966,22 @@@ int read_file_contents (const char *fil
        return n;
  }
  
 +counter_t counter_diff (counter_t old_value, counter_t new_value)
 +{
 +      counter_t diff;
 +
 +      if (old_value > new_value)
 +      {
 +              if (old_value <= 4294967295U)
 +                      diff = (4294967295U - old_value) + new_value;
 +              else
 +                      diff = (18446744073709551615ULL - old_value)
 +                              + new_value;
 +      }
 +      else
 +      {
 +              diff = new_value - old_value;
 +      }
  
 +      return (diff);
 +} /* counter_t counter_to_gauge */
diff --combined src/dns.c
+++ b/src/dns.c
@@@ -195,7 -195,7 +195,7 @@@ static void dns_child_callback (const r
        pthread_mutex_unlock (&opcode_mutex);
  }
  
 -static void *dns_child_loop (void *dummy)
 +static void *dns_child_loop (void __attribute__((unused)) *dummy)
  {
        pcap_t *pcap_obj;
        char    pcap_error[PCAP_ERRBUF_SIZE];
  
        /* Passing `pcap_device == NULL' is okay and the same as passign "any" */
        DEBUG ("Creating PCAP object..");
-       pcap_obj = pcap_open_live (pcap_device,
+       pcap_obj = pcap_open_live ((pcap_device != NULL) ? pcap_device : "any",
                        PCAP_SNAPLEN,
                        0 /* Not promiscuous */,
                        interval_g,
@@@ -298,6 -298,7 +298,6 @@@ static void submit_counter (const char 
  
        vl.values = values;
        vl.values_len = 1;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "dns", sizeof (vl.plugin));
        sstrncpy (vl.type, type, sizeof (vl.type));
@@@ -316,6 -317,7 +316,6 @@@ static void submit_octets (counter_t qu
  
        vl.values = values;
        vl.values_len = 2;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "dns", sizeof (vl.plugin));
        sstrncpy (vl.type, "dns_octets", sizeof (vl.type));