X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcommon.c;h=5c3db5ddacb53677d83e4d519f8b0c7331852449;hb=48b794525072b1ff00a90497ef0bb1f4030510f4;hp=974a29eac035afca6a158deafbe4e56bfae2be52;hpb=7e5df1a2c6611bd4ac9fb8ac4b78106f9139ae6e;p=collectd.git diff --git a/src/common.c b/src/common.c index 974a29ea..5c3db5dd 100644 --- a/src/common.c +++ b/src/common.c @@ -1,6 +1,6 @@ /** * collectd - src/common.c - * Copyright (C) 2005-2007 Florian octo Forster + * Copyright (C) 2005-2008 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -24,6 +24,7 @@ # include "config.h" #endif +#include "collectd.h" #include "common.h" #include "plugin.h" @@ -48,11 +49,17 @@ extern kstat_ctl_t *kc; static pthread_mutex_t getpwnam_r_lock = PTHREAD_MUTEX_INITIALIZER; #endif -void sstrncpy (char *d, const char *s, int len) +#if !HAVE_STRERROR_R +static pthread_mutex_t strerror_r_lock = PTHREAD_MUTEX_INITIALIZER; +#endif + +char *sstrncpy (char *dest, const char *src, size_t n) { - strncpy (d, s, len); - d[len - 1] = '\0'; -} + strncpy (dest, src, n); + dest[n - 1] = '\0'; + + return (dest); +} /* char *sstrncpy */ char *sstrdup (const char *s) { @@ -76,7 +83,21 @@ char *sstrdup (const char *s) char *sstrerror (int errnum, char *buf, size_t buflen) { buf[0] = '\0'; -#ifdef STRERROR_R_CHAR_P + +#if !HAVE_STRERROR_R + { + char *temp; + + pthread_mutex_lock (&strerror_r_lock); + + temp = strerror (errnum); + strncpy (buf, temp, buflen); + + pthread_mutex_unlock (&strerror_r_lock); + } +/* #endif !HAVE_STRERROR_R */ + +#elif STRERROR_R_CHAR_P { char *temp; temp = strerror_r (errnum, buf, buflen); @@ -87,9 +108,10 @@ char *sstrerror (int errnum, char *buf, size_t buflen) else strncpy (buf, "strerror_r did not return " "an error message", buflen); - buf[buflen - 1] = '\0'; } } +/* #endif STRERROR_R_CHAR_P */ + #else if (strerror_r (errnum, buf, buflen) != 0) { @@ -98,6 +120,7 @@ char *sstrerror (int errnum, char *buf, size_t buflen) errnum); } #endif /* STRERROR_R_CHAR_P */ + buf[buflen - 1] = '\0'; return (buf); } /* char *sstrerror */ @@ -156,7 +179,7 @@ ssize_t sread (int fd, void *buf, size_t count) return (-1); } - assert (nleft >= status); + assert ((0 > status) || (nleft >= (size_t)status)); nleft = nleft - status; ptr = ptr + status; @@ -217,8 +240,8 @@ int strjoin (char *dst, size_t dst_len, char **fields, size_t fields_num, const char *sep) { - int field_len; - int sep_len; + size_t field_len; + size_t sep_len; int i; memset (dst, '\0', dst_len); @@ -230,7 +253,7 @@ int strjoin (char *dst, size_t dst_len, if (sep != NULL) sep_len = strlen (sep); - for (i = 0; i < fields_num; i++) + for (i = 0; i < (int)fields_num; i++) { if ((i > 0) && (sep_len > 0)) { @@ -534,7 +557,7 @@ long long get_kstat_value (kstat_t *ksp, char *name) unsigned long long ntohll (unsigned long long n) { -#if __BYTE_ORDER == __BIG_ENDIAN +#if BYTE_ORDER == BIG_ENDIAN return (n); #else return (((unsigned long long) ntohl (n)) << 32) + ntohl (n >> 32); @@ -543,13 +566,90 @@ unsigned long long ntohll (unsigned long long n) unsigned long long htonll (unsigned long long n) { -#if __BYTE_ORDER == __BIG_ENDIAN +#if BYTE_ORDER == BIG_ENDIAN return (n); #else return (((unsigned long long) htonl (n)) << 32) + htonl (n >> 32); #endif } /* unsigned long long htonll */ +#if FP_LAYOUT_NEED_NOTHING +/* Well, we need nothing.. */ +/* #endif FP_LAYOUT_NEED_NOTHING */ + +#elif FP_LAYOUT_NEED_ENDIANFLIP || FP_LAYOUT_NEED_INTSWAP +# if FP_LAYOUT_NEED_ENDIANFLIP +# define FP_CONVERT(A) ((((uint64_t)(A) & 0xff00000000000000LL) >> 56) | \ + (((uint64_t)(A) & 0x00ff000000000000LL) >> 40) | \ + (((uint64_t)(A) & 0x0000ff0000000000LL) >> 24) | \ + (((uint64_t)(A) & 0x000000ff00000000LL) >> 8) | \ + (((uint64_t)(A) & 0x00000000ff000000LL) << 8) | \ + (((uint64_t)(A) & 0x0000000000ff0000LL) << 24) | \ + (((uint64_t)(A) & 0x000000000000ff00LL) << 40) | \ + (((uint64_t)(A) & 0x00000000000000ffLL) << 56)) +# else +# define FP_CONVERT(A) ((((uint64_t)(A) & 0xffffffff00000000LL) >> 32) | \ + (((uint64_t)(A) & 0x00000000ffffffffLL) << 32)) +# endif + +double ntohd (double d) +{ + union + { + uint8_t byte[8]; + uint64_t integer; + double floating; + } ret; + + ret.floating = d; + + /* NAN in x86 byte order */ + if ((ret.byte[0] == 0x00) && (ret.byte[1] == 0x00) + && (ret.byte[2] == 0x00) && (ret.byte[3] == 0x00) + && (ret.byte[4] == 0x00) && (ret.byte[5] == 0x00) + && (ret.byte[6] == 0xf8) && (ret.byte[7] == 0x7f)) + { + return (NAN); + } + else + { + uint64_t tmp; + + tmp = ret.integer; + ret.integer = FP_CONVERT (tmp); + return (ret.floating); + } +} /* double ntohd */ + +double htond (double d) +{ + union + { + uint8_t byte[8]; + uint64_t integer; + double floating; + } ret; + + if (isnan (d)) + { + ret.byte[0] = ret.byte[1] = ret.byte[2] = ret.byte[3] = 0x00; + ret.byte[4] = ret.byte[5] = 0x00; + ret.byte[6] = 0xf8; + ret.byte[7] = 0x7f; + return (ret.floating); + } + else + { + uint64_t tmp; + + ret.floating = d; + tmp = FP_CONVERT (ret.integer); + ret.integer = tmp; + return (ret.floating); + } +} /* double htond */ +#endif /* FP_LAYOUT_NEED_ENDIANFLIP || FP_LAYOUT_NEED_INTSWAP */ + int format_name (char *ret, int ret_len, const char *hostname, const char *plugin, const char *plugin_instance, @@ -726,4 +826,38 @@ int getpwnam_r (const char *name, struct passwd *pwbuf, char *buf, return (status); } /* int getpwnam_r */ -#endif +#endif /* !HAVE_GETPWNAM_R */ + +int notification_init (notification_t *n, int severity, const char *message, + const char *host, + const char *plugin, const char *plugin_instance, + const char *type, const char *type_instance) +{ + memset (n, '\0', sizeof (notification_t)); + + n->severity = severity; + + if (message != NULL) + strncpy (n->message, message, sizeof (n->message)); + if (host != NULL) + strncpy (n->host, host, sizeof (n->host)); + if (plugin != NULL) + strncpy (n->plugin, plugin, sizeof (n->plugin)); + if (plugin_instance != NULL) + strncpy (n->plugin_instance, plugin_instance, + sizeof (n->plugin_instance)); + if (type != NULL) + strncpy (n->type, type, sizeof (n->type)); + if (type_instance != NULL) + strncpy (n->type_instance, type_instance, + sizeof (n->type_instance)); + + n->message[sizeof (n->message) - 1] = '\0'; + n->host[sizeof (n->host) - 1] = '\0'; + n->plugin[sizeof (n->plugin) - 1] = '\0'; + n->plugin_instance[sizeof (n->plugin_instance) - 1] = '\0'; + n->type[sizeof (n->type) - 1] = '\0'; + n->type_instance[sizeof (n->type_instance) - 1] = '\0'; + + return (0); +} /* int notification_init */