Add application context support to lttng-ctl lttng_add_context
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 26 Jan 2016 16:42:45 +0000 (11:42 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 12 Feb 2016 22:54:03 +0000 (17:54 -0500)
Forward the provider and context names of app contexts to the
session daemon.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/lttng/event.h
src/bin/lttng-sessiond/main.c
src/common/sessiond-comm/sessiond-comm.h
src/lib/lttng-ctl/lttng-ctl.c

index 3e8fbe3e83f5f6b92269771fa5f8391a6811a6d4..e5b2b4bb00702deddfab167613b00ff8b356e197 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2014 - David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2016 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
  * This library is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License, version 2.1 only,
@@ -121,21 +122,22 @@ enum lttng_event_output {
 
 /* Event context possible type */
 enum lttng_event_context_type {
-       LTTNG_EVENT_CONTEXT_PID               = 0,
-       LTTNG_EVENT_CONTEXT_PERF_COUNTER      = 1,      /* Backward compat. */
-       LTTNG_EVENT_CONTEXT_PROCNAME          = 2,
-       LTTNG_EVENT_CONTEXT_PRIO              = 3,
-       LTTNG_EVENT_CONTEXT_NICE              = 4,
-       LTTNG_EVENT_CONTEXT_VPID              = 5,
-       LTTNG_EVENT_CONTEXT_TID               = 6,
-       LTTNG_EVENT_CONTEXT_VTID              = 7,
-       LTTNG_EVENT_CONTEXT_PPID              = 8,
-       LTTNG_EVENT_CONTEXT_VPPID             = 9,
-       LTTNG_EVENT_CONTEXT_PTHREAD_ID        = 10,
-       LTTNG_EVENT_CONTEXT_HOSTNAME          = 11,
-       LTTNG_EVENT_CONTEXT_IP                = 12,
-       LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER  = 13,
+       LTTNG_EVENT_CONTEXT_PID                 = 0,
+       LTTNG_EVENT_CONTEXT_PERF_COUNTER        = 1,    /* Backward compat. */
+       LTTNG_EVENT_CONTEXT_PROCNAME            = 2,
+       LTTNG_EVENT_CONTEXT_PRIO                = 3,
+       LTTNG_EVENT_CONTEXT_NICE                = 4,
+       LTTNG_EVENT_CONTEXT_VPID                = 5,
+       LTTNG_EVENT_CONTEXT_TID                 = 6,
+       LTTNG_EVENT_CONTEXT_VTID                = 7,
+       LTTNG_EVENT_CONTEXT_PPID                = 8,
+       LTTNG_EVENT_CONTEXT_VPPID               = 9,
+       LTTNG_EVENT_CONTEXT_PTHREAD_ID          = 10,
+       LTTNG_EVENT_CONTEXT_HOSTNAME            = 11,
+       LTTNG_EVENT_CONTEXT_IP                  = 12,
+       LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER    = 13,
        LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER = 14,
+       LTTNG_EVENT_CONTEXT_APP_CONTEXT         = 15,
 };
 
 enum lttng_event_field_type {
@@ -178,6 +180,10 @@ struct lttng_event_context {
 
        union {
                struct lttng_event_perf_counter_ctx perf_counter;
+               struct {
+                       char *provider_name;
+                       char *ctx_name;
+               } app_ctx;
                char padding[LTTNG_EVENT_CONTEXT_PADDING2];
        } u;
 };
index c1f466ed72a6e470d88f085a81af3f8edf71a83c..7a8b5ae42dcfedb4c7af6a159997d3eaa98dd02f 100644 (file)
@@ -3343,9 +3343,74 @@ skip_domain:
        switch (cmd_ctx->lsm->cmd_type) {
        case LTTNG_ADD_CONTEXT:
        {
-               ret = cmd_add_context(cmd_ctx->session, cmd_ctx->lsm->domain.type,
+               /*
+                * An LTTNG_ADD_CONTEXT command might have a supplementary
+                * payload if the context being added is an application context.
+                */
+               if (cmd_ctx->lsm->u.context.ctx.ctx ==
+                               LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
+                       char *provider_name = NULL, *context_name = NULL;
+                       size_t provider_name_len =
+                                       cmd_ctx->lsm->u.context.provider_name_len;
+                       size_t context_name_len =
+                                       cmd_ctx->lsm->u.context.context_name_len;
+
+                       if (provider_name_len == 0 || context_name_len == 0) {
+                               /*
+                                * Application provider and context names MUST
+                                * be provided.
+                                */
+                               ret = -LTTNG_ERR_INVALID;
+                               goto error;
+                       }
+
+                       provider_name = zmalloc(provider_name_len + 1);
+                       if (!provider_name) {
+                               ret = -LTTNG_ERR_NOMEM;
+                               goto error;
+                       }
+
+                       context_name = zmalloc(context_name_len + 1);
+                       if (!context_name) {
+                               ret = -LTTNG_ERR_NOMEM;
+                               goto error_add_context;
+                       }
+
+                       ret = lttcomm_recv_unix_sock(sock, provider_name,
+                                       provider_name_len);
+                       if (ret < 0) {
+                               goto error_add_context;
+                       }
+
+                       ret = lttcomm_recv_unix_sock(sock, context_name,
+                                       context_name_len);
+                       if (ret < 0) {
+                               goto error_add_context;
+                       }
+                       cmd_ctx->lsm->u.context.ctx.u.app_ctx.provider_name =
+                                       provider_name;
+                       cmd_ctx->lsm->u.context.ctx.u.app_ctx.ctx_name =
+                                       context_name;
+               }
+
+               /*
+                * cmd_add_context assumes ownership of the provider and context
+                * names.
+                */
+               ret = cmd_add_context(cmd_ctx->session,
+                               cmd_ctx->lsm->domain.type,
                                cmd_ctx->lsm->u.context.channel_name,
-                               &cmd_ctx->lsm->u.context.ctx, kernel_poll_pipe[1]);
+                               &cmd_ctx->lsm->u.context.ctx,
+                               kernel_poll_pipe[1]);
+
+               cmd_ctx->lsm->u.context.ctx.u.app_ctx.provider_name = NULL;
+               cmd_ctx->lsm->u.context.ctx.u.app_ctx.ctx_name = NULL;
+error_add_context:
+               free(cmd_ctx->lsm->u.context.ctx.u.app_ctx.provider_name);
+               free(cmd_ctx->lsm->u.context.ctx.u.app_ctx.ctx_name);
+               if (ret < 0) {
+                       goto error;
+               }
                break;
        }
        case LTTNG_DISABLE_CHANNEL:
index 77861887688e3b2d86ae7dc335654865bf599e85..4a204c02e401fbbd8852545975dc3cce67bcc3bc 100644 (file)
@@ -270,6 +270,8 @@ struct lttcomm_session_msg {
                struct {
                        char channel_name[LTTNG_SYMBOL_NAME_LEN];
                        struct lttng_event_context ctx LTTNG_PACKED;
+                       uint32_t provider_name_len;
+                       uint32_t context_name_len;
                } LTTNG_PACKED context;
                /* Use by register_consumer */
                struct {
index 0dcd673ebaed084249afa638cd0dc00a9a52e2ca..03b74c0b74771a9d0be8158f152a617123799c47 100644 (file)
@@ -4,6 +4,7 @@
  * Linux Trace Toolkit Control Library
  *
  * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2016 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
  * This library is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License, version 2.1 only,
@@ -644,15 +645,18 @@ int lttng_add_context(struct lttng_handle *handle,
                struct lttng_event_context *ctx, const char *event_name,
                const char *channel_name)
 {
+       int ret;
+       size_t len = 0;
+       char *buf = NULL;
        struct lttcomm_session_msg lsm;
 
        /* Safety check. Both are mandatory. */
        if (handle == NULL || ctx == NULL) {
-               return -LTTNG_ERR_INVALID;
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
        }
 
        memset(&lsm, 0, sizeof(lsm));
-
        lsm.cmd_type = LTTNG_ADD_CONTEXT;
 
        /* If no channel name, send empty string. */
@@ -665,13 +669,52 @@ int lttng_add_context(struct lttng_handle *handle,
        }
 
        lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
-
-       memcpy(&lsm.u.context.ctx, ctx, sizeof(struct lttng_event_context));
-
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
 
-       return lttng_ctl_ask_sessiond(&lsm, NULL);
+       if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
+               size_t provider_len, ctx_len;
+               const char *provider_name = ctx->u.app_ctx.provider_name;
+               const char *ctx_name = ctx->u.app_ctx.ctx_name;
+
+               if (!provider_name || !ctx_name) {
+                       ret = -LTTNG_ERR_INVALID;
+                       goto end;
+               }
+
+               provider_len = strlen(provider_name);
+               if (provider_len == 0) {
+                       ret = -LTTNG_ERR_INVALID;
+                       goto end;
+               }
+               lsm.u.context.provider_name_len = provider_len;
+
+               ctx_len = strlen(ctx_name);
+               if (ctx_len == 0) {
+                       ret = -LTTNG_ERR_INVALID;
+                       goto end;
+               }
+               lsm.u.context.context_name_len = ctx_len;
+
+               len = provider_len + ctx_len;
+               buf = zmalloc(len);
+               if (!buf) {
+                       ret = -LTTNG_ERR_NOMEM;
+                       goto end;
+               }
+
+               memcpy(buf, provider_name, provider_len);
+               memcpy(buf + provider_len, ctx_name, ctx_len);
+       }
+       memcpy(&lsm.u.context.ctx, ctx, sizeof(struct lttng_event_context));
+       /* Don't leak application addresses to the sessiond. */
+       lsm.u.context.ctx.u.app_ctx.provider_name = NULL;
+       lsm.u.context.ctx.u.app_ctx.ctx_name = NULL;
+
+       ret = lttng_ctl_ask_sessiond_varlen(&lsm, buf, len, NULL);
+end:
+       free(buf);
+       return ret;
 }
 
 /*
This page took 0.032744 seconds and 5 git commands to generate.