X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcommon.c;h=18b5c43253d0d4124de0d40e30287f0bcdcda9ff;hb=575e601fb46732bc0538ef92ea6ac3b00ef3aafd;hp=d963efa556a6f60ce6f71c3472f90e791dc48c4e;hpb=80be251e335e8da43788ec50cec29bb38e11c24b;p=collectd.git diff --git a/src/common.c b/src/common.c index d963efa5..18b5c432 100644 --- a/src/common.c +++ b/src/common.c @@ -1,6 +1,6 @@ /** * collectd - src/common.c - * Copyright (C) 2005-2010 Florian octo Forster + * Copyright (C) 2005-2014 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 @@ -418,34 +418,36 @@ size_t strstripnewline (char *buffer) return (buffer_len); } /* size_t strstripnewline */ -int escape_slashes (char *buf, int buf_len) +int escape_slashes (char *buffer, size_t buffer_size) { int i; + size_t buffer_len; - if (strcmp (buf, "/") == 0) - { - if (buf_len < 5) - return (-1); + buffer_len = strlen (buffer); - strncpy (buf, "root", buf_len); + if (buffer_len <= 1) + { + if (strcmp ("/", buffer) == 0) + { + if (buffer_size < 5) + return (-1); + sstrncpy (buffer, "root", buffer_size); + } return (0); } - if (buf_len <= 1) - return (0); - /* Move one to the left */ - if (buf[0] == '/') - memmove (buf, buf + 1, buf_len - 1); + if (buffer[0] == '/') + { + memmove (buffer, buffer + 1, buffer_len); + buffer_len--; + } - for (i = 0; i < buf_len - 1; i++) + for (i = 0; i < buffer_len - 1; i++) { - if (buf[i] == '\0') - break; - else if (buf[i] == '/') - buf[i] = '_'; + if (buffer[i] == '/') + buffer[i] = '_'; } - buf[i] = '\0'; return (0); } /* int escape_slashes */ @@ -648,7 +650,7 @@ int get_kstat (kstat_t **ksp_ptr, char *module, int instance, char *name) char ident[128]; *ksp_ptr = NULL; - + if (kc == NULL) return (-1); @@ -721,7 +723,7 @@ long long get_kstat_value (kstat_t *ksp, char *name) retval = (long long) kn->value.ui64; /* XXX: Might overflow! */ else WARNING ("get_kstat_value: Not a numeric value: %s", name); - + return (retval); } #endif /* HAVE_LIBKSTAT */ @@ -828,36 +830,43 @@ int format_name (char *ret, int ret_len, const char *plugin, const char *plugin_instance, const char *type, const char *type_instance) { - int status; + char *buffer; + size_t buffer_size; + + buffer = ret; + buffer_size = (size_t) ret_len; + +#define APPEND(str) do { \ + size_t l = strlen (str); \ + if (l >= buffer_size) \ + return (ENOBUFS); \ + memcpy (buffer, (str), l); \ + buffer += l; buffer_size -= l; \ +} while (0) - assert (plugin != NULL); - assert (type != NULL); + assert (plugin != NULL); + assert (type != NULL); - if ((plugin_instance == NULL) || (strlen (plugin_instance) == 0)) - { - if ((type_instance == NULL) || (strlen (type_instance) == 0)) - status = ssnprintf (ret, ret_len, "%s/%s/%s", - hostname, plugin, type); - else - status = ssnprintf (ret, ret_len, "%s/%s/%s-%s", - hostname, plugin, type, - type_instance); - } - else - { - if ((type_instance == NULL) || (strlen (type_instance) == 0)) - status = ssnprintf (ret, ret_len, "%s/%s-%s/%s", - hostname, plugin, plugin_instance, - type); - else - status = ssnprintf (ret, ret_len, "%s/%s-%s/%s-%s", - hostname, plugin, plugin_instance, - type, type_instance); - } + APPEND (hostname); + APPEND ("/"); + APPEND (plugin); + if ((plugin_instance != NULL) && (plugin_instance[0] != 0)) + { + APPEND ("-"); + APPEND (plugin_instance); + } + APPEND ("/"); + APPEND (type); + if ((type_instance != NULL) && (type_instance[0] != 0)) + { + APPEND ("-"); + APPEND (type_instance); + } + assert (buffer_size > 0); + buffer[0] = 0; - if ((status < 1) || (status >= ret_len)) - return (-1); - return (0); +#undef APPEND + return (0); } /* int format_name */ int format_values (char *ret, size_t ret_len, /* {{{ */ @@ -1227,7 +1236,7 @@ int walk_directory (const char *dir, dirwalk_callback_f callback, while ((ent = readdir (dh)) != NULL) { int status; - + if (include_hidden) { if ((strcmp (".", ent->d_name) == 0) @@ -1390,6 +1399,69 @@ int rate_to_value (value_t *ret_value, gauge_t rate, /* {{{ */ return (0); } /* }}} value_t rate_to_value */ +int value_to_rate (value_t *ret_rate, derive_t value, /* {{{ */ + value_to_rate_state_t *state, + int ds_type, cdtime_t t) +{ + double interval; + + /* Another invalid state: The time is not increasing. */ + if (t <= state->last_time) + { + memset (state, 0, sizeof (*state)); + return (EINVAL); + } + + interval = CDTIME_T_TO_DOUBLE(t - state->last_time); + + /* Previous value is invalid. */ + if (state->last_time == 0) /* {{{ */ + { + if (ds_type == DS_TYPE_DERIVE) + { + state->last_value.derive = value; + } + else if (ds_type == DS_TYPE_COUNTER) + { + state->last_value.counter = (counter_t) value; + } + else if (ds_type == DS_TYPE_ABSOLUTE) + { + state->last_value.absolute = (absolute_t) value; + } + else + { + assert (23 == 42); + } + + state->last_time = t; + return (EAGAIN); + } /* }}} */ + + if (ds_type == DS_TYPE_DERIVE) + { + ret_rate->gauge = (value - state->last_value.derive) / interval; + state->last_value.derive = value; + } + else if (ds_type == DS_TYPE_COUNTER) + { + ret_rate->gauge = (((counter_t)value) - state->last_value.counter) / interval; + state->last_value.counter = (counter_t) value; + } + else if (ds_type == DS_TYPE_ABSOLUTE) + { + ret_rate->gauge = (((absolute_t)value) - state->last_value.absolute) / interval; + state->last_value.absolute = (absolute_t) value; + } + else + { + assert (23 == 42); + } + + state->last_time = t; + return (0); +} /* }}} value_t rate_to_value */ + int service_name_to_port_number (const char *service_name) { struct addrinfo *ai_list;