Save/load: add support for shared memory path
[lttng-tools.git] / src / common / config / config.c
index feb3334cffbaba06a39c7fd1f24b60835db33bd5..0366f5a87b317d4ed5bf813517fdfb4e1e978018 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <ctype.h>
 #include <stdio.h>
@@ -31,6 +32,7 @@
 #include <common/error.h>
 #include <common/macros.h>
 #include <common/utils.h>
+#include <common/compat/getenv.h>
 #include <lttng/lttng-error.h>
 #include <libxml/parser.h>
 #include <libxml/valid.h>
@@ -113,6 +115,9 @@ const char * const config_element_net_output = "net_output";
 const char * const config_element_control_uri = "control_uri";
 const char * const config_element_data_uri = "data_uri";
 const char * const config_element_max_size = "max_size";
+const char * const config_element_pid = "pid";
+const char * const config_element_pids = "pids";
+const char * const config_element_shared_memory_path = "shared_memory_path";
 
 const char * const config_domain_type_kernel = "KERNEL";
 const char * const config_domain_type_ust = "UST";
@@ -594,7 +599,7 @@ static
 char *get_session_config_xsd_path()
 {
        char *xsd_path;
-       const char *base_path = getenv(DEFAULT_SESSION_CONFIG_XSD_PATH_ENV);
+       const char *base_path = lttng_secure_getenv(DEFAULT_SESSION_CONFIG_XSD_PATH_ENV);
        size_t base_path_len;
        size_t max_path_len;
 
@@ -1283,7 +1288,7 @@ int create_session(const char *name,
                int i;
                struct lttng_domain *domain;
                struct lttng_domain *domains[] =
-                       { kernel_domain, ust_domain, jul_domain, log4j_domain};
+                       { kernel_domain, ust_domain, jul_domain, log4j_domain };
 
                /* network destination */
                if (live_timer_interval && live_timer_interval != UINT64_MAX) {
@@ -1639,6 +1644,24 @@ int process_event_node(xmlNodePtr event_node, struct lttng_handle *handle,
 
        ret = lttng_enable_event_with_exclusions(handle, &event, channel_name,
                        filter_expression, exclusion_count, exclusions);
+       if (ret) {
+               goto end;
+       }
+
+       if (!event.enabled) {
+               /*
+                * Note that we should use lttng_disable_event_ext() (2.6+) to
+                * eliminate the risk of clashing on events of the same
+                * name (with different event types and loglevels).
+                *
+                * Unfortunately, lttng_disable_event_ext() only performs a
+                * match on the name and event type and errors out if any other
+                * event attribute is not set to its default value.
+                *
+                * This will disable all events that match this name.
+                */
+               ret = lttng_disable_event(handle, event.name, channel_name);
+       }
 end:
        for (i = 0; i < exclusion_count; i++) {
                free(exclusions[i]);
@@ -2150,6 +2173,7 @@ int process_session_node(xmlNodePtr session_node, const char *session_name,
        int ret, started = -1, snapshot_mode = -1;
        uint64_t live_timer_interval = UINT64_MAX;
        char *name = NULL;
+       xmlChar *shm_path = NULL;
        xmlNodePtr domains_node = NULL;
        xmlNodePtr output_node = NULL;
        xmlNodePtr node;
@@ -2194,6 +2218,16 @@ int process_session_node(xmlNodePtr session_node, const char *session_name,
                        config_element_output)) {
                        /* output */
                        output_node = node;
+               } else if (!shm_path && !strcmp((const char *) node->name,
+                       config_element_shared_memory_path)) {
+                       /* shared memory path */
+                       xmlChar *node_content = xmlNodeGetContent(node);
+                       if (!node_content) {
+                               ret = -LTTNG_ERR_NOMEM;
+                               goto error;
+                       }
+
+                       shm_path = node_content;
                } else {
                        /* attributes, snapshot_mode or live_timer_interval */
                        xmlNodePtr attributes_child =
@@ -2334,6 +2368,14 @@ domain_init_error:
                goto error;
        }
 
+       if (shm_path) {
+               ret = lttng_set_session_shm_path((const char *) name,
+                       (const char *) shm_path);
+               if (ret) {
+                       goto error;
+               }
+       }
+
        for (node = xmlFirstElementChild(domains_node); node;
                node = xmlNextElementSibling(node)) {
                ret = process_domain_node(node, name);
@@ -2360,7 +2402,9 @@ error:
        free(ust_domain);
        free(jul_domain);
        free(log4j_domain);
+       free(python_domain);
        free(name);
+       xmlFree(shm_path);
        return ret;
 }
 
This page took 0.02777 seconds and 5 git commands to generate.