X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flibcollectdclient%2Fclient.c;h=49a4d8792c5c1aa991d412dd4a95dcaea4d8c8fd;hb=f7b05ebf3311b4c6cb5289f1f7cd8ee02918ef92;hp=2adf6d48821d49590bde1186dd8c047c78eaa17a;hpb=80a66a53838bcf17e513f673f18a61fd1ac647c0;p=collectd.git diff --git a/src/libcollectdclient/client.c b/src/libcollectdclient/client.c index 2adf6d48..bdb21f65 100644 --- a/src/libcollectdclient/client.c +++ b/src/libcollectdclient/client.c @@ -1,22 +1,27 @@ /** * libcollectdclient - src/libcollectdclient/client.c - * Copyright (C) 2008 Florian octo Forster + * Copyright (C) 2008-2012 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 - * Free Software Foundation; only version 2 of the License is applicable. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * Authors: - * Florian octo Forster + * Florian octo Forster **/ #if HAVE_CONFIG_H @@ -27,10 +32,11 @@ # define __attribute__(x) /**/ #endif -#include "lcc_features.h" +#include "collectd/lcc_features.h" #include #include +#include #include #include #include @@ -41,7 +47,7 @@ #include #include -#include "client.h" +#include "collectd/client.h" /* NI_MAXHOST has been obsoleted by RFC 3493 which is a reason for SunOS 5.11 * to no longer define it. We'll use the old, RFC 2553 value here. */ @@ -79,19 +85,13 @@ _b[sizeof (_b) - 1] = 0; \ SSTRCAT ((d), _b); \ } while (0) - + #define LCC_SET_ERRSTR(c, ...) do { \ snprintf ((c)->errbuf, sizeof ((c)->errbuf), __VA_ARGS__); \ (c)->errbuf[sizeof ((c)->errbuf) - 1] = 0; \ } while (0) -#if COLLECT_DEBUG -# define LCC_DEBUG(...) printf (__VA_ARGS__) -#else -# define LCC_DEBUG(...) /**/ -#endif - /* * Types */ @@ -113,6 +113,22 @@ typedef struct lcc_response_s lcc_response_t; /* * Private functions */ +static int lcc_tracef(char const *format, ...) +{ + va_list ap; + int status; + + char const *trace = getenv (LCC_TRACE_ENV); + if (!trace || (strcmp ("", trace) == 0) || (strcmp ("0", trace) == 0)) + return 0; + + va_start (ap, format); + status = vprintf (format, ap); + va_end (ap); + + return status; +} + /* Even though Posix requires "strerror_r" to return an "int", * some systems (e.g. the GNU libc) return a "char *" _and_ * ignore the second argument ... -tokkee */ @@ -228,53 +244,6 @@ static void lcc_chomp (char *str) /* {{{ */ } } /* }}} void lcc_chomp */ -static int lcc_identifier_cmp (const void *a, const void *b) -{ - const lcc_identifier_t *ident_a, *ident_b; - - int status; - - ident_a = a; - ident_b = b; - - status = strcasecmp (ident_a->host, ident_b->host); - if (status != 0) - return (status); - - status = strcmp (ident_a->plugin, ident_b->plugin); - if (status != 0) - return (status); - - if ((*ident_a->plugin_instance != '\0') || (*ident_b->plugin_instance != '\0')) - { - if (*ident_a->plugin_instance == '\0') - return (-1); - else if (*ident_b->plugin_instance == '\0') - return (1); - - status = strcmp (ident_a->plugin_instance, ident_b->plugin_instance); - if (status != 0) - return (status); - } - - status = strcmp (ident_a->type, ident_b->type); - if (status != 0) - return (status); - - if ((*ident_a->type_instance != '\0') || (*ident_b->type_instance != '\0')) - { - if (*ident_a->type_instance == '\0') - return (-1); - else if (*ident_b->type_instance == '\0') - return (1); - - status = strcmp (ident_a->type_instance, ident_b->type_instance); - if (status != 0) - return (status); - } - return (0); -} /* }}} int lcc_identifier_cmp */ - static void lcc_response_free (lcc_response_t *res) /* {{{ */ { size_t i; @@ -292,7 +261,7 @@ static int lcc_send (lcc_connection_t *c, const char *command) /* {{{ */ { int status; - LCC_DEBUG ("send: --> %s\n", command); + lcc_tracef ("send: --> %s\n", command); status = fprintf (c->fh, "%s\r\n", command); if (status < 0) @@ -300,6 +269,7 @@ static int lcc_send (lcc_connection_t *c, const char *command) /* {{{ */ lcc_set_errno (c, errno); return (-1); } + fflush(c->fh); return (0); } /* }}} int lcc_send */ @@ -322,7 +292,7 @@ static int lcc_receive (lcc_connection_t *c, /* {{{ */ return (-1); } lcc_chomp (buffer); - LCC_DEBUG ("receive: <-- %s\n", buffer); + lcc_tracef ("receive: <-- %s\n", buffer); /* Convert the leading status to an integer and make `ptr' to point to the * beginning of the message. */ @@ -370,7 +340,7 @@ static int lcc_receive (lcc_connection_t *c, /* {{{ */ break; } lcc_chomp (buffer); - LCC_DEBUG ("receive: <-- %s\n", buffer); + lcc_tracef ("receive: <-- %s\n", buffer); res.lines[i] = strdup (buffer); if (res.lines[i] == NULL) @@ -541,7 +511,6 @@ static int lcc_open_netsocket (lcc_connection_t *c, /* {{{ */ if (fd < 0) { status = errno; - fd = -1; continue; } @@ -550,7 +519,6 @@ static int lcc_open_netsocket (lcc_connection_t *c, /* {{{ */ { status = errno; close (fd); - fd = -1; continue; } @@ -559,7 +527,6 @@ static int lcc_open_netsocket (lcc_connection_t *c, /* {{{ */ { status = errno; close (fd); - fd = -1; continue; } @@ -570,9 +537,11 @@ static int lcc_open_netsocket (lcc_connection_t *c, /* {{{ */ if (status != 0) { lcc_set_errno (c, status); + freeaddrinfo (ai_res); return (-1); } + freeaddrinfo (ai_res); return (0); } /* }}} int lcc_open_netsocket */ @@ -809,11 +778,11 @@ int lcc_putval (lcc_connection_t *c, const lcc_value_list_t *vl) /* {{{ */ SSTRCATF (command, "PUTVAL %s", lcc_strescape (ident_esc, ident_str, sizeof (ident_esc))); - if (vl->interval > 0) - SSTRCATF (command, " interval=%i", vl->interval); + if (vl->interval > 0.0) + SSTRCATF (command, " interval=%.3f", vl->interval); - if (vl->time > 0) - SSTRCATF (command, " %u", (unsigned int) vl->time); + if (vl->time > 0.0) + SSTRCATF (command, " %.3f", vl->time); else SSTRCAT (command, " N"); @@ -1105,6 +1074,35 @@ int lcc_string_to_identifier (lcc_connection_t *c, /* {{{ */ return (0); } /* }}} int lcc_string_to_identifier */ +int lcc_identifier_compare (const lcc_identifier_t *i0, /* {{{ */ + const lcc_identifier_t *i1) +{ + int status; + + if ((i0 == NULL) && (i1 == NULL)) + return (0); + else if (i0 == NULL) + return (-1); + else if (i1 == NULL) + return (1); + +#define CMP_FIELD(f) do { \ + status = strcmp (i0->f, i1->f); \ + if (status != 0) \ + return (status); \ +} while (0); + + CMP_FIELD (host); + CMP_FIELD (plugin); + CMP_FIELD (plugin_instance); + CMP_FIELD (type); + CMP_FIELD (type_instance); + +#undef CMP_FIELD + + return (0); +} /* }}} int lcc_identifier_compare */ + int lcc_sort_identifiers (lcc_connection_t *c, /* {{{ */ lcc_identifier_t *idents, size_t idents_num) { @@ -1114,7 +1112,8 @@ int lcc_sort_identifiers (lcc_connection_t *c, /* {{{ */ return (-1); } - qsort (idents, idents_num, sizeof (*idents), lcc_identifier_cmp); + qsort (idents, idents_num, sizeof (*idents), + (void *) lcc_identifier_compare); return (0); } /* }}} int lcc_sort_identifiers */