Tag events created as side-effect of agent events as internal
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 95e371d7b66fe527da607a7c60d0c49b871a2e63..50ff1632fb1bc3439e3517cdd66cc5129ed85146 100644 (file)
@@ -38,6 +38,7 @@
 #include "lttng-sessiond.h"
 #include "utils.h"
 #include "syscall.h"
+#include "agent.h"
 
 #include "cmd.h"
 
@@ -1382,6 +1383,7 @@ static int validate_event_name(const char *name)
        int ret = 0;
        const char *c = name;
        const char *event_name_end = c + LTTNG_SYMBOL_NAME_LEN;
+       bool null_terminated = false;
 
        /*
         * Make sure that unescaped wildcards are only used as the last
@@ -1390,6 +1392,7 @@ static int validate_event_name(const char *name)
        while (c < event_name_end) {
                switch (*c) {
                case '\0':
+                       null_terminated = true;
                        goto end;
                case '\\':
                        c++;
@@ -1406,19 +1409,34 @@ static int validate_event_name(const char *name)
                c++;
        }
 end:
+       if (!ret && !null_terminated) {
+               ret = LTTNG_ERR_INVALID_EVENT_NAME;
+       }
        return ret;
 }
 
+
+static int cmd_enable_event_internal(struct ltt_session *session,
+               struct lttng_domain *domain,
+               char *channel_name, struct lttng_event *event,
+               char *filter_expression,
+               struct lttng_filter_bytecode *filter,
+               struct lttng_event_exclusion *exclusion,
+               int wpipe);
+
 /*
- * Command LTTNG_ENABLE_EVENT processed by the client thread.
- * We own filter, exclusion, and filter_expression.
+ * Internal version of cmd_enable_event() with a supplemental
+ * "internal_event" flag which is used to enable internal events which should
+ * be hidden from clients. Such events are used in the agent implementation to
+ * enable the events through which all "agent" events are funeled.
  */
-int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
+static int _cmd_enable_event(struct ltt_session *session,
+               struct lttng_domain *domain,
                char *channel_name, struct lttng_event *event,
                char *filter_expression,
                struct lttng_filter_bytecode *filter,
                struct lttng_event_exclusion *exclusion,
-               int wpipe)
+               int wpipe, bool internal_event)
 {
        int ret, channel_created = 0;
        struct lttng_channel *attr;
@@ -1512,6 +1530,9 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
                        event->type = LTTNG_EVENT_TRACEPOINT;   /* Hack */
                        ret = event_kernel_enable_event(kchan, event,
                                filter_expression, filter);
+                       /* We have passed ownership */
+                       filter_expression = NULL;
+                       filter = NULL;
                        if (ret != LTTNG_OK) {
                                if (channel_created) {
                                        /* Let's not leak a useless channel. */
@@ -1537,6 +1558,9 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
                case LTTNG_EVENT_TRACEPOINT:
                        ret = event_kernel_enable_event(kchan, event,
                                filter_expression, filter);
+                       /* We have passed ownership */
+                       filter_expression = NULL;
+                       filter = NULL;
                        if (ret != LTTNG_OK) {
                                if (channel_created) {
                                        /* Let's not leak a useless channel. */
@@ -1548,6 +1572,9 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
                case LTTNG_EVENT_SYSCALL:
                        ret = event_kernel_enable_event(kchan, event,
                                filter_expression, filter);
+                       /* We have passed ownership */
+                       filter_expression = NULL;
+                       filter = NULL;
                        if (ret != LTTNG_OK) {
                                goto error;
                        }
@@ -1605,7 +1632,8 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
 
                /* At this point, the session and channel exist on the tracer */
                ret = event_ust_enable_tracepoint(usess, uchan, event,
-                               filter_expression, filter, exclusion);
+                               filter_expression, filter, exclusion,
+                               internal_event);
                /* We have passed ownership */
                filter_expression = NULL;
                filter = NULL;
@@ -1688,7 +1716,7 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
                                        + filter->len);
                        }
 
-                       ret = cmd_enable_event(session, &tmp_dom,
+                       ret = cmd_enable_event_internal(session, &tmp_dom,
                                        (char *) default_chan_name,
                                        &uevent, filter_expression, filter_copy,
                                        NULL, wpipe);
@@ -1729,6 +1757,38 @@ error:
        return ret;
 }
 
+/*
+ * Command LTTNG_ENABLE_EVENT processed by the client thread.
+ * We own filter, exclusion, and filter_expression.
+ */
+int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
+               char *channel_name, struct lttng_event *event,
+               char *filter_expression,
+               struct lttng_filter_bytecode *filter,
+               struct lttng_event_exclusion *exclusion,
+               int wpipe)
+{
+       return _cmd_enable_event(session, domain, channel_name, event,
+                       filter_expression, filter, exclusion, wpipe, false);
+}
+
+/*
+ * Enable an event which is internal to LTTng. An internal should
+ * never be made visible to clients and are immune to checks such as
+ * reserved names.
+ */
+static int cmd_enable_event_internal(struct ltt_session *session,
+               struct lttng_domain *domain,
+               char *channel_name, struct lttng_event *event,
+               char *filter_expression,
+               struct lttng_filter_bytecode *filter,
+               struct lttng_event_exclusion *exclusion,
+               int wpipe)
+{
+       return _cmd_enable_event(session, domain, channel_name, event,
+                       filter_expression, filter, exclusion, wpipe, true);
+}
+
 /*
  * Command LTTNG_LIST_TRACEPOINTS processed by the client thread.
  */
@@ -1888,9 +1948,7 @@ int cmd_start_trace(struct ltt_session *session)
         * possible to enable channel thus inform the client.
         */
        if (usess && usess->domain_global.channels) {
-               rcu_read_lock();
                nb_chan += lttng_ht_get_count(usess->domain_global.channels);
-               rcu_read_unlock();
        }
        if (ksession) {
                nb_chan += ksession->channel_count;
@@ -2447,6 +2505,10 @@ ssize_t cmd_list_domains(struct ltt_session *session,
 
        if (session->kernel_session != NULL) {
                (*domains)[index].type = LTTNG_DOMAIN_KERNEL;
+
+               /* Kernel session buffer type is always GLOBAL */
+               (*domains)[index].buf_type = LTTNG_BUFFER_GLOBAL;
+
                index++;
        }
 
This page took 0.025895 seconds and 4 git commands to generate.