X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Fcommon.c;h=8502208de1fd74c698bdf37d2c56e9e27b286f8d;hb=90e7e99e0da5efb00991ef3c6efa0fdc2cb56701;hp=0aa5345bd6643b8ba096a636a6b1d77bba80e368;hpb=936c450a86c841eea89888c8550c9118fae90c25;p=collectd.git diff --git a/src/daemon/common.c b/src/daemon/common.c index 0aa5345b..8502208d 100644 --- a/src/daemon/common.c +++ b/src/daemon/common.c @@ -271,8 +271,10 @@ ssize_t swrite(int fd, const void *buf, size_t count) { ptr = (const char *)buf; nleft = count; - if (fd < 0) - return (-1); + if (fd < 0) { + errno = EINVAL; + return errno; + } /* checking for closed peer connection */ pfd.fd = fd; @@ -281,10 +283,9 @@ ssize_t swrite(int fd, const void *buf, size_t count) { 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; + /* if recv returns zero (even though poll() said there is data to be + * read), that means the connection has been closed */ + return errno ? errno : -1; } } @@ -295,7 +296,7 @@ ssize_t swrite(int fd, const void *buf, size_t count) { continue; if (status < 0) - return (status); + return errno ? errno : status; nleft = nleft - ((size_t)status); ptr = ptr + ((size_t)status); @@ -351,6 +352,9 @@ int strjoin(char *buffer, size_t buffer_size, char **fields, size_t fields_num, buffer_req += sep_len; buffer_req += field_len; + if (buffer_size == 0) + continue; + if ((i != 0) && (sep_len > 0)) { if (sep_len >= avail) { /* prevent subsequent iterations from writing to the @@ -1567,16 +1571,26 @@ void strarray_free(char **array, size_t array_len) /* {{{ */ #if HAVE_CAPABILITY int check_capability(int arg) /* {{{ */ { - cap_value_t cap = (cap_value_t)arg; + cap_value_t cap_value = (cap_value_t)arg; + cap_t cap; + cap_flag_value_t cap_flag_value; - if (!CAP_IS_SUPPORTED(cap)) + if (!CAP_IS_SUPPORTED(cap_value)) return (-1); - int have_cap = cap_get_bound(cap); - if (have_cap != 1) + if (!(cap = cap_get_proc())) { + ERROR("check_capability: cap_get_proc failed."); return (-1); + } - return (0); + if (cap_get_flag(cap, cap_value, CAP_EFFECTIVE, &cap_flag_value) < 0) { + ERROR("check_capability: cap_get_flag failed."); + cap_free(cap); + return (-1); + } + cap_free(cap); + + return (cap_flag_value != CAP_SET); } /* }}} int check_capability */ #else int check_capability(__attribute__((unused)) int arg) /* {{{ */