X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fltt-sessiond.c;h=fb197d43bc60c37228526ba6b72a3b5ff5abc1e2;hp=050c67397345eb0fa97a04239342959364926d90;hb=ca95a21633510288dbb18a3cd8825195e5cbb4f3;hpb=53094c051fe98f0d7288e463b2304e0139324f8c diff --git a/ltt-sessiond/ltt-sessiond.c b/ltt-sessiond/ltt-sessiond.c index 050c67397..fb197d43b 100644 --- a/ltt-sessiond/ltt-sessiond.c +++ b/ltt-sessiond/ltt-sessiond.c @@ -35,10 +35,13 @@ #include /* URCU list library (-lurcu) */ #include /* UST control lib (-lust) */ +#include #include "liblttsessiondcomm.h" #include "ltt-sessiond.h" +#include "lttngerr.h" +/* Const values */ const char default_home_dir[] = DEFAULT_HOME_DIR; const char default_tracing_group[] = DEFAULT_TRACING_GROUP; const char default_ust_sock_dir[] = DEFAULT_UST_SOCK_DIR; @@ -57,6 +60,10 @@ static int init_daemon_socket(void); static int process_client_msg(int sock, struct lttcomm_session_msg*); static int send_unix_sock(int sock, void *buf, size_t len); +/* Command function */ +static void get_list_apps(void *buf); +static void get_list_sessions(void *buf); + static void *thread_manage_clients(void *); static void *thread_manage_apps(void *); @@ -70,6 +77,8 @@ 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; @@ -255,7 +264,7 @@ static int connect_app(pid_t pid) sock = ustctl_connect_pid(pid); if (sock < 0) { - fprintf(stderr, "Fail connecting to the PID %d\n", pid); + ERR("Fail connecting to the PID %d\n", pid); } return sock; @@ -391,36 +400,47 @@ error: } /* - * ust_list_apps + * get_list_apps * * List traceable user-space application and fill an * array of pids. - * - * Return size of the array. */ -static size_t ust_list_apps(pid_t **pids) +static void get_list_apps(void *buf) { - size_t size = 0; + size_t index = 0; struct ltt_traceable_app *iter = NULL; - pid_t *p; - - if (traceable_app_count == 0) { - /* No dynamic allocation is done */ - goto end; - } - - p = malloc(sizeof(pid_t) * traceable_app_count); + pid_t *pids = (pid_t *) buf; /* TODO: Mutex needed to access this list */ cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { - p[size] = iter->pid; - size++; + pids[index] = iter->pid; + index++; } +} - *pids = p; +/* + * get_list_sessions + * + * List sessions and fill the data buffer. + */ +static void get_list_sessions(void *buf) +{ + int i = 0; + struct ltt_session *iter = NULL; + struct lttng_session lsess; + struct lttng_session *data = (struct lttng_session *) buf; -end: - return size; + /* Iterate over session list and append data after + * the control struct in the buffer. + */ + cds_list_for_each_entry(iter, <t_session_list.head, list) { + uuid_unparse(iter->uuid, lsess.uuid); + strncpy(lsess.name, iter->name, sizeof(lsess.name)); + memcpy(data + (i * sizeof(struct lttng_session)), &lsess, sizeof(lsess)); + i++; + /* Reset struct for next pass */ + memset(&lsess, 0, sizeof(lsess)); + } } /* @@ -438,6 +458,42 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi strncpy(llm->trace_name, lsm->trace_name, sizeof(llm->trace_name)); } +/* + * setup_data_buffer + * + * Setup the outgoing data buffer for the response + * data allocating the right amount of memory. + * + * Return total size of the buffer pointed by buf. + */ +static int setup_data_buffer(void **buf, size_t s_data, struct lttcomm_lttng_msg *llm) +{ + int ret = 0; + void *new_buf; + size_t buf_size; + + buf_size = sizeof(struct lttcomm_lttng_msg) + s_data; + new_buf = malloc(buf_size); + if (new_buf == NULL) { + perror("malloc"); + ret = -1; + goto error; + } + + /* Setup lttcomm_lttng_msg data and copy + * it to the newly allocated buffer. + */ + llm->size_payload = s_data; + memcpy(new_buf, llm, sizeof(struct lttcomm_lttng_msg)); + + *buf = new_buf; + + return buf_size; + +error: + return ret; +} + /* * process_client_msg * @@ -451,6 +507,8 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { int ret; struct lttcomm_lttng_msg llm; + void *send_buf = NULL; + int buf_size; /* Copy common data to identify the response * on the lttng client side. @@ -466,24 +524,51 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) switch (lsm->cmd_type) { case UST_LIST_APPS: { - pid_t *pids; - llm.num_pckt = ust_list_apps(&pids); - if (llm.num_pckt == 0) { + /* Stop right now if no apps */ + if (traceable_app_count == 0) { ret = LTTCOMM_NO_APPS; goto error; } - /* Send all packets */ - while (llm.num_pckt != 0) { - llm.u.list_apps.pid = pids[traceable_app_count - llm.num_pckt]; - ret = send_unix_sock(sock, (void*) &llm, sizeof(llm)); - if (ret < 0) { - goto send_error; - } - llm.num_pckt--; + /* Setup data buffer and details for transmission */ + buf_size = setup_data_buffer(&send_buf, + sizeof(pid_t) * traceable_app_count, &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto error; + } + + get_list_apps(send_buf + sizeof(struct lttcomm_lttng_msg)); + + ret = send_unix_sock(sock, send_buf, buf_size); + if (ret < 0) { + goto send_error; + } + + break; + } + case LTTNG_LIST_SESSIONS: + { + /* Stop right now if no session */ + if (session_count == 0) { + ret = LTTCOMM_NO_SESS; + goto error; + } + + /* Setup data buffer and details for transmission */ + buf_size = setup_data_buffer(&send_buf, + (sizeof(struct lttng_session) * session_count), &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto error; + } + + get_list_sessions(send_buf + sizeof(struct lttcomm_lttng_msg)); + + ret = send_unix_sock(sock, send_buf, buf_size); + if (ret < 0) { + goto send_error; } - /* Allocated array by ust_list_apps() */ - free(pids); break; } @@ -491,10 +576,14 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { /* Undefined command */ ret = LTTCOMM_UND; - break; + goto error; } } + if (send_buf != NULL) { + free(send_buf); + } + return 0; send_error: @@ -503,6 +592,7 @@ send_error: error: /* Notify client of error */ llm.ret_code = ret; + llm.size_payload = 0; send_unix_sock(sock, (void*) &llm, sizeof(llm)); return -1; @@ -520,7 +610,8 @@ static void usage(void) "\t-d, --daemonize\t\tStart as a daemon.\n" "\t-g, --group NAME\t\tSpecify the tracing group name. (default: tracing)\n" "\t-V, --version\t\tShow version number.\n" - "\t-S, --sig-parent\t\tSend SIGCHLD to parent pid to notify readiness.\n", + "\t-S, --sig-parent\t\tSend SIGCHLD to parent pid to notify readiness.\n" + "\t-q, --quiet\t\tNo output at all.\n", progname); } @@ -539,12 +630,13 @@ static int parse_args(int argc, char **argv) { "help", 0, 0, 'h' }, { "group", 1, 0, 'g' }, { "version", 0, 0, 'V' }, + { "quiet", 0, 0, 'q' }, { NULL, 0, 0, 0 } }; while (1) { int option_index = 0; - c = getopt_long(argc, argv, "dhVS" "a:c:g:s:", long_options, &option_index); + c = getopt_long(argc, argv, "dhqVS" "a:c:g:s:", long_options, &option_index); if (c == -1) { break; } @@ -577,6 +669,9 @@ static int parse_args(int argc, char **argv) case 'S': opt_sig_parent = 1; break; + case 'q': + opt_quiet = 1; + break; default: /* Unknown option or other error. * Error is printed by getopt, just return */ @@ -687,7 +782,7 @@ static int set_socket_perms(void) (grp = getgrnam(default_tracing_group)); if (grp == NULL) { - fprintf(stderr, "Missing tracing group. Aborting execution.\n"); + ERR("Missing tracing group. Aborting execution.\n"); ret = -1; goto end; } @@ -767,8 +862,8 @@ static void sighandler(int sig) static void cleanup() { /* */ - fprintf(stdout, "\n\n%c[%d;%dm*** assert failed *** ==> %c[%dm", 27,1,31,27,0); - fprintf(stdout, "%c[%d;%dm Matthew, BEET driven development works!%c[%dm\n",27,1,33,27,0); + MSG("\n\n%c[%d;%dm*** assert failed *** ==> %c[%dm", 27,1,31,27,0); + MSG("%c[%d;%dm Matthew, BEET driven development works!%c[%dm\n",27,1,33,27,0); /* */ unlink(client_unix_sock_path); @@ -831,7 +926,7 @@ int main(int argc, char **argv) * socket needed by the daemon are present, this test fails */ if ((ret = check_existing_daemon()) == 0) { - fprintf(stderr, "Already running daemon.\n"); + ERR("Already running daemon.\n"); goto error; }