X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcommon.c;h=6521a58bd1a07a376fda133faed70f549e122ed3;hb=4059b7f729ee092d59d41a92804c83c1dd0d5332;hp=fc34afe7fcbed19a85e6563b498b1310d6fe619a;hpb=5a7cdf2e0efd8579ea8771b856a682ec39acd70e;p=collectd.git diff --git a/src/common.c b/src/common.c index fc34afe7..6521a58b 100644 --- a/src/common.c +++ b/src/common.c @@ -21,7 +21,7 @@ **/ #include "common.h" -#include "utils_debug.h" +#include "plugin.h" #ifdef HAVE_MATH_H # include @@ -51,20 +51,29 @@ char *sstrdup (const char *s) if((r = strdup (s)) == NULL) { - DBG ("Not enough memory."); + DEBUG ("Not enough memory."); exit(3); } return (r); } +/* Don't use the return value of `strerror_r', because the GNU-people got + * inventive there.. -octo */ +char *sstrerror (int errnum, char *buf, size_t buflen) +{ + buf[0] = '\0'; + strerror_r (errnum, buf, buflen); + return (buf); +} /* char *sstrerror */ + void *smalloc (size_t size) { void *r; if ((r = malloc (size)) == NULL) { - DBG("Not enough memory."); + DEBUG("Not enough memory."); exit(3); } @@ -105,7 +114,7 @@ ssize_t sread (int fd, void *buf, size_t count) if (status == 0) { - DBG ("Received EOF from fd %i. " + DEBUG ("Received EOF from fd %i. " "Closing fd and returning error.", fd); close (fd); @@ -152,10 +161,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 +300,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 +327,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 +337,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++; @@ -347,7 +360,7 @@ int check_create_dir (const char *file_orig) */ if (fields[i][0] == '.') { - syslog (LOG_ERR, "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); } @@ -358,7 +371,7 @@ int check_create_dir (const char *file_orig) if (strjoin (dir + path_is_absolute, dir_len - path_is_absolute, fields, i + 1, "/") < 0) { - syslog (LOG_ERR, "strjoin failed: `%s', component #%i", file_orig, i); + ERROR ("strjoin failed: `%s', component #%i", file_orig, i); return (-1); } @@ -368,19 +381,25 @@ int check_create_dir (const char *file_orig) { if (mkdir (dir, 0755) == -1) { - syslog (LOG_ERR, "mkdir (%s): %s", dir, strerror (errno)); + char errbuf[1024]; + ERROR ("mkdir (%s): %s", dir, + sstrerror (errno, + errbuf, sizeof (errbuf))); return (-1); } } else { - syslog (LOG_ERR, "stat (%s): %s", dir, strerror (errno)); + char errbuf[1024]; + ERROR ("stat (%s): %s", dir, + sstrerror (errno, errbuf, + sizeof (errbuf))); return (-1); } } else if (!S_ISDIR (statbuf.st_mode)) { - syslog (LOG_ERR, "stat (%s): Not a directory!", dir); + ERROR ("stat (%s): Not a directory!", dir); return (-1); } } @@ -403,13 +422,13 @@ int get_kstat (kstat_t **ksp_ptr, char *module, int instance, char *name) { if ((*ksp_ptr = kstat_lookup (kc, module, instance, name)) == NULL) { - syslog (LOG_ERR, "Cound not find kstat %s", ident); + ERROR ("Cound not find kstat %s", ident); return (-1); } if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED) { - syslog (LOG_WARNING, "kstat %s has wrong type", ident); + WARNING ("kstat %s has wrong type", ident); *ksp_ptr = NULL; return (-1); } @@ -422,13 +441,13 @@ int get_kstat (kstat_t **ksp_ptr, char *module, int instance, char *name) if (kstat_read (kc, *ksp_ptr, NULL) == -1) { - syslog (LOG_WARNING, "kstat %s could not be read", ident); + WARNING ("kstat %s could not be read", ident); return (-1); } if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED) { - syslog (LOG_WARNING, "kstat %s has wrong type", ident); + WARNING ("kstat %s has wrong type", ident); return (-1); } @@ -468,7 +487,7 @@ long long get_kstat_value (kstat_t *ksp, char *name) else if (kn->data_type == KSTAT_DATA_UINT64) retval = (long long) kn->value.ui64; /* XXX: Might overflow! */ else - syslog (LOG_WARNING, "get_kstat_value: Not a numeric value: %s", name); + WARNING ("get_kstat_value: Not a numeric value: %s", name); return (retval); } @@ -481,7 +500,7 @@ unsigned long long ntohll (unsigned long long n) #else return (((unsigned long long) ntohl (n)) << 32) + ntohl (n >> 32); #endif -} +} /* unsigned long long ntohll */ unsigned long long htonll (unsigned long long n) { @@ -490,4 +509,41 @@ unsigned long long htonll (unsigned long long n) #else return (((unsigned long long) htonl (n)) << 32) + htonl (n >> 32); #endif -} +} /* unsigned long long htonll */ + +int format_name (char *ret, int ret_len, + const char *hostname, + const char *plugin, const char *plugin_instance, + const char *type, const char *type_instance) +{ + int status; + + assert (plugin != NULL); + assert (type != NULL); + + if ((plugin_instance == NULL) || (strlen (plugin_instance) == 0)) + { + if ((type_instance == NULL) || (strlen (type_instance) == 0)) + status = snprintf (ret, ret_len, "%s/%s/%s", + hostname, plugin, type); + else + status = snprintf (ret, ret_len, "%s/%s/%s-%s", + hostname, plugin, type, + type_instance); + } + else + { + if ((type_instance == NULL) || (strlen (type_instance) == 0)) + status = snprintf (ret, ret_len, "%s/%s-%s/%s", + hostname, plugin, plugin_instance, + type); + else + status = snprintf (ret, ret_len, "%s/%s-%s/%s-%s", + hostname, plugin, plugin_instance, + type, type_instance); + } + + if ((status < 1) || (status >= ret_len)) + return (-1); + return (0); +} /* int format_name */