common: session load: use session descriptor for session creation
[lttng-tools.git] / src / common / config / session-config.cpp
index ef254d7ccea1d28bb8e64b348882a88a805b303d..8f96b7f21e638a122fef392a4a5ed0e7dd3a86bf 100644 (file)
 #include <sys/stat.h>
 #include <stdbool.h>
 
-#include <common/defaults.h>
-#include <common/error.h>
-#include <common/macros.h>
-#include <common/utils.h>
-#include <common/dynamic-buffer.h>
-#include <common/compat/getenv.h>
+#include <common/defaults.hpp>
+#include <common/error.hpp>
+#include <common/macros.hpp>
+#include <common/utils.hpp>
+#include <common/dynamic-buffer.hpp>
+#include <common/compat/getenv.hpp>
 #include <lttng/lttng-error.h>
 #include <libxml/parser.h>
 #include <libxml/valid.h>
 #include <lttng/rotation.h>
 #include <lttng/userspace-probe.h>
 
-#include "session-config.h"
-#include "config-internal.h"
+#include "session-config.hpp"
+#include "config-internal.hpp"
 
 #define CONFIG_USERSPACE_PROBE_LOOKUP_METHOD_NAME_MAX_LEN 7
 
+namespace {
 struct session_config_validation_ctx {
        xmlSchemaParserCtxtPtr parser_ctx;
        xmlSchemaPtr schema;
        xmlSchemaValidCtxtPtr schema_validation_ctx;
 };
+} /* namespace */
 
 const char * const config_element_all = "all";
 LTTNG_EXPORT const char *config_xml_encoding = "UTF-8";
@@ -233,12 +235,14 @@ enum process_event_node_phase {
        ENABLE = 1,
 };
 
+namespace {
 struct consumer_output {
        int enabled;
        char *path;
        char *control_uri;
        char *data_uri;
 };
+} /* namespace */
 
 /*
  * Returns a xmlChar string which must be released using xmlFree().
@@ -287,7 +291,7 @@ struct config_writer *config_writer_create(int fd_output, int indent)
        struct config_writer *writer;
        xmlOutputBufferPtr buffer;
 
-       writer = (config_writer *) zmalloc(sizeof(struct config_writer));
+       writer = zmalloc<config_writer>();
        if (!writer) {
                PERROR("zmalloc config_writer_create");
                goto end;
@@ -581,7 +585,7 @@ char *get_session_config_xsd_path(void)
        base_path_len = strlen(base_path);
        max_path_len = base_path_len +
                sizeof(DEFAULT_SESSION_CONFIG_XSD_FILENAME) + 1;
-       xsd_path = (char *) zmalloc(max_path_len);
+       xsd_path = zmalloc<char>(max_path_len);
        if (!xsd_path) {
                goto end;
        }
@@ -1145,65 +1149,46 @@ end:
        return ret;
 }
 
-static
-int create_session_net_output(const char *name, const char *control_uri,
-               const char *data_uri)
-{
-       int ret;
-       struct lttng_handle *handle;
-       const char *uri = NULL;
-
-       LTTNG_ASSERT(name);
-
-       handle = lttng_create_handle(name, NULL);
-       if (!handle) {
-               ret = -LTTNG_ERR_NOMEM;
-               goto end;
-       }
-
-       if (!control_uri || !data_uri) {
-               uri = control_uri ? control_uri : data_uri;
-               control_uri = uri;
-               data_uri = uri;
-       }
-
-       ret = lttng_set_consumer_url(handle, control_uri, data_uri);
-       lttng_destroy_handle(handle);
-end:
-       return ret;
-}
-
 static
 int create_snapshot_session(const char *session_name, xmlNodePtr output_node,
                const struct config_load_session_override_attr *overrides)
 {
        int ret;
+       enum lttng_error_code ret_code;
        xmlNodePtr node = NULL;
        xmlNodePtr snapshot_output_list_node;
        xmlNodePtr snapshot_output_node;
+       struct lttng_session_descriptor *session_descriptor = nullptr;
 
        LTTNG_ASSERT(session_name);
+       LTTNG_ASSERT(output_node);
 
-       ret = lttng_create_session_snapshot(session_name, NULL);
-       if (ret) {
+       /*
+        * Use a descriptor without output since consumer output size is not
+        * exposed by the session descriptor api.
+        */
+       session_descriptor = lttng_session_descriptor_snapshot_create(session_name);
+       if (session_descriptor == nullptr) {
+               ret = -LTTNG_ERR_NOMEM;
                goto end;
        }
 
-       if (!output_node) {
+       ret_code = lttng_create_session_ext(session_descriptor);
+       if (ret_code != LTTNG_OK) {
+               ret = -ret_code;
                goto end;
        }
 
        snapshot_output_list_node = xmlFirstElementChild(output_node);
 
        /* Parse and create snapshot outputs */
-
        for (snapshot_output_node =
                        xmlFirstElementChild(snapshot_output_list_node);
                        snapshot_output_node; snapshot_output_node =
                        xmlNextElementSibling(snapshot_output_node)) {
                char *name = NULL;
                uint64_t max_size = UINT64_MAX;
-               struct consumer_output output = { 0 };
+               struct consumer_output output = {};
                struct lttng_snapshot_output *snapshot_output = NULL;
                const char *control_uri = NULL;
                const char *data_uri = NULL;
@@ -1319,6 +1304,7 @@ error_snapshot_output:
                }
        }
 end:
+       lttng_session_descriptor_destroy(session_descriptor);
        return ret;
 }
 
@@ -1328,12 +1314,14 @@ int create_session(const char *name,
        uint64_t live_timer_interval,
        const struct config_load_session_override_attr *overrides)
 {
-       int ret;
-       struct consumer_output output = { 0 };
+       int ret = 0;
+       enum lttng_error_code ret_code;
+       struct consumer_output output = {};
        xmlNodePtr consumer_output_node;
        const char *control_uri = NULL;
        const char *data_uri = NULL;
        const char *path = NULL;
+       struct lttng_session_descriptor *session_descriptor = nullptr;
 
        LTTNG_ASSERT(name);
 
@@ -1383,7 +1371,6 @@ int create_session(const char *name,
                }
        }
 
-
        if (live_timer_interval != UINT64_MAX && !control_uri && !data_uri) {
                ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
                goto end;
@@ -1397,30 +1384,36 @@ int create_session(const char *name,
                         * with a live timer the data and control URIs are provided. So,
                         * NULL is passed here and will be set right after.
                         */
-                       ret = lttng_create_session_live(name, NULL, live_timer_interval);
+                       session_descriptor = lttng_session_descriptor_live_network_create(
+                                       name, control_uri, data_uri, live_timer_interval);
                } else {
-                       ret = lttng_create_session(name, NULL);
-               }
-               if (ret) {
-                       goto end;
-               }
-
-               ret = create_session_net_output(name, control_uri, data_uri);
-               if (ret) {
-                       goto end;
+                       session_descriptor = lttng_session_descriptor_network_create(
+                                       name, control_uri, data_uri);
                }
 
+       } else if (path != nullptr) {
+               session_descriptor = lttng_session_descriptor_local_create(name, path);
        } else {
-               /* either local output or no output */
-               ret = lttng_create_session(name, path);
-               if (ret) {
-                       goto end;
-               }
+               /* No output */
+               session_descriptor = lttng_session_descriptor_create(name);
        }
+
+       if (session_descriptor == nullptr) {
+               ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+               goto end;
+       }
+
+       ret_code = lttng_create_session_ext(session_descriptor);
+       if (ret_code != LTTNG_OK) {
+               ret = -ret_code;
+               goto end;
+       }
+
 end:
        free(output.path);
        free(output.control_uri);
        free(output.data_uri);
+       lttng_session_descriptor_destroy(session_descriptor);
        return ret;
 }
 
@@ -1856,7 +1849,7 @@ int process_event_node(xmlNodePtr event_node, struct lttng_handle *handle,
                                continue;
                        }
 
-                       exclusions = (char **) zmalloc(exclusion_count * sizeof(char *));
+                       exclusions = calloc<char *>(exclusion_count);
                        if (!exclusions) {
                                exclusion_count = 0;
                                ret = -LTTNG_ERR_NOMEM;
@@ -3399,9 +3392,8 @@ int process_session_node(xmlNodePtr session_node, const char *session_name,
        /* Init domains to create the session handles */
        for (node = xmlFirstElementChild(domains_node); node;
                node = xmlNextElementSibling(node)) {
-               struct lttng_domain *domain;
+               lttng_domain *domain = zmalloc<lttng_domain>();
 
-               domain = (lttng_domain *) zmalloc(sizeof(*domain));
                if (!domain) {
                        ret = -LTTNG_ERR_NOMEM;
                        goto error;
@@ -3859,7 +3851,7 @@ int config_load_session(const char *path, const char *session_name,
        int ret;
        bool session_loaded = false;
        const char *path_ptr = NULL;
-       struct session_config_validation_ctx validation_ctx = { 0 };
+       struct session_config_validation_ctx validation_ctx = {};
 
        ret = init_session_config_validation_ctx(&validation_ctx);
        if (ret) {
This page took 0.025965 seconds and 4 git commands to generate.