Merge branch 'collectd-4.5'
[collectd.git] / src / common.c
index fd7c199..119d284 100644 (file)
@@ -537,12 +537,12 @@ long long get_kstat_value (kstat_t *ksp, char *name)
 #else
        if (ksp == NULL)
        {
-               fprintf (stderr, "ERROR: %s:%i: ksp == NULL\n", __FILE__, __LINE__);
+               ERROR ("ERROR: %s:%i: ksp == NULL\n", __FILE__, __LINE__);
                return (-1LL);
        }
        else if (ksp->ks_type != KSTAT_TYPE_NAMED)
        {
-               fprintf (stderr, "ERROR: %s:%i: ksp->ks_type != KSTAT_TYPE_NAMED\n", __FILE__, __LINE__);
+               ERROR ("ERROR: %s:%i: ksp->ks_type != KSTAT_TYPE_NAMED\n", __FILE__, __LINE__);
                return (-1LL);
        }
 #endif
@@ -865,32 +865,44 @@ int notification_init (notification_t *n, int severity, const char *message,
        return (0);
 } /* int notification_init */
 
-int walk_directory (const char *dir, dirwalk_callback_f callback)
+int walk_directory (const char *dir, dirwalk_callback_f callback,
+               void *user_data)
 {
        struct dirent *ent;
        DIR *dh;
-       int ok = 0;
+       int success;
+       int failure;
+
+       success = 0;
+       failure = 0;
 
        if ((dh = opendir (dir)) == NULL)
        {
                char errbuf[1024];
-               ERROR ("Cannot open '%s': %s", dir,
+               ERROR ("walk_directory: Cannot open '%s': %s", dir,
                                sstrerror (errno, errbuf, sizeof (errbuf)));
                return -1;
        }
 
        while ((ent = readdir (dh)) != NULL)
        {
+               int status;
+
                if (ent->d_name[0] == '.')
                        continue;
 
-               if (!callback(ent->d_name))
-                       ++ok;
+               status = (*callback) (dir, ent->d_name, user_data);
+               if (status != 0)
+                       failure++;
+               else
+                       success++;
        }
 
        closedir (dh);
 
-       return ok ? 0 : -1;
+       if ((success == 0) && (failure > 0))
+               return (-1);
+       return (0);
 }
 
 int read_file_contents (const char *filename, char *buf, int bufsize)