X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fdaemon%2Fcommon.c;h=dd4f9b15ae39a5036cbb0b40f0b8c21624ee473a;hb=9c8f3110063cf83fa146929d5f28f8ecf17a4ffd;hp=73dd277fab52a78c50b4a7e5ea695d35c488dcce;hpb=b720b5a6214ab1b9c058c7bd1fb4aad2f90e7889;p=collectd.git diff --git a/src/daemon/common.c b/src/daemon/common.c index 73dd277f..dd4f9b15 100644 --- a/src/daemon/common.c +++ b/src/daemon/common.c @@ -46,9 +46,10 @@ /* for getaddrinfo */ #include -#include #include +#include + #if HAVE_NETINET_IN_H # include #endif @@ -257,8 +258,8 @@ ssize_t sread (int fd, void *buf, size_t count) assert ((0 > status) || (nleft >= (size_t)status)); - nleft = nleft - status; - ptr = ptr + status; + nleft = nleft - ((size_t) status); + ptr = ptr + ((size_t) status); } return (0); @@ -270,9 +271,23 @@ ssize_t swrite (int fd, const void *buf, size_t count) const char *ptr; size_t nleft; ssize_t status; + struct pollfd pfd; ptr = (const char *) buf; nleft = count; + + /* checking for closed peer connection */ + pfd.fd = fd; + pfd.events = POLLIN | POLLHUP; + pfd.revents = 0; + if (poll(&pfd, 1, 0) > 0) { + char buffer[32]; + if (recv(fd, buffer, sizeof(buffer), MSG_PEEK | MSG_DONTWAIT) == 0) { + // if recv returns zero (even though poll() said there is data to be read), + // that means the connection has been closed + return -1; + } + } while (nleft > 0) { @@ -284,8 +299,8 @@ ssize_t swrite (int fd, const void *buf, size_t count) if (status < 0) return (status); - nleft = nleft - status; - ptr = ptr + status; + nleft = nleft - ((size_t) status); + ptr = ptr + ((size_t) status); } return (0); @@ -356,7 +371,7 @@ int strjoin (char *buffer, size_t buffer_size, } assert (buffer[buffer_size - 1] == 0); - return (strlen (buffer)); + return ((int) strlen (buffer)); } int strsubstitute (char *str, char c_from, char c_to) @@ -665,8 +680,8 @@ int check_create_dir (const char *file_orig) * Join the components together again */ dir[0] = '/'; - if (strjoin (dir + path_is_absolute, dir_len - path_is_absolute, - fields, i + 1, "/") < 0) + if (strjoin (dir + path_is_absolute, (size_t) (dir_len - path_is_absolute), + fields, (size_t) (i + 1), "/") < 0) { ERROR ("strjoin failed: `%s', component #%i", file_orig, i); return (-1); @@ -1154,6 +1169,9 @@ int parse_values (char *buffer, value_list_t *vl, const data_set_t *ds) char *ptr; char *saveptr; + if ((buffer == NULL) || (vl == NULL) || (ds == NULL)) + return EINVAL; + i = 0; dummy = buffer; saveptr = NULL; @@ -1469,11 +1487,10 @@ 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) +int value_to_rate (gauge_t *ret_rate, /* {{{ */ + value_t value, int ds_type, cdtime_t t, value_to_rate_state_t *state) { - double interval; + gauge_t interval; /* Another invalid state: The time is not increasing. */ if (t <= state->last_time) @@ -1485,51 +1502,39 @@ int value_to_rate (value_t *ret_rate, derive_t value, /* {{{ */ interval = CDTIME_T_TO_DOUBLE(t - state->last_time); /* Previous value is invalid. */ - if (state->last_time == 0) /* {{{ */ + 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_value = value; 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; + switch (ds_type) { + case DS_TYPE_DERIVE: { + derive_t diff = value.derive - state->last_value.derive; + *ret_rate = ((gauge_t) diff) / ((gauge_t) interval); + break; } - else if (ds_type == DS_TYPE_COUNTER) - { - counter_t diff = counter_diff (state->last_value.counter, (counter_t) value); - ret_rate->gauge = ((gauge_t) diff) / ((gauge_t) interval); - state->last_value.counter = (counter_t) value; + case DS_TYPE_GAUGE: { + *ret_rate = value.gauge; + break; } - 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; + case DS_TYPE_COUNTER: { + counter_t diff = counter_diff (state->last_value.counter, value.counter); + *ret_rate = ((gauge_t) diff) / ((gauge_t) interval); + break; } - else - { - assert (23 == 42); + case DS_TYPE_ABSOLUTE: { + absolute_t diff = value.absolute; + *ret_rate = ((gauge_t) diff) / ((gauge_t) interval); + break; + } + default: + return EINVAL; } - state->last_time = t; + state->last_value = value; + state->last_time = t; return (0); } /* }}} value_t rate_to_value */