| 235 | } |
| 236 | |
| 237 | static void |
| 238 | output_json(const char *cmd, const struct rte_tel_data *d, int s) |
| 239 | { |
| 240 | char out_buf[MAX_OUTPUT_LEN]; |
| 241 | |
| 242 | char *cb_data_buf; |
| 243 | size_t buf_len, prefix_used, used = 0; |
| 244 | unsigned int i; |
| 245 | |
| 246 | RTE_BUILD_BUG_ON(sizeof(out_buf) < MAX_CMD_LEN + |
| 247 | RTE_TEL_MAX_SINGLE_STRING_LEN + 10); |
| 248 | |
| 249 | prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", |
| 250 | MAX_CMD_LEN, cmd); |
| 251 | cb_data_buf = &out_buf[prefix_used]; |
| 252 | buf_len = sizeof(out_buf) - prefix_used - 1; /* space for '}' */ |
| 253 | |
| 254 | switch (d->type) { |
| 255 | case TEL_NULL: |
| 256 | used = strlcpy(cb_data_buf, "null", buf_len); |
| 257 | break; |
| 258 | |
| 259 | case TEL_STRING: |
| 260 | used = rte_tel_json_str(cb_data_buf, buf_len, 0, d->data.str); |
| 261 | break; |
| 262 | |
| 263 | case TEL_DICT: |
| 264 | used = rte_tel_json_empty_obj(cb_data_buf, buf_len, 0); |
| 265 | for (i = 0; i < d->data_len; i++) { |
| 266 | const struct tel_dict_entry *v = &d->data.dict[i]; |
| 267 | switch (v->type) { |
| 268 | case RTE_TEL_STRING_VAL: |
| 269 | used = rte_tel_json_add_obj_str(cb_data_buf, |
| 270 | buf_len, used, |
| 271 | v->name, v->value.sval); |
| 272 | break; |
| 273 | case RTE_TEL_INT_VAL: |
| 274 | used = rte_tel_json_add_obj_int(cb_data_buf, |
| 275 | buf_len, used, |
| 276 | v->name, v->value.ival); |
| 277 | break; |
| 278 | case RTE_TEL_UINT_VAL: |
| 279 | used = rte_tel_json_add_obj_uint(cb_data_buf, |
| 280 | buf_len, used, |
| 281 | v->name, v->value.uval); |
| 282 | break; |
| 283 | case RTE_TEL_CONTAINER: |
| 284 | { |
| 285 | char *temp = malloc(buf_len); |
| 286 | if (temp == NULL) |
| 287 | break; |
| 288 | *temp = '\0'; /* ensure valid string */ |
| 289 | |
| 290 | const struct container *cont = |
| 291 | &v->value.container; |
| 292 | if (container_to_json(cont->data, |
| 293 | temp, buf_len) != 0) |
| 294 | used = rte_tel_json_add_obj_json( |
no test coverage detected