Add new API call lttng_channel_set_default_attr
[lttng-tools.git] / lttng / commands / enable_channels.c
index 13511cc869803097edff9bc2542a35218b38e870..5c9af1d9c8517b7c6e2998295e26516fb78b9590 100644 (file)
 #include "../utils.h"
 
 static char *opt_channels;
-static char *opt_kernel;
+static int opt_kernel;
 static char *opt_cmd_name;
 static char *opt_session_name;
 static int opt_pid_all;
 static int opt_userspace;
+static char *opt_cmd_name;
 static pid_t opt_pid;
 static struct lttng_channel chan;
 
@@ -57,7 +58,7 @@ static struct poptOption long_options[] = {
        {"help",           'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
        {"session",        's', POPT_ARG_STRING, &opt_session_name, 0, 0, 0},
        {"kernel",         'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0},
-       {"userspace",      'u', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, 0, OPT_USERSPACE, 0, 0},
+       {"userspace",      'u', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, &opt_cmd_name, OPT_USERSPACE, 0, 0},
        {"all",            0,   POPT_ARG_VAL, &opt_pid_all, 1, 0, 0},
        {"pid",            'p', POPT_ARG_INT, &opt_pid, 0, 0, 0},
        {"discard",        0,   POPT_ARG_NONE, 0, OPT_DISCARD, 0, 0},
@@ -103,6 +104,37 @@ static void usage(FILE *ofp)
        fprintf(ofp, "\n");
 }
 
+/*
+ * Set default attributes depending on those already defined from the command
+ * line.
+ */
+static void set_default_attr(struct lttng_domain *dom)
+{
+       struct lttng_channel_attr default_attr;
+
+       /* Set attributes */
+       lttng_channel_set_default_attr(dom, &default_attr);
+
+       if (chan.attr.overwrite == -1) {
+               chan.attr.overwrite = default_attr.overwrite;
+       }
+       if (chan.attr.subbuf_size == -1) {
+               chan.attr.subbuf_size = default_attr.subbuf_size;
+       }
+       if (chan.attr.num_subbuf == -1) {
+               chan.attr.num_subbuf = default_attr.num_subbuf;
+       }
+       if (chan.attr.switch_timer_interval == -1) {
+               chan.attr.switch_timer_interval = default_attr.switch_timer_interval;
+       }
+       if (chan.attr.read_timer_interval == -1) {
+               chan.attr.read_timer_interval = default_attr.read_timer_interval;
+       }
+       if (chan.attr.output == -1) {
+               chan.attr.output = default_attr.output;
+       }
+}
+
 /*
  * Adding channel using the lttng API.
  */
@@ -118,12 +150,19 @@ static int enable_channel(char *session_name)
                dom.type = LTTNG_DOMAIN_UST_PID;
                dom.attr.pid = opt_pid;
                DBG("PID %d set to lttng handle", opt_pid);
+       } else if (opt_userspace && opt_cmd_name == NULL) {
+               dom.type = LTTNG_DOMAIN_UST;
+       } else if (opt_userspace && opt_cmd_name != NULL) {
+               dom.type = LTTNG_DOMAIN_UST_EXEC_NAME;
+               strncpy(dom.attr.exec_name, opt_cmd_name, NAME_MAX);
        } else {
                ERR("Please specify a tracer (--kernel or --userspace)");
                ret = CMD_NOT_IMPLEMENTED;
                goto error;
        }
 
+       set_default_attr(&dom);
+
        handle = lttng_create_handle(session_name, &dom);
        if (handle == NULL) {
                ret = -1;
@@ -162,25 +201,11 @@ error:
  */
 static void init_channel_config(void)
 {
-       if (opt_kernel) {
-               /* kernel default */
-               chan.attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
-               chan.attr.switch_timer_interval = DEFAULT_CHANNEL_SWITCH_TIMER;
-               chan.attr.read_timer_interval = DEFAULT_CHANNEL_READ_TIMER;
-
-               chan.attr.subbuf_size = DEFAULT_KERNEL_CHANNEL_SUBBUF_SIZE;
-               chan.attr.num_subbuf = DEFAULT_KERNEL_CHANNEL_SUBBUF_NUM;
-               chan.attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT;
-       } else {
-               /* default behavior, used by UST. */
-               chan.attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
-               chan.attr.switch_timer_interval = DEFAULT_CHANNEL_SWITCH_TIMER;
-               chan.attr.read_timer_interval = DEFAULT_CHANNEL_READ_TIMER;
-
-               chan.attr.subbuf_size = DEFAULT_CHANNEL_SUBBUF_SIZE;
-               chan.attr.num_subbuf = DEFAULT_CHANNEL_SUBBUF_NUM;
-               chan.attr.output = DEFAULT_CHANNEL_OUTPUT;
-       }
+       /*
+        * Put -1 everywhere so we can identify those set by the command line and
+        * those needed to be set by the default values.
+        */
+       memset(&chan.attr, -1, sizeof(chan.attr));
 }
 
 /*
@@ -203,10 +228,6 @@ int cmd_enable_channels(int argc, const char **argv)
                        usage(stderr);
                        ret = CMD_SUCCESS;
                        goto end;
-               case OPT_USERSPACE:
-                       opt_userspace = 1;
-                       opt_cmd_name = poptGetOptArg(pc);
-                       break;
                case OPT_DISCARD:
                        chan.attr.overwrite = 0;
                        DBG("Channel set to discard");
@@ -231,6 +252,9 @@ int cmd_enable_channels(int argc, const char **argv)
                        chan.attr.read_timer_interval = atoi(poptGetOptArg(pc));
                        DBG("Channel read timer interval set to %d", chan.attr.read_timer_interval);
                        break;
+               case OPT_USERSPACE:
+                       opt_userspace = 1;
+                       break;
                default:
                        usage(stderr);
                        ret = CMD_UNDEFINED;
This page took 0.024521 seconds and 4 git commands to generate.