X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=150f211fb825a44e1e614a3222744d7edf51a4bc;hb=ee0326c0c46f4b02e9eab0b2917b62d2c55aa346;hp=4e1fb1f6b5b441aa73a05f9024e4cdbe039e154d;hpb=62bd06d80051a13a2fb6cf72e82e9bdc1683eea5;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 4e1fb1f6b..150f211fb 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 */ @@ -100,6 +101,8 @@ static void *thread_manage_apps(void *data) uid_t uid; } reg_msg; + DBG("[thread] Manage apps started"); + /* Notify all applications to register */ notify_apps(default_global_apps_pipe); @@ -156,6 +159,8 @@ static void *thread_manage_clients(void *data) int sock, ret; struct lttcomm_session_msg lsm; + DBG("[thread] Manage client started"); + ret = lttcomm_listen_unix_sock(client_socket); if (ret < 0) { goto error; @@ -232,6 +237,8 @@ static int connect_app(pid_t pid) int sock; struct ltt_traceable_app *lta; + DBG("Connect to application pid %d", pid); + lta = find_app_by_pid(pid); if (lta == NULL) { /* App not found */ @@ -260,6 +267,8 @@ static int notify_apps(const char *name) int fd; int ret = -1; + DBG("Notify the global application pipe"); + /* Try opening the global pipe */ fd = open(name, O_WRONLY); if (fd < 0) { @@ -288,6 +297,8 @@ static int ust_create_trace(pid_t pid) int sock, ret; struct ltt_ust_trace *trace; + DBG("Creating trace for pid %d", pid); + trace = malloc(sizeof(struct ltt_ust_trace)); if (trace == NULL) { perror("malloc"); @@ -298,6 +309,11 @@ static int ust_create_trace(pid_t pid) /* Init */ trace->pid = pid; trace->shmid = 0; + /* NOTE: to be removed. Trace name will no longer be + * required for LTTng userspace tracer. For now, we set it + * to 'auto' for API compliance. + */ + snprintf(trace->name, 5, "auto"); /* Connect to app using ustctl API */ sock = connect_app(pid); @@ -306,7 +322,7 @@ static int ust_create_trace(pid_t pid) goto error; } - ret = ustctl_create_trace(sock, "auto"); + ret = ustctl_create_trace(sock, trace->name); if (ret < 0) { ret = LTTCOMM_CREATE_FAIL; goto error; @@ -315,6 +331,79 @@ static int ust_create_trace(pid_t pid) /* Check if current session is valid */ if (current_session) { cds_list_add(&trace->list, ¤t_session->ust_traces); + current_session->ust_trace_count++; + } + +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; +} + +/* + * ust_stop_trace + * + * Stop a trace. This trace, identified by the pid, must be + * in the current session ust_traces list. + */ +static int ust_stop_trace(pid_t pid) +{ + int sock, ret; + struct ltt_ust_trace *trace; + + DBG("Stopping 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_stop_trace(sock, trace->name); + if (ret < 0) { + ret = LTTCOMM_STOP_FAIL; + goto error; } error: @@ -390,6 +479,8 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) char *send_buf = NULL; struct lttcomm_lttng_msg llm; + DBG("Processing client message"); + /* Copy common data to identify the response * on the lttng client side. */ @@ -448,11 +539,33 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* No auxiliary data so only send the llm struct. */ goto end; } + case LTTNG_LIST_TRACES: + { + unsigned int trace_count = get_trace_count_per_session(current_session); + + if (trace_count == 0) { + ret = LTTCOMM_NO_TRACE; + goto end; + } + + buf_size = setup_data_buffer(&send_buf, + sizeof(struct lttng_trace) * trace_count, &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto end; + } + + get_traces_per_session(current_session, (struct lttng_trace *)(send_buf + header_size)); + break; + } case UST_CREATE_TRACE: { 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; } @@ -480,6 +593,20 @@ 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 UST_STOP_TRACE: + { + ret = ust_stop_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(); @@ -540,6 +667,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"); } /* @@ -558,12 +686,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; } @@ -599,6 +728,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 */ @@ -719,6 +851,8 @@ static int set_socket_perms(void) perror("chown"); } + DBG("Sockets permissions set"); + end: return ret; } @@ -758,6 +892,8 @@ static int set_signal_handler(void) return ret; } + DBG("Signal handler set for SIGTERM, SIGPIPE and SIGINT"); + return ret; } @@ -770,9 +906,14 @@ static void sighandler(int sig) { switch (sig) { case SIGPIPE: + DBG("SIGPIPE catched"); return; case SIGINT: + DBG("SIGINT catched"); + cleanup(); + break; case SIGTERM: + DBG("SIGTERM catched"); cleanup(); break; default: @@ -789,6 +930,8 @@ static void sighandler(int sig) */ static void cleanup() { + DBG("Cleaning up"); + /* */ MSG("\n%c[%d;%dm*** assert failed *** ==> %c[%dm", 27,1,31,27,0); MSG("%c[%d;%dmMatthew, BEET driven development works!%c[%dm",27,1,33,27,0);