Fix: null pointer dereference in lttng_rotation_handle_destroy
[lttng-tools.git] / src / lib / lttng-ctl / rotate.c
index 4132159323ab98cf2092ee88dcc075180072f0fa..26cc5f94f8fb10361d43a20c968da7a9a6db9500 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <lttng/lttng-error.h>
 #include <lttng/rotation.h>
+#include <lttng/location-internal.h>
 #include <lttng/rotate-internal.h>
 #include <common/sessiond-comm/sessiond-comm.h>
 #include <common/macros.h>
@@ -32,12 +33,25 @@ struct lttng_rotation_immediate_attr *lttng_rotation_immediate_attr_create(void)
        return zmalloc(sizeof(struct lttng_rotation_immediate_attr));
 }
 
+struct lttng_rotation_schedule_attr *lttng_rotation_schedule_attr_create(void)
+{
+       return zmalloc(sizeof(struct lttng_rotation_schedule_attr));
+}
+
 void lttng_rotation_immediate_attr_destroy(
                struct lttng_rotation_immediate_attr *attr)
 {
        free(attr);
 }
 
+void lttng_rotation_schedule_attr_destroy(struct lttng_rotation_schedule_attr *attr)
+{
+       if (attr) {
+               free(attr);
+               attr = NULL;
+       }
+}
+
 enum lttng_rotation_status lttng_rotation_immediate_attr_set_session_name(
                struct lttng_rotation_immediate_attr *attr,
                const char *session_name)
@@ -97,13 +111,84 @@ end:
 
 }
 
+enum lttng_rotation_status lttng_rotation_schedule_attr_set_session_name(
+               struct lttng_rotation_schedule_attr *attr,
+               const char *session_name)
+{
+       enum lttng_rotation_status status = LTTNG_ROTATION_STATUS_OK;
+       int ret;
+
+       if (!attr || !session_name) {
+               status = LTTNG_ROTATION_STATUS_INVALID;
+               goto error;
+       }
+
+       ret = lttng_strncpy(attr->session_name, session_name,
+                       sizeof(attr->session_name));
+       if (ret) {
+               status = LTTNG_ROTATION_STATUS_INVALID;
+               goto error;
+       }
+
+error:
+       return status;
+}
+
+enum lttng_rotation_status lttng_rotation_schedule_attr_set_timer_period(
+               struct lttng_rotation_schedule_attr *attr,
+               uint64_t timer)
+{
+       enum lttng_rotation_status status = LTTNG_ROTATION_STATUS_OK;
+
+       if (!attr) {
+               status = LTTNG_ROTATION_STATUS_INVALID;
+               goto end;
+       }
+
+       attr->timer_us = timer;
+end:
+       return status;
+}
+
+void lttng_rotation_schedule_attr_set_size(
+               struct lttng_rotation_schedule_attr *attr, uint64_t size)
+{
+       attr->size = size;
+}
+
+static
+struct lttng_trace_archive_location *
+create_trace_archive_location_from_get_info(
+               const struct lttng_rotation_get_info_return *info)
+{
+       struct lttng_trace_archive_location *location;
+
+       switch (info->location_type) {
+       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
+               location = lttng_trace_archive_location_local_create(
+                               info->location.local.absolute_path);
+               break;
+       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY:
+               location = lttng_trace_archive_location_relay_create(
+                               info->location.relay.host,
+                               info->location.relay.protocol,
+                               info->location.relay.ports.control,
+                               info->location.relay.ports.data,
+                               info->location.relay.relative_path);
+               break;
+       default:
+               location = NULL;
+               break;
+       }
+       return location;
+}
+
 enum lttng_rotation_status lttng_rotation_handle_get_state(
                struct lttng_rotation_handle *rotation_handle,
                enum lttng_rotation_state *state)
 {
        enum lttng_rotation_status status = LTTNG_ROTATION_STATUS_OK;
        struct lttng_rotation_get_info_return *info = NULL;
-       int ret;
 
        if (!rotation_handle || !state) {
                status = LTTNG_ROTATION_STATUS_INVALID;
@@ -116,7 +201,7 @@ enum lttng_rotation_status lttng_rotation_handle_get_state(
        }
 
        *state = (enum lttng_rotation_state) info->status;
-       if (rotation_handle->archive_location.is_set ||
+       if (rotation_handle->archive_location ||
                        *state != LTTNG_ROTATION_STATE_COMPLETED) {
                /*
                 * The path is only provided by the sessiond once
@@ -129,35 +214,32 @@ enum lttng_rotation_status lttng_rotation_handle_get_state(
         * Cache the location since the rotation may expire before the user
         * has a chance to query it.
         */
-       ret = lttng_strncpy(rotation_handle->archive_location.path,
-                       info->path,
-                       sizeof(rotation_handle->archive_location.path));
-       if (ret) {
+       rotation_handle->archive_location =
+                       create_trace_archive_location_from_get_info(info);
+       if (!rotation_handle->archive_location) {
                status = LTTNG_ROTATION_STATUS_ERROR;
                goto end;
        }
-       rotation_handle->archive_location.is_set = true;
 end:
        free(info);
        return status;
 }
 
-enum lttng_rotation_status lttng_rotation_handle_get_completed_archive_location(
+enum lttng_rotation_status lttng_rotation_handle_get_archive_location(
                struct lttng_rotation_handle *rotation_handle,
-               const char **path)
+               const struct lttng_trace_archive_location **location)
 {
-       int ret;
        enum lttng_rotation_status status = LTTNG_ROTATION_STATUS_OK;
        struct lttng_rotation_get_info_return *info = NULL;
 
-       if (!rotation_handle || !path) {
+       if (!rotation_handle || !location) {
                status = LTTNG_ROTATION_STATUS_INVALID;
                goto end;
        }
 
        /* Use the cached location we got from a previous query. */
-       if (rotation_handle->archive_location.is_set) {
-               *path = rotation_handle->archive_location.path;
+       if (rotation_handle->archive_location) {
+               *location = rotation_handle->archive_location;
                goto end;
        }
 
@@ -172,14 +254,12 @@ enum lttng_rotation_status lttng_rotation_handle_get_completed_archive_location(
                goto end;
        }
 
-       ret = lttng_strncpy(rotation_handle->archive_location.path,
-                       info->path,
-                       sizeof(rotation_handle->archive_location.path));
-       if (ret) {
+       rotation_handle->archive_location =
+                       create_trace_archive_location_from_get_info(info);
+       if (!rotation_handle->archive_location) {
                status = LTTNG_ROTATION_STATUS_ERROR;
                goto end;
        }
-       rotation_handle->archive_location.is_set = true;
 end:
        free(info);
        return status;
@@ -188,6 +268,10 @@ end:
 void lttng_rotation_handle_destroy(
                struct lttng_rotation_handle *rotation_handle)
 {
+       if (!rotation_handle) {
+               return;
+       }
+       lttng_trace_archive_location_destroy(rotation_handle->archive_location);
        free(rotation_handle);
 }
 
@@ -251,3 +335,81 @@ end:
        free(rotate_return);
        return ret;
 }
+
+/*
+ * Configure the automatic rotate parameters.
+ */
+int lttng_rotation_set_schedule(
+               struct lttng_rotation_schedule_attr *attr)
+{
+       struct lttcomm_session_msg lsm;
+       int ret;
+
+       if (!attr) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       memset(&lsm, 0, sizeof(lsm));
+       lsm.cmd_type = LTTNG_ROTATION_SET_SCHEDULE;
+       lttng_ctl_copy_string(lsm.session.name, attr->session_name,
+                       sizeof(lsm.session.name));
+       lsm.u.rotate_setup.timer_us = attr->timer_us;
+       lsm.u.rotate_setup.size = attr->size;
+
+       ret = lttng_ctl_ask_sessiond(&lsm, NULL);
+end:
+       return ret;
+}
+
+int lttng_rotation_schedule_get_timer_period(const char *session_name,
+               uint64_t *rotate_timer)
+{
+       struct lttcomm_session_msg lsm;
+       struct lttng_rotation_schedule_get_timer_period *get_timer = NULL;
+       int ret;
+
+       memset(&lsm, 0, sizeof(lsm));
+       lsm.cmd_type = LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD;
+       lttng_ctl_copy_string(lsm.session.name, session_name,
+                       sizeof(lsm.session.name));
+
+       ret = lttng_ctl_ask_sessiond(&lsm, (void **) &get_timer);
+       if (ret < 0) {
+               ret = -1;
+               goto end;
+       }
+
+       *rotate_timer = get_timer->rotate_timer;
+       ret = 0;
+end:
+       free(get_timer);
+       return ret;
+}
+
+int lttng_rotation_schedule_get_size(const char *session_name,
+               uint64_t *rotate_size)
+{
+       struct lttcomm_session_msg lsm;
+       struct lttng_rotation_schedule_get_size *get_size = NULL;
+       int ret;
+
+       memset(&lsm, 0, sizeof(lsm));
+       lsm.cmd_type = LTTNG_ROTATION_SCHEDULE_GET_SIZE;
+       lttng_ctl_copy_string(lsm.session.name, session_name,
+                       sizeof(lsm.session.name));
+
+       ret = lttng_ctl_ask_sessiond(&lsm, (void **) &get_size);
+       if (ret < 0) {
+               ret = -1;
+               goto end;
+       }
+
+       *rotate_size = get_size->rotate_size;
+
+       ret = 0;
+
+end:
+       free(get_size);
+       return ret;
+}
This page took 0.026354 seconds and 4 git commands to generate.