X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=450a6ffc8c075c4f905fd465f6298c8add38a760;hb=3f9947db38d28a772b76dc63ab5688ef4037b107;hp=8c58a3432d25d56bddb7041efee5d7795c030937;hpb=91d76f53238ce994e91e1213e46c138b1b5529c6;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 8c58a3432..450a6ffc8 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -41,6 +41,7 @@ #include "ltt-sessiond.h" #include "lttngerr.h" #include "session.h" +#include "trace.h" #include "traceable-app.h" /* Const values */ @@ -50,31 +51,29 @@ const char default_ust_sock_dir[] = DEFAULT_UST_SOCK_DIR; const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE; /* Static functions */ -static int set_signal_handler(void); -static int set_socket_perms(void); -static void sighandler(int sig); -static void cleanup(void); -static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_session_msg *lsm); static int check_existing_daemon(void); -static int notify_apps(const char* name); static int connect_app(pid_t pid); static int init_daemon_socket(void); +static int notify_apps(const char* name); static int process_client_msg(int sock, struct lttcomm_session_msg*); static int send_unix_sock(int sock, void *buf, size_t len); +static int set_signal_handler(void); +static int set_socket_perms(void); static int setup_data_buffer(char **buf, size_t size, struct lttcomm_lttng_msg *llm); - -/* Command function */ +static void cleanup(void); +static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_session_msg *lsm); +static void sighandler(int sig); static void *thread_manage_clients(void *data); static void *thread_manage_apps(void *data); /* Variables */ +int opt_verbose; +int opt_quiet; const char *progname; const char *opt_tracing_group; static int opt_sig_parent; static int opt_daemon; -int opt_verbose; -int opt_quiet; static int is_root; /* Set to 1 if the daemon is running as root */ static pid_t ppid; @@ -323,6 +322,42 @@ error: return ret; } +/* + * ust_start_trace + * + * Start a trace. This trace, identified by the pid, must be + * in the current session ust_traces list. + */ +static int ust_start_trace(pid_t pid) +{ + int sock, ret; + struct ltt_ust_trace *trace; + + DBG("Starting trace for pid %d", pid); + + trace = find_session_ust_trace_by_pid(current_session, pid); + if (trace == NULL) { + ret = LTTCOMM_NO_TRACE; + goto error; + } + + /* Connect to app using ustctl API */ + sock = connect_app(pid); + if (sock < 0) { + ret = LTTCOMM_NO_TRACEABLE; + goto error; + } + + ret = ustctl_start_trace(sock, "auto"); + if (ret < 0) { + ret = LTTCOMM_START_FAIL; + goto error; + } + +error: + return ret; +} + /* * copy_common_data * @@ -454,7 +489,10 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { ret = ust_create_trace(lsm->pid); if (ret < 0) { - ret = LTTCOMM_CREATE_FAIL; + /* If -1 is returned from ust_create_trace, malloc + * failed so it's pretty much a fatal error. + */ + ret = LTTCOMM_FATAL; goto end; } @@ -482,6 +520,13 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) break; } + case UST_START_TRACE: + { + ret = ust_start_trace(lsm->pid); + + /* No auxiliary data so only send the llm struct. */ + goto end; + } case LTTNG_LIST_SESSIONS: { unsigned int session_count = get_session_count(); @@ -542,6 +587,7 @@ static void usage(void) fprintf(stderr, " -V, --version Show version number.\n"); fprintf(stderr, " -S, --sig-parent Send SIGCHLD to parent pid to notify readiness.\n"); fprintf(stderr, " -q, --quiet No output at all.\n"); + fprintf(stderr, " -v, --verbose Verbose mode. Activate DBG() macro.\n"); } /* @@ -560,12 +606,13 @@ static int parse_args(int argc, char **argv) { "group", 1, 0, 'g' }, { "version", 0, 0, 'V' }, { "quiet", 0, 0, 'q' }, + { "verbose", 0, 0, 'v' }, { NULL, 0, 0, 0 } }; while (1) { int option_index = 0; - c = getopt_long(argc, argv, "dhqVS" "a:c:g:s:", long_options, &option_index); + c = getopt_long(argc, argv, "dhqvVS" "a:c:g:s:", long_options, &option_index); if (c == -1) { break; } @@ -601,6 +648,9 @@ static int parse_args(int argc, char **argv) case 'q': opt_quiet = 1; break; + case 'v': + opt_verbose = 1; + break; default: /* Unknown option or other error. * Error is printed by getopt, just return */ @@ -615,8 +665,8 @@ static int parse_args(int argc, char **argv) * init_daemon_socket * * Creates the two needed socket by the daemon. - * apps_socket - The communication socket for all UST apps. - * client_socket - The communication of the cli tool (lttng). + * apps_socket - The communication socket for all UST apps. + * client_socket - The communication of the cli tool (lttng). */ static int init_daemon_socket() { @@ -662,7 +712,7 @@ end: * check_existing_daemon * * Check if the global socket is available. - * If yes, error is returned. + * If yes, error is returned. */ static int check_existing_daemon() { @@ -677,12 +727,12 @@ static int check_existing_daemon() } /* - * get_home_dir + * get_home_dir * - * Return pointer to home directory path using - * the env variable HOME. + * Return pointer to home directory path using + * the env variable HOME. * - * Default : /tmp + * Default : /tmp */ static const char *get_home_dir(void) { @@ -726,9 +776,9 @@ end: } /* - * set_signal_handler + * set_signal_handler * - * Setup signal handler for : + * Setup signal handler for : * SIGINT, SIGTERM, SIGPIPE */ static int set_signal_handler(void) @@ -764,9 +814,9 @@ static int set_signal_handler(void) } /** - * sighandler + * sighandler * - * Signal handler for the daemon + * Signal handler for the daemon */ static void sighandler(int sig) { @@ -785,9 +835,9 @@ static void sighandler(int sig) } /* - * cleanup + * cleanup * - * Cleanup the daemon on exit + * Cleanup the daemon on exit */ static void cleanup() {