Merge branch 'pull/collectd-4' into collectd-4
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 10 Mar 2007 09:52:02 +0000 (10:52 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 10 Mar 2007 09:52:02 +0000 (10:52 +0100)
src/apache.c
src/apcups.c
src/common.c
src/csv.c
src/exec.c
src/hddtemp.c
src/unixsock.c

index 973ad86..167ead1 100644 (file)
@@ -294,6 +294,7 @@ static int apache_read (void)
        int i;
 
        char *ptr;
+       char *saveptr;
        char *lines[16];
        int   lines_num = 0;
 
@@ -314,7 +315,8 @@ static int apache_read (void)
        }
 
        ptr = apache_buffer;
-       while ((lines[lines_num] = strtok (ptr, "\n\r")) != NULL)
+       saveptr = NULL;
+       while ((lines[lines_num] = strtok_r (ptr, "\n\r", &saveptr)) != NULL)
        {
                ptr = NULL;
                lines_num++;
index e23bc9e..9fab785 100644 (file)
@@ -304,6 +304,7 @@ static int apc_query_server (char *host, int port,
        int     n;
        char    recvline[1024];
        char   *tokptr;
+       char   *toksaveptr;
        char   *key;
        double  value;
 
@@ -344,11 +345,12 @@ static int apc_query_server (char *host, int port,
                printf ("net_recv = `%s';\n", recvline);
 #endif /* if APCMAIN */
 
-               tokptr = strtok (recvline, " :\t");
+               toksaveptr = NULL;
+               tokptr = strtok_r (recvline, " :\t", &toksaveptr);
                while (tokptr != NULL)
                {
                        key = tokptr;
-                       if ((tokptr = strtok (NULL, " :\t")) == NULL)
+                       if ((tokptr = strtok_r (NULL, " :\t", &toksaveptr)) == NULL)
                                continue;
                        value = atof (tokptr);
 
@@ -371,7 +373,7 @@ static int apc_query_server (char *host, int port,
                        else if (strcmp ("TIMELEFT", key) == 0)
                                apcups_detail->timeleft = value;
 
-                       tokptr = strtok (NULL, ":");
+                       tokptr = strtok_r (NULL, ":", &toksaveptr);
                } /* while (tokptr != NULL) */
        }
        
index fc34afe..922bd15 100644 (file)
@@ -152,10 +152,12 @@ int strsplit (char *string, char **fields, size_t size)
 {
        size_t i;
        char *ptr;
+       char *saveptr;
 
        i = 0;
        ptr = string;
-       while ((fields[i] = strtok (ptr, " \t")) != NULL)
+       saveptr = NULL;
+       while ((fields[i] = strtok_r (ptr, " \t", &saveptr)) != NULL)
        {
                ptr = NULL;
                i++;
@@ -289,6 +291,7 @@ int check_create_dir (const char *file_orig)
        char *fields[16];
        int   fields_num;
        char *ptr;
+       char *saveptr;
        int   last_is_file = 1;
        int   path_is_absolute = 0;
        int   len;
@@ -315,7 +318,7 @@ int check_create_dir (const char *file_orig)
                path_is_absolute = 1;
 
        /*
-        * Create a copy for `strtok' to destroy
+        * Create a copy for `strtok_r' to destroy
         */
        strncpy (file_copy, file_orig, 512);
        file_copy[511] = '\0';
@@ -325,8 +328,9 @@ int check_create_dir (const char *file_orig)
         * remove leading and trailing slashes..
         */
        ptr = file_copy;
+       saveptr = NULL;
        fields_num = 0;
-       while ((fields[fields_num] = strtok (ptr, "/")) != NULL)
+       while ((fields[fields_num] = strtok_r (ptr, "/", &saveptr)) != NULL)
        {
                ptr = NULL;
                fields_num++;
index 268bdbf..f4b56fe 100644 (file)
--- a/src/csv.c
+++ b/src/csv.c
@@ -114,18 +114,19 @@ static int value_list_to_filename (char *buffer, int buffer_len,
 
        {
                time_t now;
-               struct tm *tm;
+               struct tm stm;
 
-               /* TODO: Find a way to minimize the calls to `localtime', since
-                * they are pretty expensive.. */
+               /* TODO: Find a way to minimize the calls to `localtime_r',
+                * since they are pretty expensive.. */
                now = time (NULL);
-               tm = localtime (&now);
+               if (localtime_r (&now, &stm) == NULL)
+               {
+                       syslog (LOG_ERR, "csv plugin: localtime_r failed");
+                       return (1);
+               }
 
                strftime (buffer + offset, buffer_len - offset,
-                               "-%Y-%m-%d", tm);
-
-               /* `localtime(3)' returns a pointer to static data,
-                * therefore the pointer may not be free'd. */
+                               "-%Y-%m-%d", &stm);
        }
 
        return (0);
index ee8f8bf..63401be 100644 (file)
@@ -166,20 +166,28 @@ static void submit_gauge (const char *type_instance, gauge_t value)
 
 static void exec_child (program_list_t *pl)
 {
-  struct passwd *sp;
   int status;
   int uid;
   char *arg0;
 
-  /* FIXME: Not thread safe! */
-  sp = getpwnam (pl->user);
-  if (sp == NULL)
+  struct passwd *sp_ptr;
+  struct passwd sp;
+  char pwnambuf[2048];
+
+  sp_ptr = NULL;
+  status = getpwnam_r (pl->user, &sp, pwnambuf, sizeof (pwnambuf), &sp_ptr);
+  if (status != 0)
+  {
+    syslog (LOG_ERR, "exec plugin: getpwnam_r failed: %s", strerror (status));
+    exit (-1);
+  }
+  if (sp_ptr == NULL)
   {
-    syslog (LOG_ERR, "exec plugin: getpwnam failed: %s", strerror (errno));
+    syslog (LOG_ERR, "exec plugin: No such user: `%s'", pl->user);
     exit (-1);
   }
 
-  uid = sp->pw_uid;
+  uid = sp.pw_uid;
   if (uid == 0)
   {
     syslog (LOG_ERR, "exec plugin: Cowardly refusing to exec program as root.");
index 03990f2..353fbe3 100644 (file)
@@ -443,6 +443,7 @@ static int hddtemp_read (void)
        char buf[1024];
        char *fields[128];
        char *ptr;
+       char *saveptr;
        int num_fields;
        int num_disks;
        int i;
@@ -451,10 +452,11 @@ static int hddtemp_read (void)
        if (hddtemp_query_daemon (buf, sizeof (buf)) < 0)
                return (-1);
 
-       /* NB: strtok will eat up "||" and leading "|"'s */
+       /* NB: strtok_r will eat up "||" and leading "|"'s */
        num_fields = 0;
        ptr = buf;
-       while ((fields[num_fields] = strtok (ptr, "|")) != NULL)
+       saveptr = NULL;
+       while ((fields[num_fields] = strtok_r (ptr, "|", &saveptr)) != NULL)
        {
                ptr = NULL;
                num_fields++;
index 12ebc09..b4af8b3 100644 (file)
@@ -387,21 +387,27 @@ static int us_open_socket (void)
 
        do
        {
+               char *grpname;
                struct group *g;
+               struct group sg;
+               char grbuf[2048];
 
-               errno = 0;
-               g = getgrnam ((sock_group != NULL) ? sock_group : COLLECTD_GRP_NAME);
+               grpname = (sock_group != NULL) ? sock_group : COLLECTD_GRP_NAME;
+               g = NULL;
 
-               if (errno != 0)
+               status = getgrnam_r (grpname, &sg, grbuf, sizeof (grbuf), &g);
+               if (status != 0)
                {
-                       syslog (LOG_WARNING, "unixsock plugin: getgrnam (%s) failed: %s",
-                                       (sock_group != NULL) ? sock_group : COLLECTD_GRP_NAME,
-                                       strerror (errno));
+                       syslog (LOG_WARNING, "unixsock plugin: getgrnam_r (%s) failed: %s",
+                                       grpname, strerror (status));
                        break;
                }
-
                if (g == NULL)
+               {
+                       syslog (LOG_WARNING, "unixsock plugin: No such group: `%s'",
+                                       grpname);
                        break;
+               }
 
                if (chown ((sock_file != NULL) ? sock_file : US_DEFAULT_PATH,
                                        (uid_t) -1, g->gr_gid) != 0)