Add schema information to XML MI output
[lttng-tools.git] / src / common / config / session-config.c
index 87e9c03c8f667a65efee86dead199f77d7ee8884..dec891349a5384a928abf153447452b51131498c 100644 (file)
@@ -99,13 +99,17 @@ const char * const config_element_type = "type";
 const char * const config_element_buffer_type = "buffer_type";
 const char * const config_element_session = "session";
 const char * const config_element_sessions = "sessions";
-const char * const config_element_perf = "perf";
+const char * const config_element_context_perf = "perf";
+const char * const config_element_context_app = "app";
+const char * const config_element_context_app_provider_name = "provider_name";
+const char * const config_element_context_app_ctx_name = "ctx_name";
 const char * const config_element_config = "config";
 const char * const config_element_started = "started";
 const char * const config_element_snapshot_mode = "snapshot_mode";
 const char * const config_element_loglevel = "loglevel";
 const char * const config_element_loglevel_type = "loglevel_type";
 const char * const config_element_filter = "filter";
+const char * const config_element_filter_expression = "filter_expression";
 const char * const config_element_snapshot_outputs = "snapshot_outputs";
 const char * const config_element_consumer_output = "consumer_output";
 const char * const config_element_destination = "destination";
@@ -165,6 +169,8 @@ const char * const config_event_context_pthread_id = "PTHREAD_ID";
 const char * const config_event_context_hostname = "HOSTNAME";
 const char * const config_event_context_ip = "IP";
 const char * const config_event_context_perf_thread_counter = "PERF_THREAD_COUNTER";
+const char * const config_event_context_app = "APP";
+
 
 struct consumer_output {
        int enabled;
@@ -449,7 +455,40 @@ int config_writer_open_element(struct config_writer *writer,
        ret = xmlTextWriterStartElement(writer->writer, encoded_element_name);
        xmlFree(encoded_element_name);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
+}
+
+LTTNG_HIDDEN
+int config_writer_write_attribute(struct config_writer *writer,
+               const char *name, const char *value)
+{
+       int ret;
+       xmlChar *encoded_name = NULL;
+       xmlChar *encoded_value = NULL;
+
+       if (!writer || !writer->writer || !name || !name[0]) {
+               ret = -1;
+               goto end;
+       }
+
+       encoded_name = encode_string(name);
+       if (!encoded_name) {
+               ret = -1;
+               goto end;
+       }
+
+       encoded_value = encode_string(value);
+       if (!encoded_value) {
+               ret = -1;
+               goto end;
+       }
+
+       ret = xmlTextWriterWriteAttribute(writer->writer, encoded_name,
+                       encoded_value);
+end:
+       xmlFree(encoded_name);
+       xmlFree(encoded_value);
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -464,7 +503,7 @@ int config_writer_close_element(struct config_writer *writer)
 
        ret = xmlTextWriterEndElement(writer->writer);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -489,7 +528,7 @@ int config_writer_write_element_unsigned_int(struct config_writer *writer,
                encoded_element_name, "%" PRIu64, value);
        xmlFree(encoded_element_name);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -514,7 +553,7 @@ int config_writer_write_element_signed_int(struct config_writer *writer,
                encoded_element_name, "%" PRIi64, value);
        xmlFree(encoded_element_name);
 end:
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 LTTNG_HIDDEN
@@ -556,7 +595,7 @@ int config_writer_write_element_string(struct config_writer *writer,
 end:
        xmlFree(encoded_element_name);
        xmlFree(encoded_value);
-       return ret > 0 ? 0 : ret;
+       return ret >= 0 ? 0 : ret;
 }
 
 static
@@ -1991,6 +2030,7 @@ int process_context_node(xmlNodePtr context_node,
                config_element_type)) {
                /* type */
                xmlChar *content = xmlNodeGetContent(context_child_node);
+
                if (!content) {
                        ret = -LTTNG_ERR_NOMEM;
                        goto end;
@@ -2004,10 +2044,11 @@ int process_context_node(xmlNodePtr context_node,
                }
 
                context.ctx = ret;
-       } else {
+       } else if (!strcmp((const char *) context_child_node->name,
+               config_element_context_perf)) {
+               /* perf */
                xmlNodePtr perf_attr_node;
 
-               /* perf */
                context.ctx = handle->domain.type == LTTNG_DOMAIN_KERNEL ?
                        LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER :
                        LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER;
@@ -2085,9 +2126,41 @@ int process_context_node(xmlNodePtr context_node,
                                free(content);
                        }
                }
+       } else if (!strcmp((const char *) context_child_node->name,
+               config_element_context_app)) {
+               /* application context */
+               xmlNodePtr app_ctx_node;
+
+               context.ctx = LTTNG_EVENT_CONTEXT_APP_CONTEXT;
+               for (app_ctx_node = xmlFirstElementChild(context_child_node);
+                               app_ctx_node; app_ctx_node =
+                               xmlNextElementSibling(app_ctx_node)) {
+                       xmlChar *content;
+                       char **target = strcmp(
+                               (const char *) app_ctx_node->name,
+                               config_element_context_app_provider_name) == 0 ?
+                                       &context.u.app_ctx.provider_name :
+                                       &context.u.app_ctx.ctx_name;
+
+                       content = xmlNodeGetContent(app_ctx_node);
+                       if (!content) {
+                               ret = -LTTNG_ERR_NOMEM;
+                               goto end;
+                       }
+
+                       *target = (char *) content;
+               }
+       } else {
+               /* Unrecognized context type */
+               ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+               goto end;
        }
 
        ret = lttng_add_context(handle, &context, NULL, channel_name);
+       if (context.ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
+               free(context.u.app_ctx.provider_name);
+               free(context.u.app_ctx.ctx_name);
+       }
 end:
        return ret;
 }
This page took 0.025872 seconds and 4 git commands to generate.