diff options
-rw-r--r-- | src/include/ndpi_api.h | 16 | ||||
-rw-r--r-- | src/lib/ndpi_serializer.c | 74 |
2 files changed, 84 insertions, 6 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h index 088837f98..0b4187ad2 100644 --- a/src/include/ndpi_api.h +++ b/src/include/ndpi_api.h @@ -867,10 +867,7 @@ extern "C" { int ndpi_init_serializer(ndpi_serializer *serializer, ndpi_serialization_format fmt); void ndpi_term_serializer(ndpi_serializer *serializer); void ndpi_reset_serializer(ndpi_serializer *serializer); - int ndpi_serialize_string_int32(ndpi_serializer *serializer, - const char *key, int32_t value); - int ndpi_serialize_string_int64(ndpi_serializer *serializer, - const char *key, int64_t value); + int ndpi_serialize_uint32_uint32(ndpi_serializer *serializer, u_int32_t key, u_int32_t value); int ndpi_serialize_uint32_uint64(ndpi_serializer *serializer, @@ -884,6 +881,13 @@ extern "C" { const char *format /* e.f. "%.2f" */); int ndpi_serialize_uint32_string(ndpi_serializer *serializer, u_int32_t key, const char *value); + int ndpi_serialize_uint32_boolean(ndpi_serializer *serializer, + u_int32_t key, u_int8_t value); + + int ndpi_serialize_string_int32(ndpi_serializer *serializer, + const char *key, int32_t value); + int ndpi_serialize_string_int64(ndpi_serializer *serializer, + const char *key, int64_t value); int ndpi_serialize_string_uint32(ndpi_serializer *serializer, const char *key, u_int32_t value); int ndpi_serialize_string_uint32_format(ndpi_serializer *serializer, @@ -896,10 +900,12 @@ extern "C" { int ndpi_serialize_string_binary(ndpi_serializer *_serializer, const char *key, const char *_value, u_int16_t vlen); - int ndpi_serialize_string_float(ndpi_serializer *serializer, const char *key, float value, const char *format /* e.f. "%.2f" */); + int ndpi_serialize_string_boolean(ndpi_serializer *serializer, + const char *key, u_int8_t value); + int ndpi_serialize_end_of_record(ndpi_serializer *serializer); int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, const char *key); diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c index 945e60b37..6875af342 100644 --- a/src/lib/ndpi_serializer.c +++ b/src/lib/ndpi_serializer.c @@ -816,6 +816,38 @@ int ndpi_serialize_uint32_string(ndpi_serializer *_serializer, /* ********************************** */ +int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, + u_int32_t key, u_int8_t value) { + ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; + u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t needed = 24; + + if(serializer->fmt != ndpi_serialization_format_json && + serializer->fmt != ndpi_serialization_format_csv) + return -1; + + if(buff_diff < needed) { + if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->status.size_used; + } + + if(serializer->fmt == ndpi_serialization_format_json) { + ndpi_serialize_json_pre(_serializer); + serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + "\"%u\":%s", key, value ? "true" : "false"); + ndpi_serialize_json_post(_serializer); + } else if(serializer->fmt == ndpi_serialization_format_csv) { + serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + "%s%s", (serializer->status.size_used > 0) ? serializer->csv_separator : "", + value ? "true" : "false"); + } + + return(0); +} + +/* ********************************** */ + static int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, const char *key, u_int16_t klen, int32_t value) { @@ -1182,7 +1214,6 @@ static int ndpi_serialize_binary_binary(ndpi_serializer *_serializer, buff_diff = serializer->buffer_size - serializer->status.size_used; serializer->status.size_used += ndpi_json_string_escape(value, vlen, (char *) &serializer->buffer[serializer->status.size_used], buff_diff); - buff_diff = serializer->buffer_size - serializer->status.size_used; ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, @@ -1215,6 +1246,47 @@ int ndpi_serialize_string_string(ndpi_serializer *_serializer, /* ********************************** */ +int ndpi_serialize_string_boolean(ndpi_serializer *_serializer, + const char *key, u_int8_t value) { + ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; + u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int16_t klen = strlen(key); + u_int32_t needed; + + if(serializer->fmt != ndpi_serialization_format_json && + serializer->fmt != ndpi_serialization_format_csv) + return -1; + + if(ndpi_is_number(key, klen)) + return(ndpi_serialize_uint32_boolean(_serializer, atoi(key), value)); + + needed = klen + 16; + + if(buff_diff < needed) { + if(ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->status.size_used; + } + + if(serializer->fmt == ndpi_serialization_format_json) { + ndpi_serialize_json_pre(_serializer); + serializer->status.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer[serializer->status.size_used], buff_diff); + buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, ":%s", + value ? "true" : "false"); + ndpi_serialize_json_post(_serializer); + } else if(serializer->fmt == ndpi_serialization_format_csv) { + serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, + "%s%s", (serializer->status.size_used > 0) ? serializer->csv_separator : "", + value ? "true" : "false"); + } + + return(0); +} + +/* ********************************** */ + /* Serialize start of nested block (JSON only)*/ int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, const char *key) { |