Override the session.xsd path with an ENV. variable
[lttng-tools.git] / src / common / config / config.c
index e74e20f6c016e2fbbfe101c19a52fa0f6de93e18..8b34d02f1d54500a339f4cb190d58bba1bf6d4b1 100644 (file)
@@ -568,13 +568,50 @@ void fini_session_config_validation_ctx(
        memset(ctx, 0, sizeof(struct session_config_validation_ctx));
 }
 
+static
+char *get_session_config_xsd_path()
+{
+       char *xsd_path;
+       const char *base_path = getenv(DEFAULT_SESSION_CONFIG_XSD_PATH_ENV);
+       size_t base_path_len;
+       size_t max_path_len;
+
+       if (!base_path) {
+               base_path = DEFAULT_SESSION_CONFIG_XSD_PATH;
+       }
+
+       base_path_len = strlen(base_path);
+       max_path_len = base_path_len +
+               sizeof(DEFAULT_SESSION_CONFIG_XSD_FILENAME) + 1;
+       xsd_path = zmalloc(max_path_len);
+       if (!xsd_path) {
+               goto end;
+       }
+
+       strncpy(xsd_path, base_path, max_path_len);
+       if (xsd_path[base_path_len - 1] != '/') {
+               xsd_path[base_path_len++] = '/';
+       }
+
+       strncpy(xsd_path + base_path_len, DEFAULT_SESSION_CONFIG_XSD_FILENAME,
+               max_path_len - base_path_len);
+end:
+       return xsd_path;
+}
+
 static
 int init_session_config_validation_ctx(
        struct session_config_validation_ctx *ctx)
 {
        int ret;
+       char *xsd_path = get_session_config_xsd_path();
+
+       if (!xsd_path) {
+               ret = -LTTNG_ERR_NOMEM;
+               goto end;
+       }
 
-       ctx->parser_ctx = xmlSchemaNewParserCtxt(DEFAULT_SESSION_CONFIG_XSD_PATH);
+       ctx->parser_ctx = xmlSchemaNewParserCtxt(xsd_path);
        if (!ctx->parser_ctx) {
                ERR("XSD parser context creation failed");
                ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
@@ -606,6 +643,7 @@ end:
                fini_session_config_validation_ctx(ctx);
        }
 
+       free(xsd_path);
        return ret;
 }
 
@@ -1222,11 +1260,12 @@ int create_session(const char *name,
 
                /* network destination */
                if (live_timer_interval && live_timer_interval != UINT64_MAX) {
-                       const char *url = output.control_uri ?
-                               output.control_uri : output.data_uri;
-
-                       /* URL has to be provided, even if we'll overwrite it after. */
-                       ret = lttng_create_session_live(name, url, live_timer_interval);
+                       /*
+                        * URLs are provided for sure since the test above make sure that
+                        * 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);
                } else {
                        ret = lttng_create_session(name, NULL);
                }
@@ -2341,7 +2380,14 @@ int load_session_from_path(const char *path, const char *session_name,
 
        directory = opendir(path);
        if (!directory) {
-               if (errno != ENOTDIR) {
+               switch (errno) {
+               case ENOTDIR:
+                       /* Try the file loading. */
+                       break;
+               case ENOENT:
+                       ret = -LTTNG_ERR_LOAD_SESSION_NOENT;
+                       goto end;
+               default:
                        ret = -LTTNG_ERR_LOAD_IO_FAIL;
                        goto end;
                }
This page took 0.026406 seconds and 4 git commands to generate.