summaryrefslogtreecommitdiff
path: root/src/console/dlt-control-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/console/dlt-control-common.c')
-rw-r--r--src/console/dlt-control-common.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/src/console/dlt-control-common.c b/src/console/dlt-control-common.c
index f4c66cd..8a9d29f 100644
--- a/src/console/dlt-control-common.c
+++ b/src/console/dlt-control-common.c
@@ -64,6 +64,15 @@
#include "dlt-control-common.h"
+#ifdef EXTENDED_FILTERING
+ # if defined(__linux__) || defined(__ANDROID_API__)
+ # include <json-c/json.h> /* for json filter parsing on Linux and Android */
+ # endif
+ # ifdef __QNX__
+ # include <sys/json.h> /* for json filter parsing on QNX */
+ # endif
+#endif
+
#define DLT_CTRL_APID "DLTC"
#define DLT_CTRL_CTID "DLTC"
#define DLT_DAEMON_DEFAULT_CTRL_SOCK_PATH "/tmp/dlt-ctrl.sock"
@@ -640,3 +649,294 @@ int dlt_control_deinit(void)
/* Closing the socket */
return dlt_client_cleanup(&g_client, get_verbosity());
}
+
+
+#ifdef EXTENDED_FILTERING /* EXTENDED_FILTERING */
+# if defined(__linux__) || defined(__ANDROID_API__)
+DltReturnValue dlt_json_filter_load(DltFilter *filter, const char *filename, int verbose)
+{
+ if ((filter == NULL) || (filename == NULL))
+ return DLT_RETURN_WRONG_PARAMETER;
+
+ if(verbose)
+ pr_verbose("dlt_json_filter_load()\n");
+
+ FILE *handle;
+ char buffer[JSON_FILTER_SIZE*DLT_FILTER_MAX];
+ struct json_object *j_parsed_json;
+ struct json_object *j_app_id;
+ struct json_object *j_context_id;
+ struct json_object *j_log_level;
+ struct json_object *j_payload_min;
+ struct json_object *j_payload_max;
+ enum json_tokener_error jerr;
+
+ char app_id[DLT_ID_SIZE] = "";
+ char context_id[DLT_ID_SIZE] = "";
+ int32_t log_level = 0;
+ int32_t payload_max = INT32_MAX;
+ int32_t payload_min = 0;
+
+ handle = fopen(filename, "r");
+
+ if (handle == NULL) {
+ pr_error("Filter file %s cannot be opened!\n", filename);
+ return DLT_RETURN_ERROR;
+ }
+
+ if (fread(buffer, sizeof(buffer), 1, handle) != 0) {
+ if (!feof(handle)) {
+ pr_error("Filter file %s is to big for reading it with current buffer!\n", filename);
+ return DLT_RETURN_ERROR;
+ }
+ }
+
+ j_parsed_json = json_tokener_parse_verbose(buffer, &jerr);
+
+ if (jerr != json_tokener_success) {
+ pr_error("Faild to parse given filter %s: %s\n", filename, json_tokener_error_desc(jerr));
+ return DLT_RETURN_ERROR;
+ }
+
+ printf("The following filter(s) are applied: \n");
+ pr_verbose("The following filter(s) are applied: \n");
+ int iterator = 0;
+ json_object_object_foreach(j_parsed_json, key, val)
+ {
+ if (iterator >= DLT_FILTER_MAX) {
+ pr_error("Maximum number (%d) of allowed filters reached, ignoring rest of filters!\n",
+ DLT_FILTER_MAX);
+ break;
+ }
+
+ printf("%s:\n", key);
+ pr_verbose("%s:\n", key);
+
+ if (json_object_object_get_ex(val, "AppId", &j_app_id))
+ strncpy(app_id, json_object_get_string(j_app_id), DLT_ID_SIZE);
+ else
+ dlt_set_id(app_id, "");
+
+ if (json_object_object_get_ex(val, "ContextId", &j_context_id))
+ strncpy(context_id, json_object_get_string(j_context_id), DLT_ID_SIZE);
+ else
+ dlt_set_id(context_id, "");
+
+ if (json_object_object_get_ex(val, "LogLevel", &j_log_level))
+ log_level = json_object_get_int(j_log_level);
+ else
+ log_level = 0;
+
+ if (json_object_object_get_ex(val, "PayloadMin", &j_payload_min))
+ payload_min = json_object_get_int(j_payload_min);
+ else
+ payload_min = 0;
+
+ if (json_object_object_get_ex(val, "PayloadMax", &j_payload_max))
+ payload_max = json_object_get_int(j_payload_max);
+ else
+ payload_max = INT32_MAX;
+
+ dlt_filter_add(filter, app_id, context_id, log_level, payload_min, payload_max, verbose);
+
+ printf("\tAppId: %.*s\n", DLT_ID_SIZE, app_id);
+ pr_verbose("\tAppId: %.*s\n", DLT_ID_SIZE, app_id);
+ printf("\tConextId: %.*s\n", DLT_ID_SIZE, context_id);
+ pr_verbose("\tConextId: %.*s\n", DLT_ID_SIZE, context_id);
+ printf("\tLogLevel: %i\n", log_level);
+ pr_verbose("\tLogLevel: %i\n", log_level);
+ printf("\tPayloadMin: %i\n", payload_min);
+ pr_verbose("\tPayloadMin: %i\n", payload_min);
+ printf("\tPayloadMax: %i\n", payload_max);
+ pr_verbose("\tPayloadMax: %i\n", payload_max);
+
+ iterator++;
+ }
+
+ fclose(handle);
+
+ return DLT_RETURN_OK;
+}
+# endif /* __Linux__ */
+
+# ifdef __QNX__
+DltReturnValue dlt_json_filter_load(DltFilter *filter, const char *filename, int verbose)
+{
+ if ((filter == NULL) || (filename == NULL))
+ return DLT_RETURN_WRONG_PARAMETER;
+
+ if(verbose)
+ pr_verbose("dlt_json_filter_load()\n");
+
+ json_decoder_t *j_decoder = json_decoder_create();
+
+ const char *s_app_id;
+ const char *s_context_id;
+ int32_t log_level = 0;
+ int32_t payload_max = INT32_MAX;
+ int32_t payload_min = 0;
+
+ json_decoder_error_t ret = json_decoder_parse_file(j_decoder, filename);
+
+ if (ret != JSON_DECODER_OK) {
+ pr_error("Faild to parse given filter %s: json_decoder_error_t is %i\n", filename, ret);
+ return DLT_RETURN_ERROR;
+ }
+
+ json_decoder_push_object(j_decoder, NULL, true);
+
+ int iterator = 0;
+ bool end_of_json = false;
+
+ while (!end_of_json) {
+ if (iterator >= DLT_FILTER_MAX) {
+ pr_error("Maximum number (%d) of allowed filters reached, ignoring rest of filters!\n",
+ DLT_FILTER_MAX);
+ break;
+ }
+
+ if (json_decoder_next(j_decoder) == JSON_DECODER_NOT_FOUND)
+ end_of_json = true;
+
+ json_decoder_previous(j_decoder);
+
+ printf("%s:\n", json_decoder_name(j_decoder));
+ json_decoder_push_object(j_decoder, NULL, true);
+
+ if (json_decoder_get_string(j_decoder, "AppId", &s_app_id, true) != JSON_DECODER_OK)
+ s_app_id = "";
+
+ if (json_decoder_get_string(j_decoder, "ContextId", &s_context_id, true) != JSON_DECODER_OK)
+ s_context_id = "";
+
+ if (json_decoder_get_int(j_decoder, "LogLevel", &log_level, true) != JSON_DECODER_OK)
+ log_level = 0;
+
+ if (json_decoder_get_int(j_decoder, "PayloadMin", &payload_min, true) != JSON_DECODER_OK)
+ payload_min = 0;
+
+ if (json_decoder_get_int(j_decoder, "PayloadMax", &payload_max, true) != JSON_DECODER_OK)
+ payload_max = INT32_MAX;
+
+ char app_id[DLT_ID_SIZE];
+ char context_id[DLT_ID_SIZE];
+ strncpy(app_id, s_app_id, DLT_ID_SIZE);
+ strncpy(context_id, s_context_id, DLT_ID_SIZE);
+
+ dlt_filter_add(filter, app_id, context_id, log_level, payload_min, payload_max, verbose);
+
+ printf("\tAppId: %.*s\n", DLT_ID_SIZE, app_id);
+ printf("\tConextId: %.*s\n", DLT_ID_SIZE, context_id);
+ printf("\tLogLevel: %i\n", log_level);
+ printf("\tPayloadMin: %i\n", payload_min);
+ printf("\tPayloadMax: %i\n", payload_max);
+
+ json_decoder_pop(j_decoder);
+
+ iterator++;
+ }
+
+ json_decoder_destroy(j_decoder);
+
+ return DLT_RETURN_OK;
+}
+# endif /* __QNX__ */
+#endif /* EXTENDED_FILTERING */
+
+#ifdef EXTENDED_FILTERING /* EXTENDED_FILTERING */
+# if defined(__linux__) || defined(__ANDROID_API__)
+DltReturnValue dlt_json_filter_save(DltFilter *filter, const char *filename, int verbose)
+{
+ if ((filter == NULL) || (filename == NULL))
+ return DLT_RETURN_WRONG_PARAMETER;
+
+ if(verbose)
+ pr_verbose("dlt_json_filter_save()\n");
+
+ struct json_object *json_filter_obj = json_object_new_object();
+
+ for (int num = 0; num < filter->counter; num++) {
+ struct json_object *tmp_json_obj = json_object_new_object();
+ char filter_name[JSON_FILTER_NAME_SIZE];
+ sprintf(filter_name, "filter%i", num);
+
+ if (filter->apid[num][DLT_ID_SIZE - 1] != 0)
+ json_object_object_add(tmp_json_obj, "AppId", json_object_new_string_len(filter->apid[num], DLT_ID_SIZE));
+ else
+ json_object_object_add(tmp_json_obj, "AppId", json_object_new_string(filter->apid[num]));
+
+ if (filter->ctid[num][DLT_ID_SIZE - 1] != 0)
+ json_object_object_add(tmp_json_obj, "ContextId",
+ json_object_new_string_len(filter->ctid[num], DLT_ID_SIZE));
+ else
+ json_object_object_add(tmp_json_obj, "ContextId", json_object_new_string(filter->ctid[num]));
+
+ json_object_object_add(tmp_json_obj, "LogLevel", json_object_new_int(filter->log_level[num]));
+ json_object_object_add(tmp_json_obj, "PayloadMin", json_object_new_int(filter->payload_min[num]));
+ json_object_object_add(tmp_json_obj, "PayloadMax", json_object_new_int(filter->payload_max[num]));
+
+ json_object_object_add(json_filter_obj, filter_name, tmp_json_obj);
+ }
+
+ printf("Saving current filter into '%s'\n", filename);
+ json_object_to_file((char*)filename, json_filter_obj);
+
+ return DLT_RETURN_OK;
+}
+# endif /* __Linux__ */
+
+# ifdef __QNX__
+DltReturnValue dlt_json_filter_save(DltFilter *filter, const char *filename, int verbose)
+{
+ if ((filter == NULL) || (filename == NULL))
+ return DLT_RETURN_WRONG_PARAMETER;
+
+ if(verbose)
+ pr_verbose("dlt_json_filter_save()\n");
+
+ char s_app_id[DLT_ID_SIZE + 1];
+ char s_context_id[DLT_ID_SIZE + 1];
+
+ json_encoder_t *j_encoder = json_encoder_create();
+ json_encoder_start_object(j_encoder, NULL);
+
+ for (int num = 0; num < filter->counter; num++) {
+ char filter_name[JSON_FILTER_NAME_SIZE];
+ sprintf(filter_name, "filter%i", num);
+ json_encoder_start_object(j_encoder, filter_name);
+
+ strncpy(s_app_id, filter->apid[num], DLT_ID_SIZE);
+
+ if (filter->apid[num][DLT_ID_SIZE - 1] != 0)
+ s_app_id[DLT_ID_SIZE] = '\0';
+
+ strncpy(s_context_id, filter->ctid[num], DLT_ID_SIZE);
+
+ if (filter->ctid[num][DLT_ID_SIZE - 1] != 0)
+ s_context_id[DLT_ID_SIZE] = '\0';
+
+ json_encoder_add_string(j_encoder, "AppId", s_app_id);
+ json_encoder_add_string(j_encoder, "ContextId", s_context_id);
+ json_encoder_add_int(j_encoder, "LogLevel", filter->log_level[num]);
+ json_encoder_add_int(j_encoder, "PayloadMin", filter->payload_min[num]);
+ json_encoder_add_int(j_encoder, "PayloadMax", filter->payload_max[num]);
+
+ json_encoder_end_object(j_encoder);
+ }
+
+ json_encoder_end_object(j_encoder);
+
+ printf("Saving current filter into '%s'\n", filename);
+ FILE *handle = fopen(filename, "w");
+ int filter_buffer_size = 100 * (filter->counter);
+ char filter_buffer[filter_buffer_size];
+ snprintf(filter_buffer, filter_buffer_size, json_encoder_buffer(j_encoder));
+ fprintf(handle, filter_buffer);
+
+ fclose(handle);
+ json_encoder_destroy(j_encoder);
+
+ return DLT_RETURN_OK;
+}
+# endif /* __QNX__ */
+#endif /* EXTENDED_FILTERING */