summaryrefslogtreecommitdiffstats
path: root/libnetdata
diff options
context:
space:
mode:
authorPavlos Emm. Katsoulakis <paul@netdata.rocks>2019-06-28 08:27:57 +0200
committerPavlos Emm. Katsoulakis <paul@netdata.rocks>2019-06-28 08:27:57 +0200
commit171d8f5d01f17dddbd531139b86e1a1c96f95b0d (patch)
tree7b2f049259656e4c14c3d7e23a639964ebb2e07b /libnetdata
parent5d5266dc1a863d877d91cab232b6369091a198ee (diff)
Revert "Easily disable alarms, by persisting the silencers configuration (#6274)"
This reverts commit 60a73e90de2aa1c2eaae2ebbc45dd1fb96034df2. Emergency rollback of potential culprit as per issue #6356 Will be re-merging the change after investigation
Diffstat (limited to 'libnetdata')
-rw-r--r--libnetdata/Makefile.am2
-rw-r--r--libnetdata/health/Makefile.am8
-rw-r--r--libnetdata/health/health.c154
-rw-r--r--libnetdata/health/health.h54
-rw-r--r--libnetdata/json/Makefile.am9
-rw-r--r--libnetdata/json/README.md5
-rw-r--r--libnetdata/json/jsmn.c326
-rw-r--r--libnetdata/json/jsmn.h75
-rw-r--r--libnetdata/json/json.c546
-rw-r--r--libnetdata/json/json.h72
-rw-r--r--libnetdata/libnetdata.h2
11 files changed, 0 insertions, 1253 deletions
diff --git a/libnetdata/Makefile.am b/libnetdata/Makefile.am
index 8f41d82105..d2710f0a3e 100644
--- a/libnetdata/Makefile.am
+++ b/libnetdata/Makefile.am
@@ -21,8 +21,6 @@ SUBDIRS = \
storage_number \
threads \
url \
- json \
- health \
$(NULL)
dist_noinst_DATA = \
diff --git a/libnetdata/health/Makefile.am b/libnetdata/health/Makefile.am
deleted file mode 100644
index 9b7995f175..0000000000
--- a/libnetdata/health/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-AUTOMAKE_OPTIONS = subdir-objects
-MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
-
-
-dist_noinst_DATA = \
- $(NULL)
diff --git a/libnetdata/health/health.c b/libnetdata/health/health.c
deleted file mode 100644
index b3d342d406..0000000000
--- a/libnetdata/health/health.c
+++ /dev/null
@@ -1,154 +0,0 @@
-#include "health.h"
-
-/**
- * Create Silencer
- *
- * Allocate a new silencer to Netdata.
- *
- * @return It returns the address off the silencer on success and NULL otherwise
- */
-SILENCER *create_silencer(void) {
- SILENCER *t = callocz(1, sizeof(SILENCER));
- debug(D_HEALTH, "HEALTH command API: Created empty silencer");
-
- return t;
-}
-
-/**
- * Health Silencers add
- *
- * Add more one silencer to the list of silenecers.
- *
- * @param silencer
- */
-void health_silencers_add(SILENCER *silencer) {
- // Add the created instance to the linked list in silencers
- silencer->next = silencers->silencers;
- silencers->silencers = silencer;
- debug(D_HEALTH, "HEALTH command API: Added silencer %s:%s:%s:%s:%s", silencer->alarms,
- silencer->charts, silencer->contexts, silencer->hosts, silencer->families
- );
-}
-
-/**
- * Silencers Add Parameter
- *
- * Create a new silencer and adjust the variables
- *
- * @param silencer a pointer to the silencer that will be adjusted
- * @param key the key value sent by client
- * @param value the value sent to the key
- *
- * @return It returns the silencer configured on success and NULL otherwise
- */
-SILENCER *health_silencers_addparam(SILENCER *silencer, char *key, char *value) {
- static uint32_t
- hash_alarm = 0,
- hash_template = 0,
- hash_chart = 0,
- hash_context = 0,
- hash_host = 0,
- hash_families = 0;
-
- if (unlikely(!hash_alarm)) {
- hash_alarm = simple_uhash(HEALTH_ALARM_KEY);
- hash_template = simple_uhash(HEALTH_TEMPLATE_KEY);
- hash_chart = simple_uhash(HEALTH_CHART_KEY);
- hash_context = simple_uhash(HEALTH_CONTEXT_KEY);
- hash_host = simple_uhash(HEALTH_HOST_KEY);
- hash_families = simple_uhash(HEALTH_FAMILIES_KEY);
- }
-
- uint32_t hash = simple_uhash(key);
- if (unlikely(silencer == NULL)) {
- if (
- (hash == hash_alarm && !strcasecmp(key, HEALTH_ALARM_KEY)) ||
- (hash == hash_template && !strcasecmp(key, HEALTH_TEMPLATE_KEY)) ||
- (hash == hash_chart && !strcasecmp(key, HEALTH_CHART_KEY)) ||
- (hash == hash_context && !strcasecmp(key, HEALTH_CONTEXT_KEY)) ||
- (hash == hash_host && !strcasecmp(key, HEALTH_HOST_KEY)) ||
- (hash == hash_families && !strcasecmp(key, HEALTH_FAMILIES_KEY))
- ) {
- silencer = create_silencer();
- if(!silencer) {
- error("Cannot add a new silencer to Netdata");
- return NULL;
- }
- }
- }
-
- if (hash == hash_alarm && !strcasecmp(key, HEALTH_ALARM_KEY)) {
- silencer->alarms = strdupz(value);
- silencer->alarms_pattern = simple_pattern_create(silencer->alarms, NULL, SIMPLE_PATTERN_EXACT);
- } else if (hash == hash_chart && !strcasecmp(key, HEALTH_CHART_KEY)) {
- silencer->charts = strdupz(value);
- silencer->charts_pattern = simple_pattern_create(silencer->charts, NULL, SIMPLE_PATTERN_EXACT);
- } else if (hash == hash_context && !strcasecmp(key, HEALTH_CONTEXT_KEY)) {
- silencer->contexts = strdupz(value);
- silencer->contexts_pattern = simple_pattern_create(silencer->contexts, NULL, SIMPLE_PATTERN_EXACT);
- } else if (hash == hash_host && !strcasecmp(key, HEALTH_HOST_KEY)) {
- silencer->hosts = strdupz(value);
- silencer->hosts_pattern = simple_pattern_create(silencer->hosts, NULL, SIMPLE_PATTERN_EXACT);
- } else if (hash == hash_families && !strcasecmp(key, HEALTH_FAMILIES_KEY)) {
- silencer->families = strdupz(value);
- silencer->families_pattern = simple_pattern_create(silencer->families, NULL, SIMPLE_PATTERN_EXACT);
- }
-
- return silencer;
-}
-
-/**
- * JSON Read Callback
- *
- * Callback called by netdata to create the silencer.
- *
- * @param e the main json structure
- *
- * @return It always return 0.
- */
-int health_silencers_json_read_callback(JSON_ENTRY *e)
-{
- switch(e->type) {
- case JSON_OBJECT:
-#ifndef ENABLE_JSONC
- e->callback_function = health_silencers_json_read_callback;
- if(e->name && strcmp(e->name,"")) {
- // init silencer
- debug(D_HEALTH, "JSON: Got object with a name, initializing new silencer for %s",e->name);
-#endif
- e->callback_data = create_silencer();
- if(e->callback_data) {
- health_silencers_add(e->callback_data);
- }
-#ifndef ENABLE_JSONC
- }
-#endif
- break;
-
- case JSON_ARRAY:
- e->callback_function = health_silencers_json_read_callback;
- break;
-
- case JSON_STRING:
- if(!strcmp(e->name,"type")) {
- debug(D_HEALTH, "JSON: Processing type=%s",e->data.string);
- if (!strcmp(e->data.string,"SILENCE")) silencers->stype = STYPE_SILENCE_NOTIFICATIONS;
- else if (!strcmp(e->data.string,"DISABLE")) silencers->stype = STYPE_DISABLE_ALARMS;
- } else {
- debug(D_HEALTH, "JSON: Adding %s=%s", e->name, e->data.string);
- health_silencers_addparam(e->callback_data, e->name, e->data.string);
- }
- break;
-
- case JSON_BOOLEAN:
- debug(D_HEALTH, "JSON: Processing all_alarms");
- silencers->all_alarms=e->data.boolean?1:0;
- break;
-
- case JSON_NUMBER:
- case JSON_NULL:
- break;
- }
-
- return 0;
-}
diff --git a/libnetdata/health/health.h b/libnetdata/health/health.h
deleted file mode 100644
index 7d560fe95c..0000000000
--- a/libnetdata/health/health.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef NETDATA_HEALTH_LIB
-# define NETDATA_HEALTH_LIB 1
-
-# include "../libnetdata.h"
-
-#define HEALTH_ALARM_KEY "alarm"
-#define HEALTH_TEMPLATE_KEY "template"
-#define HEALTH_CONTEXT_KEY "context"
-#define HEALTH_CHART_KEY "chart"
-#define HEALTH_HOST_KEY "hosts"
-#define HEALTH_OS_KEY "os"
-#define HEALTH_FAMILIES_KEY "families"
-#define HEALTH_LOOKUP_KEY "lookup"
-#define HEALTH_CALC_KEY "calc"
-
-typedef struct silencer {
- char *alarms;
- SIMPLE_PATTERN *alarms_pattern;
-
- char *hosts;
- SIMPLE_PATTERN *hosts_pattern;
-
- char *contexts;
- SIMPLE_PATTERN *contexts_pattern;
-
- char *charts;
- SIMPLE_PATTERN *charts_pattern;
-
- char *families;
- SIMPLE_PATTERN *families_pattern;
-
- struct silencer *next;
-} SILENCER;
-
-typedef enum silence_type {
- STYPE_NONE,
- STYPE_DISABLE_ALARMS,
- STYPE_SILENCE_NOTIFICATIONS
-} SILENCE_TYPE;
-
-typedef struct silencers {
- int all_alarms;
- SILENCE_TYPE stype;
- SILENCER *silencers;
-} SILENCERS;
-
-SILENCERS *silencers;
-
-extern SILENCER *create_silencer(void);
-extern int health_silencers_json_read_callback(JSON_ENTRY *e);
-extern void health_silencers_add(SILENCER *silencer);
-extern SILENCER * health_silencers_addparam(SILENCER *silencer, char *key, char *value);
-
-#endif
diff --git a/libnetdata/json/Makefile.am b/libnetdata/json/Makefile.am
deleted file mode 100644
index 1cb69ed99a..0000000000
--- a/libnetdata/json/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-AUTOMAKE_OPTIONS = subdir-objects
-MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
-
-
-dist_noinst_DATA = \
- README.md \
- $(NULL)
diff --git a/libnetdata/json/README.md b/libnetdata/json/README.md
deleted file mode 100644
index fd6cb0f319..0000000000
--- a/libnetdata/json/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# json
-
-`json` contains a parser for json strings, based on `jsmn` (https://github.com/zserge/jsmn), but case you have installed the JSON-C library, the installation script will prefer it, you can also force its use with `--enable-jsonc` in the compilation time.
-
-[![analytics](https://www.google-analytics.com/collect?v=1&aip=1&t=pageview&_s=1&ds=github&dr=https%3A%2F%2Fgithub.com%2Fnetdata%2Fnetdata&dl=https%3A%2F%2Fmy-netdata.io%2Fgithub%2Flibnetdata%2Fjson%2FREADME&_u=MAC~&cid=5792dfd7-8dc4-476b-af31-da2fdb9f93d2&tid=UA-64295674-3)]()
diff --git a/libnetdata/json/jsmn.c b/libnetdata/json/jsmn.c
deleted file mode 100644
index c8d9e73db9..0000000000
--- a/libnetdata/json/jsmn.c
+++ /dev/null
@@ -1,326 +0,0 @@
-#include <stdlib.h>
-
-#include "jsmn.h"
-
-/**
- * Alloc token
- *
- * Allocates a fresh unused token from the token pull.
- *
- * @param parser the controller
- * @param tokens the tokens I am working
- * @param num_tokens the number total of tokens.
- *
- * @return it returns the next token to work.
- */
-static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
- jsmntok_t *tokens, size_t num_tokens) {
- jsmntok_t *tok;
- if (parser->toknext >= num_tokens) {
- return NULL;
- }
- tok = &tokens[parser->toknext++];
- tok->start = tok->end = -1;
- tok->size = 0;
-#ifdef JSMN_PARENT_LINKS
- tok->parent = -1;
-#endif
- return tok;
-}
-
-/**
- * Fill Token
- *
- * Fills token type and boundaries.
- *
- * @param token the structure to set the values
- * @param type is the token type
- * @param start is the first position of the value
- * @param end is the end of the value
- */
-static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
- int start, int end) {
- token->type = type;
- token->start = start;
- token->end = end;
- token->size = 0;
-}
-
-/**
- * Parse primitive
- *
- * Fills next available token with JSON primitive.
- *
- * @param parser is the control structure
- * @param js is the json string
- * @param type is the token type
- */
-static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js,
- size_t len, jsmntok_t *tokens, size_t num_tokens) {
- jsmntok_t *token;
- int start;
-
- start = parser->pos;
-
- for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
- switch (js[parser->pos]) {
-#ifndef JSMN_STRICT
- /* In strict mode primitive must be followed by "," or "}" or "]" */
- case ':':
-#endif
- case '\t' : case '\r' : case '\n' : case ' ' :
- case ',' : case ']' : case '}' :
- goto found;
- }
- if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
- parser->pos = start;
- return JSMN_ERROR_INVAL;
- }
- }
-#ifdef JSMN_STRICT
- /* In strict mode primitive must be followed by a comma/object/array */
- parser->pos = start;
- return JSMN_ERROR_PART;
-#endif
-
- found:
- if (tokens == NULL) {
- parser->pos--;
- return 0;
- }
- token = jsmn_alloc_token(parser, tokens, num_tokens);
- if (token == NULL) {
- parser->pos = start;
- return JSMN_ERROR_NOMEM;
- }
- jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
-#ifdef JSMN_PARENT_LINKS
- token->parent = parser->toksuper;
-#endif
- parser->pos--;
- return 0;
-}
-
-/**
- * Parse string
- *
- * Fills next token with JSON string.
- *
- * @param parser is the control structure
- * @param js is the json string
- * @param len is the js length
- * @param tokens is structure with the tokens mapped.
- * @param num_tokens is the total number of tokens
- *
- * @return It returns 0 on success and another integer otherwise
- */
-static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js,
- size_t len, jsmntok_t *tokens, size_t num_tokens) {
- jsmntok_t *token;
-
- int start = parser->pos;
-
- parser->pos++;
-
- /* Skip starting quote */
- for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
- char c = js[parser->pos];
-
- /* Quote: end of string */
- if (c == '\"') {
- if (tokens == NULL) {
- return 0;
- }
- token = jsmn_alloc_token(parser, tokens, num_tokens);
- if (token == NULL) {
- parser->pos = start;
- return JSMN_ERROR_NOMEM;
- }
- jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
-#ifdef JSMN_PARENT_LINKS
- token->parent = parser->toksuper;
-#endif
- return 0;
- }
-
- /* Backslash: Quoted symbol expected */
- if (c == '\\') {
- parser->pos++;
- switch (js[parser->pos]) {
- /* Allowed escaped symbols */
- case '\"': case '/' : case '\\' : case 'b' :
- case 'f' : case 'r' : case 'n' : case 't' :
- break;
- /* Allows escaped symbol \uXXXX */
- case 'u':
- parser->pos++;
- int i = 0;
- for(; i < 4 && js[parser->pos] != '\0'; i++) {
- /* If it isn't a hex character we have an error */
- if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */
- (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */
- (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */
- parser->pos = start;
- return JSMN_ERROR_INVAL;
- }
- parser->pos++;
- }
- parser->pos--;
- break;
- /* Unexpected symbol */
- default:
- parser->pos = start;
- return JSMN_ERROR_INVAL;
- }
- }
- }
- parser->pos = start;
- return JSMN_ERROR_PART;
-}
-
-/**
- * JSMN Parse
- *
- * Parse JSON string and fill tokens.
- *
- * @param parser the auxiliar vector used to parser
- * @param js the string to parse
- * @param len the string length
- * @param tokens the place to map the tokens
- * @param num_tokens the number of tokens present in the tokens structure.
- *
- * @return It returns the number of tokens present in the string on success or a negative number otherwise
- */
-jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
- jsmntok_t *tokens, unsigned int num_tokens) {
- jsmnerr_t r;
- int i;
- jsmntok_t *token;
- int count = 0;
-
- for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
- char c;
- jsmntype_t type;
-
- c = js[parser->pos];
- switch (c) {
- case '{': case '[':
- count++;
- if (tokens == NULL) {
- break;
- }
- token = jsmn_alloc_token(parser, tokens, num_tokens);
- if (token == NULL)
- return JSMN_ERROR_NOMEM;
- if (parser->toksuper != -1) {
- tokens[parser->toksuper].size++;
-#ifdef JSMN_PARENT_LINKS
- token->parent = parser->toksuper;
-#endif
- }
- token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
- token->start = parser->pos;
- parser->toksuper = parser->toknext - 1;
- break;
- case '}': case ']':
- if (tokens == NULL)
- break;
- type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
-#ifdef JSMN_PARENT_LINKS
- if (parser->toknext < 1) {
- return JSMN_ERROR_INVAL;
- }
- token = &tokens[parser->toknext - 1];
- for (;;) {
- if (token->start != -1 && token->end == -1) {
- if (token->type != type) {
- return JSMN_ERROR_INVAL;
- }
- token->end = parser->pos + 1;
- parser->toksuper = token->parent;
- break;
- }
- if (token->parent == -1) {
- break;
- }
- token = &tokens[token->parent];
- }
-#else
- for (i = parser->toknext - 1; i >= 0; i--) {
- token = &tokens[i];
- if (token->start != -1 && token->end == -1) {
- if (token->type != type) {
- return JSMN_ERROR_INVAL;
- }
- parser->toksuper = -1;
- token->end = parser->pos + 1;
- break;
- }
- }
- /* Error if unmatched closing bracket */
- if (i == -1) return JSMN_ERROR_INVAL;
- for (; i >= 0; i--) {
- token = &tokens[i];
- if (token->start != -1 && token->end == -1) {
- parser->toksuper = i;
- break;
- }
- }
-#endif
- break;
- case '\"':
- r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
- if (r < 0) return r;
- count++;
- if (parser->toksuper != -1 && tokens != NULL)
- tokens[parser->toksuper].size++;
- break;
- case '\t' : case '\r' : case '\n' : case ':' : case ',': case ' ':
- break;
-#ifdef JSMN_STRICT
- /* In strict mode primitives are: numbers and booleans */
- case '-': case '0': case '1' : case '2': case '3' : case '4':
- case '5': case '6': case '7' : case '8': case '9':
- case 't': case 'f': case 'n' :
-#else
- /* In non-strict mode every unquoted value is a primitive */
- default:
-#endif
- r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
- if (r < 0) return r;
- count++;
- if (parser->toksuper != -1 && tokens != NULL)
- tokens[parser->toksuper].size++;
- break;
-
-#ifdef JSMN_STRICT
- /* Unexpected char in strict mode */
- default:
- return JSMN_ERROR_INVAL;
-#endif
- }
- }
-
- for (i = parser->toknext - 1; i >= 0; i--) {
- /* Unmatched opened object or array */
- if (tokens[i].start != -1 && tokens[i].end == -1) {
- return JSMN_ERROR_PART;
- }
- }
-
- return count;
-}
-
-/**
- * JSMN Init
- *
- * Creates a new parser based over a given buffer with an array of tokens
- * available.
- *
- * @param parser is the structure with values to reset
- */
-void jsmn_init(jsmn_parser *parser) {
- parser->pos = 0;
- parser->toknext = 0;
- parser->toksuper = -1;
-} \ No newline at end of file
diff --git a/libnetdata/json/jsmn.h b/libnetdata/json/jsmn.h
deleted file mode 100644
index beff586c66..0000000000
--- a/libnetdata/json/jsmn.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef __JSMN_H_
-#define __JSMN_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h>
-/**
- * JSON type identifier. Basic types are:
- * o Object
- * o Array
- * o String
- * o Other primitive: number, boolean (true/false) or null
- */
-typedef enum {
- JSMN_PRIMITIVE = 0,
- JSMN_OBJECT = 1,
- JSMN_ARRAY = 2,
- JSMN_STRING = 3
-} jsmntype_t;
-
-typedef enum {
- /* Not enough tokens were provided */
- JSMN_ERROR_NOMEM = -1,
- /* Invalid character inside JSON string */
- JSMN_ERROR_INVAL = -2,
- /* The string is not a full JSON packet, more bytes expected */
- JSMN_ERROR_PART = -3,
-} jsmnerr_t;
-
-/**
- * JSON token description.
- *
- * @param type type (object, array, string etc.)
- * @param start start position in JSON data string
- * @param end end position in JSON data string
- */
-typedef struct {
- jsmntype_t type;
- int start;
- int end;
- int size;
-#ifdef JSMN_PARENT_LINKS
- int parent;
-#endif
-} jsmntok_t;
-
-/**
- * JSON parser. Contains an array of token blocks available. Also stores
- * the string being parsed now and current position in that string
- */
-typedef struct {
- unsigned int pos; /* offset in the JSON string */
- unsigned int toknext; /* next token to allocate */
- int toksuper; /* superior token node, e.g parent object or array */
-} jsmn_parser;
-
-/**
- * Create JSON parser over an array of tokens
- */
-void jsmn_init(jsmn_parser *parser);
-
-/**
- * Run JSON parser. It parses a JSON data string into and array of tokens, each describing
- * a single JSON object.
- */
-jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
- jsmntok_t *tokens, unsigned int num_tokens);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __JSMN_H_ */ \ No newline at end of file
diff --git a/libnetdata/json/json.c b/libnetdata/json/json.c
deleted file mode 100644
index c9ff39b056..0000000000
--- a/libnetdata/json/json.c
+++ /dev/null
@@ -1,546 +0,0 @@
-#include "jsmn.h"
-#include "../libnetdata.h"
-#include "json.h"
-#include "libnetdata/libnetdata.h"
-#include "../../health/health.h"
-
-#define JSON_TOKENS 1024
-
-int json_tokens = JSON_TOKENS;
-
-/**
- * Json Tokenise
- *
- * Map the string given inside tokens.
- *
- * @param js is the string used to create the tokens
- * @param len is the string length
- * @param count the number of tokens present in the string
- *
- * @return it returns the json parsed in tokens
- */
-#ifdef ENABLE_JSONC
-json_object *json_tokenise(char *js) {
- if(!js) {
- error("JSON: json string is empty.");
- return NULL;
- }
-
- json_object *token = json_tokener_parse(js);
- if(!token) {
- error("JSON: Invalid json string.");
- return NULL;
- }
-
- return token;
-}
-#else
-jsmntok_t *json_tokenise(char *js, size_t len, size_t *count)
-{
- int n = json_tokens;
- if(!js || !len) {
- error("JSON: json string is empty.");
- return NULL;
- }
-
- jsmn_parser parser;
- jsmn_init(&parser);
-
- jsmntok_t *tokens = mallocz(sizeof(jsmntok_t) * n);
- if(!tokens) return NULL;
-
- int ret = jsmn_parse(&parser, js, len, tokens, n);
- while (ret == JSMN_ERROR_NOMEM) {
- n *= 2;
- jsmntok_t *new = reallocz(tokens, sizeof(jsmntok_t) * n);
- if(!new) {
- freez(tokens);
- return NULL;
- }
- tokens = new;
- ret = jsmn_parse(&parser, js, len, tokens, n);
- }
-
- if (ret == JSMN_ERROR_INVAL) {
- error("JSON: Invalid json string.");
- freez(tokens);
- return NULL;
- }
- else if (ret == JSMN_ERROR_PART) {
- error("JSON: Truncated JSON string.");
- freez(tokens);
- return NULL;
- }
-
- if(count) *count = (size_t)ret;
-
- if(json_tokens < n) json_tokens = n;
- return tokens;
-}
-#endif
-
-/**
- * Callback Print
- *
- * Set callback print case necesary and wrinte an information inside a buffer to write in the log.
- *
- * @param e a pointer for a structure that has the complete information about json structure.
- *
- * @return It always return 0
- */
-int json_callback_print(JSON_ENTRY *e)
-{
- BUFFER *wb=buffer_create(300);
-
- buffer_sprintf(wb,"%s = ", e->name);
- char txt[50];
- switch(e->type) {
- case JSON_OBJECT:
- e->callback_function = json_callback_print;
- buffer_strcat(wb,"OBJECT");
- break;
-
- case JSON_ARRAY:
- e->callback_function = json_callback_print;
- sprintf(txt,"ARRAY[%lu]", e->data.items);
- buffer_strcat(wb, txt);
- break;
-
- case JSON_STRING:
- buffer_strcat(wb, e->data.string);
- break;
-
- case JSON_NUMBER:
- sprintf(txt,"%Lf", e->data.number);
- buffer_strcat(wb,txt);
-
- break;
-
- case JSON_BOOLEAN:
- buffer_strcat(wb, e->data.boolean?"TRUE":"FALSE");
- break;
-
- case JSON_NULL:
- buffer_strcat(wb,"NULL");
- break;
- }
- info("JSON: %s", buffer_tostring(wb));
- buffer_free(wb);
- return 0;
-}
-
-/**
- * JSONC Set String
- *
- * Set the string value of the structure JSON_ENTRY.
- *
- * @param e the output structure
- */
-static inline void json_jsonc_set_string(JSON_ENTRY *e,char *key,const char *value) {
- size_t length = strlen(key);
- e->type = JSON_STRING;
- memcpy(e->name,key,length);
- e->name[length] = 0x00;
- e->data.string = (char *) value;
-}
-
-
-#ifdef ENABLE_JSONC
-/**
- * JSONC set Boolean
- *
- * Set the boolean value of the structure JSON_ENTRY
- *
- * @param e the output structure
- * @param value the input value
- */
-static inline void json_jsonc_set_boolean(JSON_ENTRY *e,int value) {
- e->type = JSON_BOOLEAN;
- e->data.boolean = value;
-}
-
-/**
- * Parse Array
- *
- * Parse the array object.
- *
- * @param ptr the pointer for the object that we will parse.
- * @param callback_data additional data to be used together the callback function
- * @param callback_function function used to create a silencer.
- */
-static inline void json_jsonc_parse_array(json_object *ptr, void *callback_data,int (*callback_function)(struct json_entry *)) {
- int end = json_object_array_length(ptr);
- JSON_ENTRY e;
-
- if(end) {
- int i;
- i = 0;
-
- enum json_type type;
- do {
- json_object *jvalue = json_object_array_get_idx(ptr, i);
- if(jvalue) {
- e.callback_data = callback_data;
- e.type = JSON_OBJECT;
- callback_function(&e);
- json_object_object_foreach(jvalue, key, val) {
- type = json_object_get_type(val);
- if (type == json_type_array) {
- e.type = JSON_ARRAY;
- json_jsonc_parse_array(val, callback_data, callback_function);
- } else if (type == json_type_object) {
- json_walk(val,callback_data,callback_function);
- } else if (type == json_type_string) {
- json_jsonc_set_string(&e,key,json_object_get_string(val));
- callback_function(&e);
- } else if (type == json_type_boolean) {
- json_jsonc_set_boolean(&e,json_object_get_boolean(val));
- callback_function(&e);
- }
- }
- }
-
- } while (++i < end);
- }
-}
-#else
-
-/**
- * Walk string
- *
- * Set JSON_ENTRY to string and map the values from jsmntok_t.
- *
- * @param js the original string
- * @param t the tokens
- * @param start the first position
- * @param e the output structure.
- *
- * @return It always return 1
- */
-size_t json_walk_string(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e)
-{
- char old = js[t[start].end];
- js[t[start].end] = '\0';
- e->original_string = &js[t[start].start];
-
- e->type = JSON_STRING;
- e->data.string = e->original_string;
- if(e->callback_function) e->callback_function(e);
- js[t[start].end] = old;
- return 1;
-}
-
-/**
- * Walk Primitive
- *
- * Define the data type of the string
- *
- * @param js the original string
- * @param t the tokens
- * @param start the first position
- * @param e the output structure.
- *
- * @return It always return 1
- */
-size_t json_walk_primitive(char *js, jsmntok_t *t, size_t start, JSON_ENTRY *e)
-{
- char old = js[t[start].end];
- js[t[start].end] = '\0';
- e->original_string = &js[t[start].start];
-
- switch(e->original_string[0]) {
- case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':
- case '8': case '9': case '-': case '.':
- e->type = JSON_NUMBER;
- e->data.number = strtold(e->original_string, NULL);
- break;
-
- case 't': case 'T':
- e->type = JSON_BOOLEAN;
- e->data.boolean = 1;
- break;
-
- case 'f': case 'F':
- e->type = JSON_BOOLEAN;
-