aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ndpi_serializer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/ndpi_serializer.c')
-rw-r--r--src/lib/ndpi_serializer.c87
1 files changed, 61 insertions, 26 deletions
diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c
index c1f52f89e..84e0697ce 100644
--- a/src/lib/ndpi_serializer.c
+++ b/src/lib/ndpi_serializer.c
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <errno.h>
+#include <inttypes.h>
#include <sys/types.h>
#include "ndpi_api.h"
@@ -38,6 +39,14 @@
#include <sys/endian.h>
#endif
+#ifdef WIN32
+#define NDPI_I64_FORMAT "%" PRId64
+#define NDPI_U64_FORMAT "%" PRIu64
+#else
+#define NDPI_I64_FORMAT "%lld"
+#define NDPI_U64_FORMAT "%llu"
+#endif
+
/* ********************************** */
u_int64_t ndpi_htonll(u_int64_t v) {
@@ -130,6 +139,32 @@ static int ndpi_json_string_escape(const char *src, int src_len, char *dst, int
/* ********************************** */
+#if UNUSED
+/*
+ * Similar to snprintf, this returns the number of bytes actually written
+ * in any case (unlike snprintf which returns, if the output is truncated,
+ * the number of bytes which *would have been* written, and a negative
+ * value on failures)
+ */
+static inline int ndpi_snappend(char *buf, size_t size, const char *fmt, ...) {
+ int wlen;
+ va_list va;
+
+ va_start(va, fmt);
+ wlen = snprintf(buf, size, fmt, va);
+ va_end(va);
+
+ if (wlen < 0)
+ wlen = 0;
+ else if (wlen >= size)
+ wlen = size-1;
+
+ return wlen;
+}
+#endif
+
+/* ********************************** */
+
void ndpi_reset_serializer(ndpi_serializer *_serializer) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
@@ -803,7 +838,7 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer,
serializer->status.buffer.size_used += snprintf((char *)
&serializer->buffer.data[serializer->status.buffer.size_used], buff_diff,
- "%llu", (unsigned long long)value);
+ NDPI_U64_FORMAT, (unsigned long long)value);
ndpi_serialize_json_post(_serializer);
} else if(serializer->fmt == ndpi_serialization_format_csv) {
@@ -812,7 +847,7 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_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,
- "%llu", (unsigned long long)value);
+ NDPI_U64_FORMAT, (unsigned long long)value);
} else {
if(value <= 0xffffffff) {
return(ndpi_serialize_uint32_uint32(_serializer, key, value));
@@ -935,7 +970,7 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer,
serializer->status.buffer.size_used += snprintf((char *)
&serializer->buffer.data[serializer->status.buffer.size_used],
- buff_diff, "%lld", (long long int)value);
+ buff_diff, NDPI_I64_FORMAT, (long long int)value);
ndpi_serialize_json_post(_serializer);
} else if(serializer->fmt == ndpi_serialization_format_csv) {
@@ -944,7 +979,7 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_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,
- "%lld", (long long int)value);
+ NDPI_I64_FORMAT, (long long int)value);
}
else {
if((value & 0xFFFFFFFF) == value) {
@@ -1138,9 +1173,9 @@ int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer,
/* ********************************** */
-static int ndpi_serialize_binary_int32(ndpi_serializer *_serializer,
- const char *key, u_int16_t klen,
- int32_t value) {
+int ndpi_serialize_binary_int32(ndpi_serializer *_serializer,
+ const char *key, u_int16_t klen,
+ int32_t value) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
u_int32_t needed;
@@ -1256,7 +1291,7 @@ int ndpi_serialize_binary_int64(ndpi_serializer *_serializer,
serializer->status.buffer.size_used += snprintf((char *)
&serializer->buffer.data[serializer->status.buffer.size_used], buff_diff,
- "%lld", (long long int)value);
+ NDPI_I64_FORMAT, (long long int)value);
ndpi_serialize_json_post(_serializer);
} else if(serializer->fmt == ndpi_serialization_format_csv) {
@@ -1264,7 +1299,7 @@ int ndpi_serialize_binary_int64(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,
- "%lld", (long long int)value);
+ NDPI_I64_FORMAT, (long long int)value);
} else {
if ((value & 0xFFFFFFFF) == value) {
return(ndpi_serialize_string_int32(_serializer, key, value));
@@ -1288,8 +1323,8 @@ int ndpi_serialize_string_int64(ndpi_serializer *_serializer,
/* ********************************** */
-static int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer,
- const char *key, u_int16_t klen, u_int32_t value) {
+int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer,
+ const char *key, u_int16_t klen, u_int32_t value) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
u_int32_t needed;
@@ -1389,9 +1424,9 @@ int ndpi_serialize_string_uint32_format(ndpi_serializer *_serializer,
/* ********************************** */
-static int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer,
- const char *key, u_int16_t klen,
- u_int64_t value) {
+int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer,
+ const char *key, u_int16_t klen,
+ u_int64_t value) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
u_int32_t needed;
@@ -1429,7 +1464,7 @@ static int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer,
serializer->status.buffer.size_used += snprintf((char *)
&serializer->buffer.data[serializer->status.buffer.size_used], buff_diff,
- "%llu", (unsigned long long)value);
+ NDPI_U64_FORMAT, (unsigned long long)value);
ndpi_serialize_json_post(_serializer);
} else if(serializer->fmt == ndpi_serialization_format_csv) {
@@ -1438,7 +1473,7 @@ static int ndpi_serialize_binary_uint64(ndpi_serializer *_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,
- "%llu", (unsigned long long)value);
+ NDPI_U64_FORMAT, (unsigned long long)value);
} else {
if(value <= 0xffffffff) {
return(ndpi_serialize_string_uint32(_serializer, key, value));
@@ -1462,11 +1497,11 @@ int ndpi_serialize_string_uint64(ndpi_serializer *_serializer,
/* ********************************** */
-static int ndpi_serialize_binary_float(ndpi_serializer *_serializer,
- const char *key,
- u_int16_t klen,
- float value,
- const char *format /* e.f. "%.2f" */) {
+int ndpi_serialize_binary_float(ndpi_serializer *_serializer,
+ const char *key,
+ u_int16_t klen,
+ float value,
+ const char *format /* e.f. "%.2f" */) {
ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer;
u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used;
u_int32_t needed;
@@ -1597,11 +1632,11 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer,
/* ********************************** */
/* Key is a <string, len> pair, value is a <string, len> pair */
-static int ndpi_serialize_binary_binary(ndpi_serializer *_serializer,
- const char *key,
- u_int16_t klen,
- const char *_value,
- u_int16_t vlen) {
+int ndpi_serialize_binary_binary(ndpi_serializer *_serializer,
+ const char *key,
+ u_int16_t klen,
+ const char *_value,
+ u_int16_t vlen) {
const char *value = _value ? _value : "";
if(ndpi_is_number(key, klen))