diff options
author | Luca Deri <deri@ntop.org> | 2021-11-30 22:15:26 +0100 |
---|---|---|
committer | Luca Deri <deri@ntop.org> | 2021-11-30 22:15:26 +0100 |
commit | 33557c5fbca3e6234022e9be72999a837551c91f (patch) | |
tree | e32465a63f22ba6a07476240916fc4d44d017026 /src/lib/ndpi_serializer.c | |
parent | 5e0befd56c1dc70f2f7831eaa5e94dbd47565d8d (diff) |
Improved CSV serialization
Diffstat (limited to 'src/lib/ndpi_serializer.c')
-rw-r--r-- | src/lib/ndpi_serializer.c | 213 |
1 files changed, 134 insertions, 79 deletions
diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c index 4d3c0788f..d184274ad 100644 --- a/src/lib/ndpi_serializer.c +++ b/src/lib/ndpi_serializer.c @@ -51,10 +51,10 @@ u_int64_t ndpi_htonll(u_int64_t v) { union { u_int32_t lv[2]; u_int64_t llv; } u; - + u.lv[0] = htonl(v >> 32); u.lv[1] = htonl(v & 0xFFFFFFFFULL); - + return(u.llv); } @@ -62,9 +62,9 @@ u_int64_t ndpi_htonll(u_int64_t v) { u_int64_t ndpi_ntohll(u_int64_t v) { union { u_int32_t lv[2]; u_int64_t llv; } u; - + u.llv = v; - + return((u_int64_t)ntohl(u.lv[0]) << 32) | (u_int64_t)ntohl(u.lv[1]); } @@ -72,10 +72,10 @@ u_int64_t ndpi_ntohll(u_int64_t v) { static int ndpi_is_number(const char *str, u_int32_t str_len) { unsigned int i; - + for(i = 0; i < str_len; i++) if(!isdigit(str[i])) return(0); - + return(1); } @@ -159,7 +159,7 @@ static inline int ndpi_snappend(char *buf, size_t size, const char *fmt, ...) { else if (wlen >= size) wlen = size-1; - return wlen; + return(wlen); } #endif @@ -190,7 +190,7 @@ void ndpi_reset_serializer(ndpi_serializer *_serializer) { void ndpi_serializer_skip_header(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - + serializer->status.flags |= NDPI_SERIALIZER_STATUS_HDR_DONE; } @@ -200,8 +200,9 @@ static int ndpi_init_serializer_buffer(ndpi_private_serializer_buffer *buffer, u buffer->initial_size = buffer->size = buffer_size; buffer->data = (u_int8_t *) calloc(buffer->size, sizeof(u_int8_t)); if(buffer->data == NULL) - return -1; - return 0; + return(-1); + + return(0); } /* ********************************** */ @@ -217,7 +218,7 @@ int ndpi_init_serializer_ll(ndpi_serializer *_serializer, if (ndpi_init_serializer_buffer(&serializer->buffer, buffer_size) != 0) return(-1); - + if(serializer->fmt == ndpi_serialization_format_json) { /* nothing to do */ @@ -280,12 +281,12 @@ static inline int ndpi_serializer_check_header_room(ndpi_private_serializer *ser u_int32_t buff_diff = serializer->header.size - serializer->status.header.size_used; if (buff_diff < needed) - if (ndpi_extend_serializer_buffer(&serializer->header, needed - buff_diff) < 0) - return -1; + if (ndpi_extend_serializer_buffer(&serializer->header, needed - buff_diff) < 0) + return(-1); buff_diff = serializer->header.size - serializer->status.header.size_used; - return buff_diff; + return(buff_diff); } /* ********************************** */ @@ -294,17 +295,17 @@ static inline int ndpi_serializer_header_uint32(ndpi_private_serializer *seriali int room; if (serializer->status.flags & NDPI_SERIALIZER_STATUS_HDR_DONE) - return 0; + return(0); room = ndpi_serializer_check_header_room(serializer, 12); if (room < 0) - return -1; + return(-1); - serializer->status.header.size_used += snprintf((char *) &serializer->header.data[serializer->status.header.size_used], + serializer->status.header.size_used += snprintf((char *) &serializer->header.data[serializer->status.header.size_used], room, "%s%u", (serializer->status.header.size_used > 0) ? serializer->csv_separator : "", key); - return 0; + return(0); } /* ********************************** */ @@ -313,12 +314,12 @@ static inline int ndpi_serializer_header_string(ndpi_private_serializer *seriali int room; if (serializer->status.flags & NDPI_SERIALIZER_STATUS_HDR_DONE) - return 0; + return(0); room = ndpi_serializer_check_header_room(serializer, klen + 4); if (room < 0) - return -1; + return(-1); if (serializer->status.header.size_used > 0) { int slen = strlen(serializer->csv_separator); @@ -333,7 +334,7 @@ static inline int ndpi_serializer_header_string(ndpi_private_serializer *seriali serializer->header.data[serializer->status.header.size_used] = '\0'; - return 0; + return(0); } /* ********************************** */ @@ -393,7 +394,7 @@ char* ndpi_serializer_get_header(ndpi_serializer *_serializer, u_int32_t *buffer if(buf == NULL) { *buffer_len = 0; - return ""; + return(""); } /* NULL terminate the buffer */ @@ -409,7 +410,8 @@ char* ndpi_serializer_get_header(ndpi_serializer *_serializer, u_int32_t *buffer ndpi_serialization_format ndpi_serializer_get_format(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - return serializer->fmt; + + return(serializer->fmt); } /* ********************************** */ @@ -587,7 +589,7 @@ int ndpi_serialize_raw_record(ndpi_serializer *_serializer, u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int16_t needed = record_len; u_int8_t add_comma = 0; - + if(serializer->fmt == ndpi_serialization_format_json) { needed += 1; @@ -596,21 +598,21 @@ int ndpi_serialize_raw_record(ndpi_serializer *_serializer, else needed += 2, add_comma = 1; } - + if(buff_diff < needed) { if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) return(-1); - + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - if(serializer->fmt == ndpi_serialization_format_json) { + if(serializer->fmt == ndpi_serialization_format_json) { if(add_comma) serializer->buffer.data[serializer->status.buffer.size_used-1] = ','; else serializer->status.buffer.size_used--; } - + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], record, record_len); serializer->status.buffer.size_used += record_len; @@ -618,9 +620,9 @@ int ndpi_serialize_raw_record(ndpi_serializer *_serializer, serializer->buffer.data[serializer->status.buffer.size_used] = ']'; if(add_comma) serializer->status.buffer.size_used++; } - + ndpi_serialize_end_of_record(_serializer); - + return(0); } @@ -661,7 +663,7 @@ int ndpi_serialize_end_of_record(ndpi_serializer *_serializer) { } serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_NOT_EMPTY; - + return(0); } @@ -675,7 +677,7 @@ static inline void ndpi_serialize_csv_pre(ndpi_private_serializer *serializer) { } else { if(serializer->buffer.size > serializer->status.buffer.size_used) serializer->buffer.data[serializer->status.buffer.size_used] = serializer->csv_separator[0]; - + serializer->status.buffer.size_used++; } } @@ -700,7 +702,7 @@ static inline void ndpi_serialize_json_pre(ndpi_serializer *_serializer) { serializer->status.buffer.size_used--; /* Remove ']' */ if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOL) serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOL; - else + else serializer->buffer.data[serializer->status.buffer.size_used++] = ','; } else { if(serializer->status.flags & NDPI_SERIALIZER_STATUS_SOB) @@ -771,13 +773,13 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); ndpi_serialize_json_post(_serializer); @@ -838,13 +840,13 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, NDPI_U64_FORMAT, (unsigned long long)value); @@ -900,16 +902,16 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, if(serializer->fmt == ndpi_serialization_format_json) { ndpi_serialize_json_pre(_serializer); - + if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); ndpi_serialize_json_post(_serializer); @@ -917,7 +919,7 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); } else { @@ -970,14 +972,14 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, NDPI_I64_FORMAT, (long long int)value); ndpi_serialize_json_post(_serializer); @@ -1092,7 +1094,7 @@ static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } @@ -1104,7 +1106,7 @@ static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value); } else { @@ -1143,7 +1145,7 @@ int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, if(serializer->fmt != ndpi_serialization_format_json && serializer->fmt != ndpi_serialization_format_csv) - return -1; + return(-1); if(buff_diff < needed) { if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) @@ -1155,14 +1157,14 @@ int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); ndpi_serialize_json_post(_serializer); @@ -1213,12 +1215,12 @@ int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - - serializer->status.buffer.size_used += snprintf((char *) + + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); ndpi_serialize_json_post(_serializer); @@ -1246,7 +1248,7 @@ int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, } serializer->status.flags |= NDPI_SERIALIZER_STATUS_NOT_EMPTY; - + return(0); } @@ -1291,13 +1293,13 @@ int ndpi_serialize_binary_int64(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, NDPI_I64_FORMAT, (long long int)value); @@ -1337,6 +1339,34 @@ int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; + if(serializer->fmt == ndpi_serialization_format_csv) { + /* Key is ignored */ + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + u_int16_t needed; + char _value[16]; + + snprintf(_value, sizeof(_value), "%u", value); + needed = strlen(_value) + 1 /* CVS separator */; + + if(buff_diff < needed) { + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) + return(-1); + else + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + } + + if(!(serializer->status.flags & NDPI_SERIALIZER_STATUS_HDR_DONE)) { + if(ndpi_serializer_header_string(serializer, key, klen) < 0) + return(-1); + } + + ndpi_serialize_csv_pre(serializer); + needed--; + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], _value, needed); + serializer->status.buffer.size_used += needed; + return(0); + } + if(ndpi_is_number(key, klen)) return(ndpi_serialize_uint32_uint32(_serializer, atoi(key), value)); @@ -1363,15 +1393,15 @@ int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], - buff_diff, "%u", value); + serializer->status.buffer.size_used += snprintf((char *) + &serializer->buffer.data[serializer->status.buffer.size_used], + buff_diff, "%u", value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { @@ -1379,8 +1409,8 @@ int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; serializer->status.buffer.size_used += snprintf((char *) - &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, - "%u", value); + &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + "%u", value); } else { if(value <= 0xff) { serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_uint8; @@ -1464,13 +1494,13 @@ int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, NDPI_U64_FORMAT, (unsigned long long)value); @@ -1639,7 +1669,7 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer, /* ********************************** */ -/* Key is a <string, len> pair, value is a <string, len> pair */ +/* Key is a <string, len> pair, value is a <string, len> pair */ int ndpi_serialize_binary_binary(ndpi_serializer *_serializer, const char *key, u_int16_t klen, @@ -1650,7 +1680,7 @@ int ndpi_serialize_binary_binary(ndpi_serializer *_serializer, if(ndpi_is_number(key, klen)) return(ndpi_serialize_uint32_binary(_serializer, atoi(key), value, vlen)); - return ndpi_serialize_binary_raw(_serializer, key, klen, value, vlen, 1 /* escape */); + return(ndpi_serialize_binary_raw(_serializer, key, klen, value, vlen, 1 /* escape */)); } /* ********************************** */ @@ -1668,7 +1698,32 @@ int ndpi_serialize_string_binary(ndpi_serializer *_serializer, int ndpi_serialize_string_string(ndpi_serializer *_serializer, const char *key, const char *_value) { const char *value = _value ? _value : ""; - return(ndpi_serialize_binary_binary(_serializer, key, strlen(key), value, strlen(value))); + ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; + + if(serializer->fmt == ndpi_serialization_format_csv) { + /* Key is ignored */ + u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + u_int16_t needed = strlen(_value) + 1 /* CVS separator */; + + if(buff_diff < needed) { + if(ndpi_extend_serializer_buffer(&serializer->buffer, needed - buff_diff) < 0) + return(-1); + else + buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + } + + if(!(serializer->status.flags & NDPI_SERIALIZER_STATUS_HDR_DONE)) { + if(ndpi_serializer_header_string(serializer, key, strlen(key)) < 0) + return(-1); + } + + ndpi_serialize_csv_pre(serializer); + needed--; + memcpy(&serializer->buffer.data[serializer->status.buffer.size_used], _value, needed); + serializer->status.buffer.size_used += needed; + return(0); + } else + return(ndpi_serialize_binary_binary(_serializer, key, strlen(key), value, strlen(value))); } /* ********************************** */ @@ -1689,7 +1744,7 @@ int ndpi_serialize_binary_boolean(ndpi_serializer *_serializer, if(serializer->fmt != ndpi_serialization_format_json && serializer->fmt != ndpi_serialization_format_csv) - return -1; + return(-1); if(ndpi_is_number(key, klen)) return(ndpi_serialize_uint32_boolean(_serializer, atoi(key), value)); @@ -1787,7 +1842,7 @@ int ndpi_serialize_start_of_list(ndpi_serializer *_serializer, const char *key = _key ? _key : ""; u_int16_t klen = strlen(key); - return ndpi_serialize_start_of_list_binary(_serializer, key, klen); + return(ndpi_serialize_start_of_list_binary(_serializer, key, klen)); } /* ********************************** */ @@ -1821,7 +1876,7 @@ int ndpi_serialize_start_of_block_binary(ndpi_serializer *_serializer, u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; - if(serializer->fmt != ndpi_serialization_format_json && + if(serializer->fmt != ndpi_serialization_format_json && serializer->fmt != ndpi_serialization_format_tlv) return(-1); @@ -1841,7 +1896,7 @@ int ndpi_serialize_start_of_block_binary(ndpi_serializer *_serializer, serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": {"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; ndpi_serialize_json_post(_serializer); - + serializer->status.flags |= NDPI_SERIALIZER_STATUS_SOB; } else /* ndpi_serialization_format_tlv */ { serializer->buffer.data[serializer->status.buffer.size_used++] = ndpi_serialization_start_of_block; @@ -1859,7 +1914,7 @@ int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, const char *key = _key ? _key : ""; u_int16_t klen = strlen(key); - return ndpi_serialize_start_of_block_binary(_serializer, key, klen); + return(ndpi_serialize_start_of_block_binary(_serializer, key, klen)); } /* ********************************** */ @@ -1870,7 +1925,7 @@ int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) { u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; u_int32_t needed; - if(serializer->fmt != ndpi_serialization_format_json && + if(serializer->fmt != ndpi_serialization_format_json && serializer->fmt != ndpi_serialization_format_tlv) return(-1); @@ -1907,8 +1962,8 @@ void ndpi_serializer_create_snapshot(ndpi_serializer *_serializer) { (serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY) ? " ARRAY" : "", (serializer->status.flags & NDPI_SERIALIZER_STATUS_EOR) ? " EOR" : "" ); -#endif - +#endif + memcpy(&serializer->snapshot, &serializer->status, sizeof(ndpi_private_serializer_status)); serializer->has_snapshot = 1; } @@ -1917,7 +1972,7 @@ void ndpi_serializer_create_snapshot(ndpi_serializer *_serializer) { void ndpi_serializer_rollback_snapshot(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; - + if(serializer->has_snapshot) { memcpy(&serializer->status, &serializer->snapshot, sizeof(ndpi_private_serializer_status)); serializer->has_snapshot = 0; @@ -1929,7 +1984,7 @@ void ndpi_serializer_rollback_snapshot(ndpi_serializer *_serializer) { serializer->buffer.data[0] = ' '; serializer->buffer.data[serializer->status.buffer.size_used-1] = '}'; } - } + } } } |