Cleanup: remove unused m4/libxml.m4
[lttng-tools.git] / src / lib / lttng-ctl / load.c
index be236f242b25b9fb0096ba42e73167d6400fb38b..e70a87d9228ae994a3da007b859a44ed11039be1 100644 (file)
@@ -43,19 +43,49 @@ void reset_load_session_attr_urls(struct lttng_load_session_attr *attr)
        free(attr->raw_override_path_url);
        free(attr->raw_override_ctrl_url);
        free(attr->raw_override_data_url);
-       free(attr->override_attr.path_url);
-       free(attr->override_attr.ctrl_url);
-       free(attr->override_attr.data_url);
+       if (attr->override_attr) {
+               free(attr->override_attr->path_url);
+               free(attr->override_attr->ctrl_url);
+               free(attr->override_attr->data_url);
+               free(attr->override_attr->session_name);
+       }
 }
 
 void lttng_load_session_attr_destroy(struct lttng_load_session_attr *attr)
 {
        if (attr) {
                reset_load_session_attr_urls(attr);
+               free(attr->override_attr);
                free(attr);
        }
 }
 
+static int validate_attr(const struct lttng_load_session_attr *attr)
+{
+       int ret = 0;
+
+       if (!attr) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       if (!attr->override_attr) {
+               goto end;
+       }
+
+       /*
+        * Refuse override name if the objective is to load multiple session
+        * since this operation is ambiguous while loading multiple session.
+        */
+       if (attr->override_attr->session_name
+                       && attr->session_name[0] == '\0') {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+end:
+       return ret;
+}
+
 const char *lttng_load_session_attr_get_session_name(
        struct lttng_load_session_attr *attr)
 {
@@ -86,53 +116,63 @@ int lttng_load_session_attr_get_overwrite(
        return attr ? attr->overwrite : -LTTNG_ERR_INVALID;
 }
 
-const char *lttng_load_session_attr_get_override_path_url(
+const char *lttng_load_session_attr_get_override_ctrl_url(
        struct lttng_load_session_attr *attr)
 {
        const char *ret = NULL;
 
-       if (attr && attr->override_attr.path_url) {
-               ret = attr->raw_override_path_url;
+       if (!attr || !attr->override_attr) {
+               goto end;
        }
 
+       ret = attr->raw_override_ctrl_url;
+end:
        return ret;
 }
 
-const char *lttng_load_session_attr_get_override_ctrl_url(
+const char *lttng_load_session_attr_get_override_data_url(
        struct lttng_load_session_attr *attr)
 {
        const char *ret = NULL;
 
-       if (attr && attr->override_attr.ctrl_url) {
-               ret = attr->raw_override_ctrl_url;
+       if (!attr || !attr->override_attr) {
+               goto end;
        }
 
+       ret = attr->raw_override_data_url;
+end:
        return ret;
 }
 
-const char *lttng_load_session_attr_get_override_data_url(
-       struct lttng_load_session_attr *attr)
+const char *lttng_load_session_attr_get_override_url(
+               struct lttng_load_session_attr *attr)
 {
        const char *ret = NULL;
 
-       if (attr && attr->override_attr.data_url) {
-               ret = attr->raw_override_data_url;
+       if (!attr || !attr->override_attr) {
+               goto end;
        }
 
+       if ((attr->override_attr->path_url ||
+               (attr->override_attr->ctrl_url &&
+                attr->override_attr->data_url))) {
+               ret = attr->raw_override_url;
+       }
+end:
        return ret;
 }
 
-const char *lttng_load_session_attr_get_override_url(
+const char *lttng_load_session_attr_get_override_session_name(
                struct lttng_load_session_attr *attr)
 {
        const char *ret = NULL;
 
-       if (attr && (attr->override_attr.path_url ||
-               (attr->override_attr.ctrl_url &&
-                attr->override_attr.data_url))) {
-               ret = attr->raw_override_url;
+       if (!attr || !attr->override_attr) {
+               goto end;
        }
 
+       ret = attr->override_attr->session_name;
+end:
        return ret;
 }
 
@@ -233,12 +273,19 @@ int lttng_load_session_attr_set_override_ctrl_url(
                goto end;
        }
 
-       if (attr->override_attr.path_url) {
+       if (!attr->override_attr) {
+               attr->override_attr = zmalloc(
+                       sizeof(struct config_load_session_override_attr));
+               if (!attr->override_attr) {
+                       ret = -LTTNG_ERR_NOMEM;
+                       goto end;
+               }
+       }
+
+       if (attr->override_attr->path_url) {
                /*
-                * FIXME: return a more meaningful error.
-                * Setting a ctrl override after a path override make no
-                * sense.
-                * */
+                * Setting a ctrl override after a path override makes no sense.
+                */
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
@@ -279,11 +326,11 @@ int lttng_load_session_attr_set_override_ctrl_url(
        }
 
        /* Squash old value if any */
-       free(attr->override_attr.ctrl_url);
+       free(attr->override_attr->ctrl_url);
        free(attr->raw_override_ctrl_url);
 
        /* Populate the object */
-       attr->override_attr.ctrl_url = url_str;
+       attr->override_attr->ctrl_url = url_str;
        attr->raw_override_ctrl_url = raw_str;
 
        /* Ownership passed to attr. */
@@ -311,7 +358,19 @@ int lttng_load_session_attr_set_override_data_url(
                goto end;
        }
 
-       if (attr->override_attr.path_url) {
+       if (!attr->override_attr) {
+               attr->override_attr = zmalloc(
+                       sizeof(struct config_load_session_override_attr));
+               if (!attr->override_attr) {
+                       ret = -LTTNG_ERR_NOMEM;
+                       goto end;
+               }
+       }
+
+       if (attr->override_attr->path_url) {
+               /*
+                * Setting a data override after a path override makes no sense.
+                */
                ret = -LTTNG_ERR_INVALID;
                goto end;
        }
@@ -351,11 +410,11 @@ int lttng_load_session_attr_set_override_data_url(
        }
 
        /* Squash old value if any */
-       free(attr->override_attr.data_url);
+       free(attr->override_attr->data_url);
        free(attr->raw_override_data_url);
 
        /* Populate the object */
-       attr->override_attr.data_url = url_str;
+       attr->override_attr->data_url = url_str;
        attr->raw_override_data_url = raw_str;
 
        /* Ownership passed to attr. */
@@ -388,6 +447,15 @@ int lttng_load_session_attr_set_override_url(
                goto end;
        }
 
+       if (!attr->override_attr) {
+               attr->override_attr = zmalloc(
+                       sizeof(struct config_load_session_override_attr));
+               if (!attr->override_attr) {
+                       ret = -LTTNG_ERR_NOMEM;
+                       goto end;
+               }
+       }
+
        /*
         * FIXME: uri_parse should be able to take as parameter the protocol
         * type to validate "url". For now only check the parsing goes through;
@@ -475,9 +543,9 @@ int lttng_load_session_attr_set_override_url(
 
        reset_load_session_attr_urls(attr);
 
-       attr->override_attr.path_url = path_str;
-       attr->override_attr.ctrl_url = ctrl_str;
-       attr->override_attr.data_url = data_str;
+       attr->override_attr->path_url = path_str;
+       attr->override_attr->ctrl_url = ctrl_str;
+       attr->override_attr->data_url = data_str;
 
        attr->raw_override_url = raw_url_str;
        attr->raw_override_path_url = raw_path_str;
@@ -505,6 +573,42 @@ end:
        return ret;
 }
 
+int lttng_load_session_attr_set_override_session_name(
+       struct lttng_load_session_attr *attr, const char *session_name)
+{
+       int ret = 0;
+       size_t len;
+
+       if (!attr ||!session_name) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       if (!attr->override_attr) {
+               attr->override_attr = zmalloc(
+                       sizeof(struct config_load_session_override_attr));
+               if (!attr->override_attr) {
+                       ret = -LTTNG_ERR_NOMEM;
+                       goto end;
+               }
+       }
+
+       len = strlen(session_name);
+       if (len >= LTTNG_NAME_MAX) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       attr->override_attr->session_name = lttng_strndup(session_name,
+               len);
+       if (!attr->override_attr->session_name) {
+               ret = -LTTNG_ERR_NOMEM;
+               goto end;
+       }
+end:
+       return ret;
+}
+
 int lttng_load_session(struct lttng_load_session_attr *attr)
 {
        int ret;
@@ -515,11 +619,17 @@ int lttng_load_session(struct lttng_load_session_attr *attr)
                goto end;
        }
 
+       ret = validate_attr(attr);
+       if (ret) {
+               goto end;
+       }
+
        url = attr->input_url[0] != '\0' ? attr->input_url : NULL;
        session_name = attr->session_name[0] != '\0' ?
                        attr->session_name : NULL;
 
-       ret = config_load_session(url, session_name, attr->overwrite, 0);
+       ret = config_load_session(url, session_name, attr->overwrite, 0,
+                       attr->override_attr);
 
 end:
        return ret;
This page took 0.027149 seconds and 4 git commands to generate.