Tests: add placeholder symbol to allow unit tests to link
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 325ffd2cf14f6ec3e320e402e8db17a6dac71adc..5e146931e5e31d848d99232068c9c4c8b59aca5a 100644 (file)
 #include <common/utils.h>
 #include <common/compat/string.h>
 #include <common/kernel-ctl/kernel-ctl.h>
+#include <common/dynamic-buffer.h>
+#include <common/buffer-view.h>
+#include <lttng/trigger/trigger-internal.h>
+#include <lttng/condition/condition.h>
+#include <lttng/action/action.h>
+#include <lttng/channel-internal.h>
 
 #include "channel.h"
 #include "consumer.h"
@@ -41,6 +47,8 @@
 #include "syscall.h"
 #include "agent.h"
 #include "buffer-registry.h"
+#include "notification-thread.h"
+#include "notification-thread-commands.h"
 
 #include "cmd.h"
 
@@ -3377,6 +3385,27 @@ end:
        return ret;
 }
 
+static
+int clear_metadata_file(int fd)
+{
+       int ret;
+
+       ret = lseek(fd, 0, SEEK_SET);
+       if (ret < 0) {
+               PERROR("lseek");
+               goto end;
+       }
+
+       ret = ftruncate(fd, 0);
+       if (ret < 0) {
+               PERROR("ftruncate");
+               goto end;
+       }
+
+end:
+       return ret;
+}
+
 static
 int ust_regenerate_metadata(struct ltt_ust_session *usess)
 {
@@ -3398,6 +3427,15 @@ int ust_regenerate_metadata(struct ltt_ust_session *usess)
                memset(registry->metadata, 0, registry->metadata_alloc_len);
                registry->metadata_len = 0;
                registry->metadata_version++;
+               if (registry->metadata_fd > 0) {
+                       /* Clear the metadata file's content. */
+                       ret = clear_metadata_file(registry->metadata_fd);
+                       if (ret) {
+                               pthread_mutex_unlock(&registry->lock);
+                               goto end;
+                       }
+               }
+
                ret = ust_metadata_session_statedump(registry, NULL,
                                registry->major, registry->minor);
                if (ret) {
@@ -3536,6 +3574,90 @@ end:
        return ret;
 }
 
+int cmd_register_trigger(struct command_ctx *cmd_ctx, int sock,
+               struct notification_thread_handle *notification_thread)
+{
+       int ret;
+       size_t trigger_len;
+       ssize_t sock_recv_len;
+       struct lttng_trigger *trigger = NULL;
+       struct lttng_buffer_view view;
+       struct lttng_dynamic_buffer trigger_buffer;
+
+       lttng_dynamic_buffer_init(&trigger_buffer);
+       trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
+       ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
+       if (ret) {
+               ret = LTTNG_ERR_NOMEM;
+               goto end;
+       }
+
+       sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
+                       trigger_len);
+       if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
+               ERR("Failed to receive \"register trigger\" command payload");
+               /* TODO: should this be a new error enum ? */
+               ret = LTTNG_ERR_INVALID_TRIGGER;
+               goto end;
+       }
+
+       view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
+       if (lttng_trigger_create_from_buffer(&view, &trigger) !=
+                       trigger_len) {
+               ERR("Invalid trigger payload received in \"register trigger\" command");
+               ret = LTTNG_ERR_INVALID_TRIGGER;
+               goto end;
+       }
+
+       ret = notification_thread_command_register_trigger(notification_thread,
+                       trigger);
+end:
+       lttng_dynamic_buffer_reset(&trigger_buffer);
+       return ret;
+}
+
+int cmd_unregister_trigger(struct command_ctx *cmd_ctx, int sock,
+               struct notification_thread_handle *notification_thread)
+{
+       int ret;
+       size_t trigger_len;
+       ssize_t sock_recv_len;
+       struct lttng_trigger *trigger = NULL;
+       struct lttng_buffer_view view;
+       struct lttng_dynamic_buffer trigger_buffer;
+
+       lttng_dynamic_buffer_init(&trigger_buffer);
+       trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
+       ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
+       if (ret) {
+               ret = LTTNG_ERR_NOMEM;
+               goto end;
+       }
+
+       sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
+                       trigger_len);
+       if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
+               ERR("Failed to receive \"unregister trigger\" command payload");
+               /* TODO: should this be a new error enum ? */
+               ret = LTTNG_ERR_INVALID_TRIGGER;
+               goto end;
+       }
+
+       view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
+       if (lttng_trigger_create_from_buffer(&view, &trigger) !=
+                       trigger_len) {
+               ERR("Invalid trigger payload received in \"unregister trigger\" command");
+               ret = LTTNG_ERR_INVALID_TRIGGER;
+               goto end;
+       }
+
+       ret = notification_thread_command_unregister_trigger(notification_thread,
+                       trigger);
+end:
+       lttng_dynamic_buffer_reset(&trigger_buffer);
+       return ret;
+}
+
 /*
  * Send relayd sockets from snapshot output to consumer. Ignore request if the
  * snapshot output is *not* set with a remote destination.
This page took 0.02619 seconds and 4 git commands to generate.