summaryrefslogtreecommitdiff
path: root/examples/c-json-stdout/c-json-stdout.c
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2020-08-14 15:24:40 +0200
committerToni Uhlig <matzeton@googlemail.com>2020-08-14 15:24:40 +0200
commit37e46a506ace9f010601a0429685c9c5eb4408b6 (patch)
tree0ed7f7938bcd472a7b7621815edbaba88b2731d2 /examples/c-json-stdout/c-json-stdout.c
parent4b9b695946150c2e167a57d9cc102e9ca44a5722 (diff)
c-json-stdout: fixed broken buffering
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'examples/c-json-stdout/c-json-stdout.c')
-rw-r--r--examples/c-json-stdout/c-json-stdout.c110
1 files changed, 56 insertions, 54 deletions
diff --git a/examples/c-json-stdout/c-json-stdout.c b/examples/c-json-stdout/c-json-stdout.c
index d3a312030..c6594588b 100644
--- a/examples/c-json-stdout/c-json-stdout.c
+++ b/examples/c-json-stdout/c-json-stdout.c
@@ -23,7 +23,7 @@ int main(void)
uint8_t buf[NETWORK_BUFFER_MAX_SIZE];
size_t buf_used = 0;
size_t json_start = 0;
- unsigned long long int buf_wanted = 0;
+ unsigned long long int json_bytes = 0;
#ifdef USE_JSON
jsmn_parser parser;
jsmntok_t tokens[128];
@@ -60,78 +60,80 @@ int main(void)
}
buf_used += bytes_read;
- if (buf_wanted == 0)
+ while (json_bytes == 0 && buf_used >= nDPIsrvd_JSON_BYTES + 1)
{
+ if (buf[nDPIsrvd_JSON_BYTES] != '{')
+ {
+ fprintf(stderr, "BUG: JSON invalid opening character: '%c'", buf[nDPIsrvd_JSON_BYTES]);
+ exit(1);
+ }
+
char * json_str_start = NULL;
- errno = 0;
- /* the first bytes are the textual representation of the following JSON string */
- buf_wanted = strtoull((char *)buf, &json_str_start, 10);
+ json_bytes = strtoull((char *)buf, &json_str_start, 10);
+ json_bytes += (uint8_t *)json_str_start - buf;
json_start = (uint8_t *)json_str_start - buf;
- buf_wanted += json_start;
if (errno == ERANGE)
{
- buf_used = 0;
- buf_wanted = 0;
- fprintf(stderr, "Size of JSON exceeds limit\n");
- continue;
+ fprintf(stderr, "BUG: Size of JSON exceeds limit");
+ exit(1);
}
if ((uint8_t *)json_str_start == buf)
{
- fprintf(stderr, "Missing size before JSON string: %.*s\n", (int)buf_used, buf);
- buf_used = 0;
- buf_wanted = 0;
- continue;
+ fprintf(stderr, "BUG: Missing size before JSON string: \"%.*s\"", nDPIsrvd_JSON_BYTES, buf);
+ exit(1);
}
- if (buf_wanted > sizeof(buf))
+ if (json_bytes > sizeof(buf))
{
- fprintf(stderr, "BUG: JSON string too big: %llu > %zu\n", buf_wanted, sizeof(buf));
- buf_used = 0;
- buf_wanted = 0;
- continue;
+ fprintf(stderr, "BUG: JSON string too big: %llu > %zu", json_bytes, sizeof(buf));
+ exit(1);
+ }
+ if (json_bytes > buf_used)
+ {
+ break;
}
- }
- /* buffered enough data (full JSON String) ? */
- if (buf_wanted > buf_used)
- {
- continue;
- }
- /* after buffering complete, last character should always be a '}' (end of object) */
- if (buf[buf_wanted - 1] != '}')
- {
- fprintf(stderr, "Invalid JSON string: %.*s\n", (int)buf_wanted, buf);
- buf_used = 0;
- buf_wanted = 0;
- continue;
- }
+ if (buf[json_bytes - 1] != '}')
+ {
+ fprintf(stderr, "BUG: Invalid JSON string: %.*s", (int)json_bytes, buf);
+ exit(1);
+ }
#ifdef USE_JSON
- int r;
- jsmn_init(&parser);
- r = jsmn_parse(&parser, (char *)(buf + json_start), buf_wanted - json_start,
- tokens, sizeof(tokens) / sizeof(tokens[0]));
- if (r < 0 || tokens[0].type != JSMN_OBJECT) {
- fprintf(stderr, "JSON parsing failed with return value %d at position %u\n", r, parser.pos);
- fprintf(stderr, "JSON string: '%.*s'\n", (int)(buf_wanted - json_start), (char *)(buf + json_start));
- }
+ int r;
+ jsmn_init(&parser);
+ r = jsmn_parse(&parser,
+ (char *)(buf + json_start),
+ json_bytes - json_start,
+ tokens,
+ sizeof(tokens) / sizeof(tokens[0]));
+ if (r < 0 || tokens[0].type != JSMN_OBJECT)
+ {
+ fprintf(stderr, "JSON parsing failed with return value %d at position %u\n", r, parser.pos);
+ fprintf(stderr, "JSON string: '%.*s'\n", (int)(json_bytes - json_start), (char *)(buf + json_start));
+ }
- for (int i = 1; i < r; i++) {
- if (i % 2 == 1) {
- printf("[%.*s : ", tokens[i].end - tokens[i].start,
- (char *)(buf + json_start) + tokens[i].start);
- } else {
- printf("%.*s] ", tokens[i].end - tokens[i].start,
- (char *)(buf + json_start) + tokens[i].start);
+ for (int i = 1; i < r; i++)
+ {
+ if (i % 2 == 1)
+ {
+ printf("[%.*s : ", tokens[i].end - tokens[i].start, (char *)(buf + json_start) + tokens[i].start);
+ }
+ else
+ {
+ printf("%.*s] ", tokens[i].end - tokens[i].start, (char *)(buf + json_start) + tokens[i].start);
+ }
}
- }
- printf("EoF\n");
+ printf("EoF\n");
#else
- printf("RECV[%llu,%zd]: '%.*s'\n\n", buf_wanted, bytes_read, (int)buf_wanted, buf);
+ printf("RECV[%llu,%zd]: '%.*s'\n\n", buf_wanted, bytes_read, (int)buf_wanted, buf);
#endif
- memmove(buf, buf + buf_wanted, buf_used - buf_wanted);
- buf_used -= buf_wanted;
- buf_wanted = 0;
+
+ memmove(buf, buf + json_bytes, buf_used - json_bytes);
+ buf_used -= json_bytes;
+ json_bytes = 0;
+ json_start = 0;
+ }
}
return 0;