X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Futils_format_json.c;h=6a0c6642d14562ff309994e3c6447fc1a7266793;hp=1a0e151de27491cf918228e62490233d46a7fe48;hb=77ca1a45bab2f6adf9301723d0db68e5813a6d98;hpb=57b9e83320b35d4dbd1312db5fbf33ddf8ecd989 diff --git a/src/utils_format_json.c b/src/utils_format_json.c index 1a0e151d..6a0c6642 100644 --- a/src/utils_format_json.c +++ b/src/utils_format_json.c @@ -48,10 +48,10 @@ static int json_escape_string(char *buffer, size_t buffer_size, /* {{{ */ size_t dst_pos; if ((buffer == NULL) || (string == NULL)) - return (-EINVAL); + return -EINVAL; if (buffer_size < 3) - return (-ENOMEM); + return -ENOMEM; dst_pos = 0; @@ -59,7 +59,7 @@ static int json_escape_string(char *buffer, size_t buffer_size, /* {{{ */ do { \ if (dst_pos >= (buffer_size - 1)) { \ buffer[buffer_size - 1] = 0; \ - return (-ENOMEM); \ + return -ENOMEM; \ } \ buffer[dst_pos] = (c); \ dst_pos++; \ @@ -81,7 +81,7 @@ static int json_escape_string(char *buffer, size_t buffer_size, /* {{{ */ #undef BUFFER_ADD - return (0); + return 0; } /* }}} int json_escape_string */ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */ @@ -95,13 +95,13 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */ #define BUFFER_ADD(...) \ do { \ int status; \ - status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ + status = snprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) { \ sfree(rates); \ - return (-1); \ + return -1; \ } else if (((size_t)status) >= (buffer_size - offset)) { \ sfree(rates); \ - return (-ENOMEM); \ + return -ENOMEM; \ } else \ offset += ((size_t)status); \ } while (0) @@ -122,7 +122,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */ if (rates == NULL) { WARNING("utils_format_json: uc_get_rate failed."); sfree(rates); - return (-1); + return -1; } if (isfinite(rates[i])) @@ -130,7 +130,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */ else BUFFER_ADD("null"); } else if (ds->ds[i].type == DS_TYPE_COUNTER) - BUFFER_ADD("%llu", vl->values[i].counter); + BUFFER_ADD("%" PRIu64, (uint64_t)vl->values[i].counter); else if (ds->ds[i].type == DS_TYPE_DERIVE) BUFFER_ADD("%" PRIi64, vl->values[i].derive); else if (ds->ds[i].type == DS_TYPE_ABSOLUTE) @@ -138,7 +138,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */ else { ERROR("format_json: Unknown data source type: %i", ds->ds[i].type); sfree(rates); - return (-1); + return -1; } } /* for ds->ds_num */ BUFFER_ADD("]"); @@ -147,7 +147,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */ DEBUG("format_json: values_to_json: buffer = %s;", buffer); sfree(rates); - return (0); + return 0; } /* }}} int values_to_json */ static int dstypes_to_json(char *buffer, size_t buffer_size, /* {{{ */ @@ -159,11 +159,11 @@ static int dstypes_to_json(char *buffer, size_t buffer_size, /* {{{ */ #define BUFFER_ADD(...) \ do { \ int status; \ - status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ + status = snprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) \ - return (-1); \ + return -1; \ else if (((size_t)status) >= (buffer_size - offset)) \ - return (-ENOMEM); \ + return -ENOMEM; \ else \ offset += ((size_t)status); \ } while (0) @@ -181,7 +181,7 @@ static int dstypes_to_json(char *buffer, size_t buffer_size, /* {{{ */ DEBUG("format_json: dstypes_to_json: buffer = %s;", buffer); - return (0); + return 0; } /* }}} int dstypes_to_json */ static int dsnames_to_json(char *buffer, size_t buffer_size, /* {{{ */ @@ -193,11 +193,11 @@ static int dsnames_to_json(char *buffer, size_t buffer_size, /* {{{ */ #define BUFFER_ADD(...) \ do { \ int status; \ - status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ + status = snprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) \ - return (-1); \ + return -1; \ else if (((size_t)status) >= (buffer_size - offset)) \ - return (-ENOMEM); \ + return -ENOMEM; \ else \ offset += ((size_t)status); \ } while (0) @@ -215,7 +215,7 @@ static int dsnames_to_json(char *buffer, size_t buffer_size, /* {{{ */ DEBUG("format_json: dsnames_to_json: buffer = %s;", buffer); - return (0); + return 0; } /* }}} int dsnames_to_json */ static int meta_data_keys_to_json(char *buffer, size_t buffer_size, /* {{{ */ @@ -228,11 +228,11 @@ static int meta_data_keys_to_json(char *buffer, size_t buffer_size, /* {{{ */ #define BUFFER_ADD(...) \ do { \ - status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ + status = snprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) \ - return (-1); \ + return -1; \ else if (((size_t)status) >= (buffer_size - offset)) \ - return (-ENOMEM); \ + return -ENOMEM; \ else \ offset += ((size_t)status); \ } while (0) @@ -274,14 +274,14 @@ static int meta_data_keys_to_json(char *buffer, size_t buffer_size, /* {{{ */ } /* for (keys) */ if (offset == 0) - return (ENOENT); + return ENOENT; buffer[0] = '{'; /* replace leading ',' */ BUFFER_ADD("}"); #undef BUFFER_ADD - return (0); + return 0; } /* }}} int meta_data_keys_to_json */ static int meta_data_to_json(char *buffer, size_t buffer_size, /* {{{ */ @@ -291,11 +291,11 @@ static int meta_data_to_json(char *buffer, size_t buffer_size, /* {{{ */ int status; if ((buffer == NULL) || (buffer_size == 0) || (meta == NULL)) - return (EINVAL); + return EINVAL; status = meta_data_toc(meta, &keys); if (status <= 0) - return (status); + return status; keys_num = (size_t)status; status = meta_data_keys_to_json(buffer, buffer_size, meta, keys, keys_num); @@ -318,11 +318,11 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */ #define BUFFER_ADD(...) \ do { \ - status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ + status = snprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) \ - return (-1); \ + return -1; \ else if (((size_t)status) >= (buffer_size - offset)) \ - return (-ENOMEM); \ + return -ENOMEM; \ else \ offset += ((size_t)status); \ } while (0) @@ -333,17 +333,17 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */ status = values_to_json(temp, sizeof(temp), ds, vl, store_rates); if (status != 0) - return (status); + return status; BUFFER_ADD("\"values\":%s", temp); status = dstypes_to_json(temp, sizeof(temp), ds); if (status != 0) - return (status); + return status; BUFFER_ADD(",\"dstypes\":%s", temp); status = dsnames_to_json(temp, sizeof(temp), ds); if (status != 0) - return (status); + return status; BUFFER_ADD(",\"dsnames\":%s", temp); BUFFER_ADD(",\"time\":%.3f", CDTIME_T_TO_DOUBLE(vl->time)); @@ -353,7 +353,7 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */ do { \ status = json_escape_string(temp, sizeof(temp), (value)); \ if (status != 0) \ - return (status); \ + return status; \ BUFFER_ADD(",\"%s\":%s", (key), temp); \ } while (0) @@ -368,7 +368,7 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */ memset(meta_buffer, 0, sizeof(meta_buffer)); status = meta_data_to_json(meta_buffer, sizeof(meta_buffer), vl->meta); if (status != 0) - return (status); + return status; BUFFER_ADD(",\"meta\":%s", meta_buffer); } /* if (vl->meta != NULL) */ @@ -380,7 +380,7 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */ DEBUG("format_json: value_list_to_json: buffer = %s;", buffer); - return (0); + return 0; } /* }}} int value_list_to_json */ static int format_json_value_list_nocheck(char *buffer, /* {{{ */ @@ -394,14 +394,14 @@ static int format_json_value_list_nocheck(char *buffer, /* {{{ */ status = value_list_to_json(temp, sizeof(temp), ds, vl, store_rates); if (status != 0) - return (status); + return status; temp_size = strlen(temp); memcpy(buffer + (*ret_buffer_fill), temp, temp_size + 1); (*ret_buffer_fill) += temp_size; (*ret_buffer_free) -= temp_size; - return (0); + return 0; } /* }}} int format_json_value_list_nocheck */ int format_json_initialize(char *buffer, /* {{{ */ @@ -411,7 +411,7 @@ int format_json_initialize(char *buffer, /* {{{ */ if ((buffer == NULL) || (ret_buffer_fill == NULL) || (ret_buffer_free == NULL)) - return (-EINVAL); + return -EINVAL; buffer_fill = *ret_buffer_fill; buffer_free = *ret_buffer_free; @@ -420,13 +420,13 @@ int format_json_initialize(char *buffer, /* {{{ */ buffer_fill = 0; if (buffer_free < 3) - return (-ENOMEM); + return -ENOMEM; memset(buffer, 0, buffer_free); *ret_buffer_fill = buffer_fill; *ret_buffer_free = buffer_free; - return (0); + return 0; } /* }}} int format_json_initialize */ int format_json_finalize(char *buffer, /* {{{ */ @@ -435,15 +435,15 @@ int format_json_finalize(char *buffer, /* {{{ */ if ((buffer == NULL) || (ret_buffer_fill == NULL) || (ret_buffer_free == NULL)) - return (-EINVAL); + return -EINVAL; if (*ret_buffer_free < 2) - return (-ENOMEM); + return -ENOMEM; /* Replace the leading comma added in `value_list_to_json' with a square * bracket. */ if (buffer[0] != ',') - return (-EINVAL); + return -EINVAL; buffer[0] = '['; pos = *ret_buffer_fill; @@ -453,7 +453,7 @@ int format_json_finalize(char *buffer, /* {{{ */ (*ret_buffer_fill)++; (*ret_buffer_free)--; - return (0); + return 0; } /* }}} int format_json_finalize */ int format_json_value_list(char *buffer, /* {{{ */ @@ -462,14 +462,14 @@ int format_json_value_list(char *buffer, /* {{{ */ int store_rates) { if ((buffer == NULL) || (ret_buffer_fill == NULL) || (ret_buffer_free == NULL) || (ds == NULL) || (vl == NULL)) - return (-EINVAL); + return -EINVAL; if (*ret_buffer_free < 3) - return (-ENOMEM); + return -ENOMEM; - return (format_json_value_list_nocheck(buffer, ret_buffer_fill, - ret_buffer_free, ds, vl, store_rates, - (*ret_buffer_free) - 2)); + return format_json_value_list_nocheck(buffer, ret_buffer_fill, + ret_buffer_free, ds, vl, store_rates, + (*ret_buffer_free) - 2); } /* }}} int format_json_value_list */ #if HAVE_LIBYAJL @@ -478,7 +478,7 @@ static int json_add_string(yajl_gen g, char const *str) /* {{{ */ if (str == NULL) return (int)yajl_gen_null(g); - return (int)yajl_gen_string(g, (unsigned char const *)str, + return (int)yajl_gen_string(g, (const unsigned char *)str, (unsigned int)strlen(str)); } /* }}} int json_add_string */ @@ -500,6 +500,14 @@ static int json_add_string(yajl_gen g, char const *str) /* {{{ */ } \ } while (0) +#define CHECK_SUCCESS(cmd) \ + do { \ + yajl_gen_status s = (cmd); \ + if (s != yajl_gen_status_ok) { \ + return (int)s; \ + } \ + } while (0) + static int format_json_meta(yajl_gen g, notification_meta_t *meta) /* {{{ */ { if (meta == NULL) @@ -525,7 +533,7 @@ static int format_json_meta(yajl_gen g, notification_meta_t *meta) /* {{{ */ default: ERROR("format_json_meta: unknown meta data type %d (name \"%s\")", meta->type, meta->name); - yajl_gen_null(g); + CHECK_SUCCESS(yajl_gen_null(g)); } return format_json_meta(g, meta->next); @@ -544,14 +552,14 @@ static int format_time(yajl_gen g, cdtime_t t) /* {{{ */ static int format_alert(yajl_gen g, notification_t const *n) /* {{{ */ { - yajl_gen_array_open(g); - yajl_gen_map_open(g); /* BEGIN alert */ + CHECK_SUCCESS(yajl_gen_array_open(g)); /* BEGIN array */ + CHECK_SUCCESS(yajl_gen_map_open(g)); /* BEGIN alert */ /* * labels */ JSON_ADD(g, "labels"); - yajl_gen_map_open(g); /* BEGIN labels */ + CHECK_SUCCESS(yajl_gen_map_open(g)); /* BEGIN labels */ JSON_ADD(g, "alertname"); if (strncmp(n->plugin, n->type, strlen(n->plugin)) == 0) @@ -577,36 +585,40 @@ static int format_alert(yajl_gen g, notification_t const *n) /* {{{ */ } JSON_ADD(g, "severity"); - JSON_ADD(g, (n->severity == NOTIF_FAILURE) - ? "FAILURE" - : (n->severity == NOTIF_WARNING) - ? "WARNING" - : (n->severity == NOTIF_OKAY) ? "OKAY" : "UNKNOWN"); + JSON_ADD(g, + (n->severity == NOTIF_FAILURE) + ? "FAILURE" + : (n->severity == NOTIF_WARNING) + ? "WARNING" + : (n->severity == NOTIF_OKAY) ? "OKAY" : "UNKNOWN"); JSON_ADD(g, "service"); JSON_ADD(g, "collectd"); - yajl_gen_map_close(g); /* END labels */ + CHECK_SUCCESS(yajl_gen_map_close(g)); /* END labels */ /* * annotations */ JSON_ADD(g, "annotations"); - yajl_gen_map_open(g); /* BEGIN annotations */ + CHECK_SUCCESS(yajl_gen_map_open(g)); /* BEGIN annotations */ JSON_ADD(g, "summary"); JSON_ADD(g, n->message); - if (format_json_meta(g, n->meta) != 0) + if (format_json_meta(g, n->meta) != 0) { return -1; + } - yajl_gen_map_close(g); /* END annotations */ + CHECK_SUCCESS(yajl_gen_map_close(g)); /* END annotations */ JSON_ADD(g, "startsAt"); - format_time(g, n->time); + if (format_time(g, n->time) != 0) { + return -1; + } - yajl_gen_map_close(g); /* END alert */ - yajl_gen_array_close(g); + CHECK_SUCCESS(yajl_gen_map_close(g)); /* END alert */ + CHECK_SUCCESS(yajl_gen_array_close(g)); /* END array */ return 0; } /* }}} format_alert */ @@ -671,7 +683,11 @@ int format_json_notification(char *buffer, size_t buffer_size, /* {{{ */ } /* copy to output buffer */ - yajl_gen_get_buf(g, &out, &unused_out_len); + if (yajl_gen_get_buf(g, &out, &unused_out_len) != yajl_gen_status_ok) { + yajl_gen_clear(g); + yajl_gen_free(g); + return -1; + } sstrncpy(buffer, (void *)out, buffer_size); yajl_gen_clear(g);