Add ust start trace feature
[lttng-tools.git] / lttng / lttng.c
index 3878fb8367614654d1e837951c121024803e8366..e538df2fd403f0eefaf2be2c58b3c8a04973067d 100644 (file)
@@ -45,6 +45,8 @@ static int process_opt_list_sessions(void);
 static int process_opt_create_session(void);
 static void sighandler(int sig);
 static int set_signal_handler(void);
+static int get_cmdline_by_pid(pid_t pid, char **cmdline);
+static int validate_options(void);
 
 /*
  *  start_client
@@ -94,6 +96,7 @@ static int process_client_opt(void)
        }
 
        if (opt_session_uuid != NULL) {
+               DBG("Set session uuid to %s", opt_session_uuid);
                lttng_set_current_session_uuid(opt_session_uuid);
        }
 
@@ -103,7 +106,16 @@ static int process_client_opt(void)
                if (ret < 0) {
                        goto end;
                }
-               MSG("Trace created successfully!\nUse --start PID to start tracing");
+               MSG("Trace created successfully!\nUse --start PID to start tracing.");
+       }
+
+       if (opt_start_trace) {
+               DBG("Start trace for pid %d", opt_start_trace);
+               ret = lttng_ust_start_trace(opt_start_trace);
+               if (ret < 0) {
+                       goto end;
+               }
+               MSG("Trace started successfully!");
        }
 
        return 0;
@@ -180,9 +192,7 @@ static int process_opt_list_apps(void)
 {
        int i, ret, count;
        pid_t *pids;
-       FILE *fp;
-       char path[24];  /* Can't go bigger than /proc/65535/cmdline */
-       char cmdline[PATH_MAX];
+       char *cmdline;
 
        count = lttng_ust_list_apps(&pids);
        if (count < 0) {
@@ -192,15 +202,13 @@ static int process_opt_list_apps(void)
 
        MSG("LTTng UST traceable application [name (pid)]:");
        for (i=0; i < count; i++) {
-               snprintf(path, sizeof(path), "/proc/%d/cmdline", pids[i]);
-               fp = fopen(path, "r");
-               if (fp == NULL) {
+               ret = get_cmdline_by_pid(pids[i], &cmdline);
+               if (!ret) {
                        MSG("\t(not running) (%d)", pids[i]);
                        continue;
                }
-               ret = fread(cmdline, 1, sizeof(cmdline), fp);
                MSG("\t%s (%d)", cmdline, pids[i]);
-               fclose(fp);
+               free(cmdline);
        }
 
        /* Allocated by lttng_ust_list_apps() */
@@ -212,6 +220,62 @@ error:
        return ret;
 }
 
+/*
+ *  get_cmdline_by_pid
+ *
+ *  Get command line from /proc for a
+ *  specific pid. Allocate cmdline so the
+ *  user must free() that pointer.
+ *
+ *  On success, return 1
+ *  On error (not found), return 0
+ */
+static int get_cmdline_by_pid(pid_t pid, char **cmdline)
+{
+       int ret;
+       FILE *fp;
+       char path[24];  /* Can't go bigger than /proc/65535/cmdline */
+
+       snprintf(path, sizeof(path), "/proc/%d/cmdline", pid);
+       fp = fopen(path, "r");
+       if (fp == NULL) {
+               goto not_running;
+       }
+
+       /* Caller must free() *cmdline */
+       *cmdline = malloc(PATH_MAX);
+       ret = fread(*cmdline, 1, PATH_MAX, fp);
+       fclose(fp);
+
+       return 1;
+
+not_running:
+       return 0;
+}
+
+/*
+ *  validate_options
+ *
+ *  Make sure that all options passed to the command line
+ *  are compatible with each others.
+ *
+ *  On error, return -1
+ *  On success, return 0
+ */
+static int validate_options(void)
+{
+       if ((opt_session_uuid == NULL) &&
+                       (opt_create_trace || opt_start_trace)) {
+               ERR("Can't act on trace without a session ID.\nPlease specify using --session UUID");
+               goto error;
+       }
+
+       return 0;
+
+error:
+       return -1;
+}
+
 /*
  *  spawn_sessiond
  *
@@ -346,15 +410,17 @@ end:
  */
 static void sighandler(int sig)
 {
-       DBG("%d received", sig);
        switch (sig) {
                case SIGTERM:
+                       DBG("SIGTERM catched");
                        clean_exit(EXIT_FAILURE);
                        break;
                case SIGCHLD:
                        /* Notify is done */
+                       DBG("SIGCHLD catched");
                        break;
                default:
+                       DBG("Unknown signal %d catched", sig);
                        break;
        }
 
@@ -391,6 +457,11 @@ int main(int argc, char *argv[])
                clean_exit(EXIT_FAILURE);
        }
 
+       ret = validate_options();
+       if (ret < 0) {
+               return EXIT_FAILURE;
+       }
+
        ret = set_signal_handler();
        if (ret < 0) {
                clean_exit(ret);
This page took 0.024867 seconds and 4 git commands to generate.