X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flibcollectdclient%2Fclient.c;h=d13decdbade29a13a25af36c79148187990fcef6;hb=3b473acc5d4d27e5cf5101a4b8cc8a21c2bb7262;hp=75ac7b6da0b96c1d901007ab8dd1f2d4c0470e06;hpb=e7be1d7ea062e8d4d59c04c42e63d655188dc597;p=collectd.git diff --git a/src/libcollectdclient/client.c b/src/libcollectdclient/client.c index 75ac7b6d..d13decdb 100644 --- a/src/libcollectdclient/client.c +++ b/src/libcollectdclient/client.c @@ -164,27 +164,14 @@ static int lcc_set_errno (lcc_connection_t *c, int err) /* {{{ */ return (0); } /* }}} int lcc_set_errno */ -/* lcc_strdup: Since `strdup' is an XSI extension, we provide our own version - * here. */ -__attribute__((malloc, nonnull (1))) -static char *lcc_strdup (const char *str) /* {{{ */ -{ - size_t strsize; - char *ret; - - strsize = strlen (str) + 1; - ret = (char *) malloc (strsize); - if (ret != NULL) - memcpy (ret, str, strsize); - return (ret); -} /* }}} char *lcc_strdup */ - -__attribute__((nonnull (1, 2))) static char *lcc_strescape (char *dest, const char *src, size_t dest_size) /* {{{ */ { size_t dest_pos; size_t src_pos; + if ((dest == NULL) || (src == NULL)) + return (NULL); + dest_pos = 0; src_pos = 0; @@ -241,6 +228,53 @@ 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; @@ -338,7 +372,7 @@ static int lcc_receive (lcc_connection_t *c, /* {{{ */ lcc_chomp (buffer); LCC_DEBUG ("receive: <-- %s\n", buffer); - res.lines[i] = lcc_strdup (buffer); + res.lines[i] = strdup (buffer); if (res.lines[i] == NULL) { lcc_set_errno (c, ENOMEM); @@ -733,7 +767,7 @@ int lcc_getval (lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */ if (values_names != NULL) { - values_names[i] = lcc_strdup (key); + values_names[i] = strdup (key); if (values_names[i] == NULL) BAIL_OUT (ENOMEM); } @@ -1013,7 +1047,7 @@ int lcc_string_to_identifier (lcc_connection_t *c, /* {{{ */ char *type; char *type_instance; - string_copy = lcc_strdup (string); + string_copy = strdup (string); if (string_copy == NULL) { lcc_set_errno (c, ENOMEM); @@ -1069,4 +1103,17 @@ int lcc_string_to_identifier (lcc_connection_t *c, /* {{{ */ return (0); } /* }}} int lcc_string_to_identifier */ +int lcc_sort_identifiers (lcc_connection_t *c, /* {{{ */ + lcc_identifier_t *idents, size_t idents_num) +{ + if (idents == NULL) + { + lcc_set_errno (c, EINVAL); + return (-1); + } + + qsort (idents, idents_num, sizeof (*idents), lcc_identifier_cmp); + return (0); +} /* }}} int lcc_sort_identifiers */ + /* vim: set sw=2 sts=2 et fdm=marker : */