X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl_json.c;h=b19730b855a47706be9313740dc685cd4e1ac133;hb=42ca41a0798e3a2b742f7da3bacc03fbaf6175fa;hp=3ba55603d329342e6a30fa86b6908531e3e36e73;hpb=0c004681a480e919b779584814eb396f6e6948ca;p=collectd.git diff --git a/src/curl_json.c b/src/curl_json.c index 3ba55603..b19730b8 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -28,7 +28,6 @@ #include "utils_avltree.h" #include "utils_complain.h" -#include #include #include @@ -117,7 +116,7 @@ static size_t cj_curl_callback (void *buf, /* {{{ */ len = size * nmemb; - if (len <= 0) + if (len == 0) return (len); db = user_data; @@ -132,17 +131,11 @@ static size_t cj_curl_callback (void *buf, /* {{{ */ return (len); #endif - if (status != yajl_status_ok) - { - unsigned char *msg = - yajl_get_error(db->yajl, /* verbose = */ 1, - /* jsonText = */ (unsigned char *) buf, (unsigned int) len); - ERROR ("curl_json plugin: yajl_parse failed: %s", msg); - yajl_free_error(db->yajl, msg); - return (0); /* abort write callback */ - } - - return (len); + unsigned char *msg = yajl_get_error(db->yajl, /* verbose = */ 1, + /* jsonText = */ (unsigned char *) buf, (unsigned int) len); + ERROR ("curl_json plugin: yajl_parse failed: %s", msg); + yajl_free_error(db->yajl, msg); + return (0); /* abort write callback */ } /* }}} size_t cj_curl_callback */ static int cj_get_type (cj_key_t *key) @@ -453,16 +446,19 @@ static c_avl_tree_t *cj_avl_create(void) static int cj_config_append_string (const char *name, struct curl_slist **dest, /* {{{ */ oconfig_item_t *ci) { + struct curl_slist *temp = NULL; if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING ("curl_json plugin: `%s' needs exactly one string argument.", name); return (-1); } - *dest = curl_slist_append(*dest, ci->values[0].value.string); - if (*dest == NULL) + temp = curl_slist_append(*dest, ci->values[0].value.string); + if (temp == NULL) return (-1); + *dest = temp; + return (0); } /* }}} int cj_config_append_string */ @@ -481,13 +477,12 @@ static int cj_config_add_key (cj_t *db, /* {{{ */ return (-1); } - key = (cj_key_t *) malloc (sizeof (*key)); + key = calloc (1, sizeof (*key)); if (key == NULL) { - ERROR ("curl_json plugin: malloc failed."); + ERROR ("curl_json plugin: calloc failed."); return (-1); } - memset (key, 0, sizeof (*key)); key->magic = CJ_KEY_MAGIC; if (strcasecmp ("Key", ci->key) == 0) @@ -526,71 +521,68 @@ static int cj_config_add_key (cj_t *db, /* {{{ */ break; } /* for (i = 0; i < ci->children_num; i++) */ - while (status == 0) + if (status != 0) { - if (key->type == NULL) - { - WARNING ("curl_json plugin: `Type' missing in `Key' block."); - status = -1; - } + cj_key_free (key); + return (-1); + } - break; - } /* while (status == 0) */ + if (key->type == NULL) + { + WARNING ("curl_json plugin: `Type' missing in `Key' block."); + cj_key_free (key); + return (-1); + } /* store path in a tree that will match the json map structure, example: * "httpd/requests/count", * "httpd/requests/current" -> * { "httpd": { "requests": { "count": $key, "current": $key } } } */ - if (status == 0) + char *ptr; + char *name; + c_avl_tree_t *tree; + + if (db->tree == NULL) + db->tree = cj_avl_create(); + + tree = db->tree; + ptr = key->path; + if (*ptr == '/') + ++ptr; + + name = ptr; + while ((ptr = strchr (name, '/')) != NULL) { - char *ptr; - char *name; char ent[PATH_MAX]; - c_avl_tree_t *tree; + c_avl_tree_t *value; + size_t len; - if (db->tree == NULL) - db->tree = cj_avl_create(); + len = ptr - name; + if (len == 0) + break; - tree = db->tree; - ptr = key->path; - if (*ptr == '/') - ++ptr; + len = COUCH_MIN(len, sizeof (ent)-1); + sstrncpy (ent, name, len+1); - name = ptr; - while (*ptr) - { - if (*ptr == '/') - { - c_avl_tree_t *value; - int len; - - len = ptr-name; - if (len == 0) - break; - len = COUCH_MIN(len, sizeof (ent)-1); - sstrncpy (ent, name, len+1); - - if (c_avl_get (tree, ent, (void *) &value) != 0) - { - value = cj_avl_create (); - c_avl_insert (tree, strdup (ent), value); - } - - tree = value; - name = ptr+1; - } - ++ptr; - } - if (*name) - c_avl_insert (tree, strdup(name), key); - else + if (c_avl_get (tree, ent, (void *) &value) != 0) { - ERROR ("curl_json plugin: invalid key: %s", key->path); - status = -1; + value = cj_avl_create (); + c_avl_insert (tree, strdup (ent), value); } + + tree = value; + name = ptr + 1; } + if (strlen (name) == 0) + { + ERROR ("curl_json plugin: invalid key: %s", key->path); + cj_key_free (key); + return (-1); + } + + c_avl_insert (tree, strdup (name), key); return (status); } /* }}} int cj_config_add_key */ @@ -625,7 +617,7 @@ static int cj_init_curl (cj_t *db) /* {{{ */ if (db->pass != NULL) credentials_size += strlen (db->pass); - db->credentials = (char *) malloc (credentials_size); + db->credentials = malloc (credentials_size); if (db->credentials == NULL) { ERROR ("curl_json plugin: malloc failed."); @@ -655,11 +647,9 @@ static int cj_init_curl (cj_t *db) /* {{{ */ if (db->timeout >= 0) curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, (long) db->timeout); else if (db->interval > 0) - curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, - CDTIME_T_TO_MS(db->timeout)); + curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, (long) CDTIME_T_TO_MS(db->timeout)); else - curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, - CDTIME_T_TO_MS(plugin_get_interval())); + curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, (long) CDTIME_T_TO_MS(plugin_get_interval())); #endif return (0); @@ -679,13 +669,12 @@ static int cj_config_add_url (oconfig_item_t *ci) /* {{{ */ return (-1); } - db = (cj_t *) malloc (sizeof (*db)); + db = calloc (1, sizeof (*db)); if (db == NULL) { - ERROR ("curl_json plugin: malloc failed."); + ERROR ("curl_json plugin: calloc failed."); return (-1); } - memset (db, 0, sizeof (*db)); db->timeout = -1; @@ -764,9 +753,6 @@ static int cj_config_add_url (oconfig_item_t *ci) /* {{{ */ { user_data_t ud; char *cb_name; - struct timespec interval = { 0, 0 }; - - CDTIME_T_TO_TIMESPEC (db->interval, &interval); if (db->instance == NULL) db->instance = strdup("default"); @@ -782,7 +768,7 @@ static int cj_config_add_url (oconfig_item_t *ci) /* {{{ */ db->instance, db->url ? db->url : db->sock); plugin_register_complex_read (/* group = */ NULL, cb_name, cj_read, - /* interval = */ (db->interval > 0) ? &interval : NULL, + /* interval = */ db->interval, &ud); sfree (cb_name); } @@ -876,7 +862,7 @@ static void cj_submit (cj_t *db, cj_key_t *key, value_t *value) /* {{{ */ static int cj_sock_perform (cj_t *db) /* {{{ */ { char errbuf[1024]; - struct sockaddr_un sa_unix = {}; + struct sockaddr_un sa_unix = { 0 }; sa_unix.sun_family = AF_UNIX; sstrncpy (sa_unix.sun_path, db->sock, sizeof (sa_unix.sun_path));