Rename liblttngctl.h to lttng.h
[lttng-tools.git] / lttng / lttng.c
index 16487ff74a99cb2149bda0964af415ee2721868d..a5569c9af3186e7b9683ee871b32dbb73beee96e 100644 (file)
@@ -30,7 +30,7 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
-#include <lttng/liblttngctl.h>
+#include <lttng/lttng.h>
 
 #include "lttng.h"
 #include "lttngerr.h"
@@ -46,8 +46,8 @@ static int process_opt_list_traces(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);
+static char *get_cmdline_by_pid(pid_t pid);
 
 /*
  *  start_client
@@ -108,22 +108,37 @@ static int process_client_opt(void)
                lttng_set_current_session_uuid(opt_session_uuid);
        }
 
-       if (opt_create_trace) {
-               DBG("Create trace for pid %d", opt_create_trace);
-               ret = lttng_ust_create_trace(opt_create_trace);
-               if (ret < 0) {
-                       goto end;
-               }
-               MSG("Trace created successfully!\nUse --start PID to start tracing.");
+       if (opt_trace_kernel) {
+               ERR("Not implemented yet");
+               goto end;
        }
 
-       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;
+       if (opt_trace_pid != 0) {
+               if (opt_create_trace) {
+                       DBG("Create a userspace trace for pid %d", opt_trace_pid);
+                       ret = lttng_ust_create_trace(opt_trace_pid);
+                       if (ret < 0) {
+                               goto end;
+                       }
+                       MSG("Trace created successfully!\nUse --start to start tracing.");
                }
-               MSG("Trace started successfully!");
+
+               if (opt_start_trace) {
+                       DBG("Start trace for pid %d", opt_trace_pid);
+                       ret = lttng_ust_start_trace(opt_trace_pid);
+                       if (ret < 0) {
+                               goto end;
+                       }
+                       MSG("Trace started successfully!");
+               } else if (opt_stop_trace) {
+                       DBG("Stop trace for pid %d", opt_trace_pid);
+                       ret = lttng_ust_stop_trace(opt_trace_pid);
+                       if (ret < 0) {
+                               goto end;
+                       }
+                       MSG("Trace stopped successfully!");
+               }
+
        }
 
        return 0;
@@ -153,7 +168,9 @@ static int process_opt_list_traces(void)
        MSG("Userspace traces:");
        for (i = 0; i < ret; i++) {
                if (traces[i].type == USERSPACE) {
-                       MSG("\t%d) %s (pid: %d)", i, traces[i].name, traces[i].pid);
+                       MSG("\t%d) %s (pid: %d): %s",
+                                       i, traces[i].name, traces[i].pid,
+                                       get_cmdline_by_pid(traces[i].pid));
                } else {
                        break;
                }
@@ -249,8 +266,8 @@ static int process_opt_list_apps(void)
 
        MSG("LTTng UST traceable application [name (pid)]:");
        for (i=0; i < count; i++) {
-               ret = get_cmdline_by_pid(pids[i], &cmdline);
-               if (!ret) {
+               cmdline = get_cmdline_by_pid(pids[i]);
+               if (cmdline == NULL) {
                        MSG("\t(not running) (%d)", pids[i]);
                        continue;
                }
@@ -270,34 +287,32 @@ error:
 /*
  *  get_cmdline_by_pid
  *
- *  Get command line from /proc for a
- *  specific pid. Allocate cmdline so the
- *  user must free() that pointer.
+ *  Get command line from /proc for a specific pid.
  *
- *  On success, return 1
- *  On error (not found), return 0
+ *  On success, return an allocated string pointer pointing to
+ *  the proc cmdline.
+ *  On error, return NULL.
  */
-static int get_cmdline_by_pid(pid_t pid, char **cmdline)
+static char *get_cmdline_by_pid(pid_t pid)
 {
        int ret;
        FILE *fp;
+       char *cmdline = NULL;
        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;
+               goto end;
        }
 
        /* Caller must free() *cmdline */
-       *cmdline = malloc(PATH_MAX);
-       ret = fread(*cmdline, 1, PATH_MAX, fp);
+       cmdline = malloc(PATH_MAX);
+       ret = fread(cmdline, 1, PATH_MAX, fp);
        fclose(fp);
 
-       return 1;
-
-not_running:
-       return 0;
+end:
+       return cmdline;
 }
 
 /*
@@ -311,10 +326,20 @@ not_running:
  */
 static int validate_options(void)
 {
-       if ((opt_session_uuid == NULL) &&
-                       (opt_create_trace || opt_start_trace || opt_list_traces)) {
+       /* Conflicting command */
+       if (opt_start_trace && opt_stop_trace) {
+               ERR("Can't use --start and --stop together.");
+               goto error;
+       /* Must have a session UUID for trace action. */
+       } else if ((opt_session_uuid == NULL) &&
+                       (opt_create_trace || opt_start_trace || opt_stop_trace || opt_list_traces)) {
                ERR("You need to specify a session UUID.\nPlease use --session UUID to do so.");
                goto error;
+       /* If no PID specified and trace_kernel is off */
+       } else if ((opt_trace_pid == 0 && opt_trace_kernel == 0) &&
+                       (opt_create_trace || opt_start_trace || opt_stop_trace)) {
+               ERR("Please specify a PID using -p, --pid PID.");
+               goto error;
        }
 
        return 0;
This page took 0.025028 seconds and 4 git commands to generate.