X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fltt-sessiond.c;h=a51593a96f32a82791f56909366de6ae24f9eb6d;hb=75462a81e727e0b081dd21805836302bfbd77788;hp=d846c89e58293016b3ffa4abb4c15b96655d8991;hpb=e065084a507dd07b658b3d26c58b1ddd519e25a0;p=lttng-tools.git diff --git a/ltt-sessiond/ltt-sessiond.c b/ltt-sessiond/ltt-sessiond.c index d846c89e5..a51593a96 100644 --- a/ltt-sessiond/ltt-sessiond.c +++ b/ltt-sessiond/ltt-sessiond.c @@ -38,7 +38,9 @@ #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; @@ -48,7 +50,6 @@ const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE; static int set_signal_handler(void); static int set_socket_perms(void); static void sighandler(int); -static void daemonize(void); 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); @@ -57,6 +58,7 @@ static int connect_app(pid_t); 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); +static size_t ust_list_apps(pid_t **pids); static void *thread_manage_clients(void *); static void *thread_manage_apps(void *); @@ -69,8 +71,12 @@ static struct ltt_session *find_session(uuid_t); /* Variables */ 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; static char apps_unix_sock_path[PATH_MAX]; /* Global application Unix socket path */ static char client_unix_sock_path[PATH_MAX]; /* Global client Unix socket path */ @@ -185,6 +191,13 @@ static void *thread_manage_clients(void *data) goto error; } + /* Notify parent pid that we are ready + * to accept command for client side. + */ + if (opt_sig_parent) { + kill(ppid, SIGCHLD); + } + while (1) { /* Blocking call, waiting for transmission */ sock = lttcomm_accept_unix_sock(client_socket); @@ -247,7 +260,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; @@ -479,6 +492,29 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) break; } + case LTTNG_LIST_SESSIONS: + { + struct ltt_session *iter = NULL; + + llm.num_pckt = session_count; + if (llm.num_pckt == 0) { + ret = LTTCOMM_NO_SESS; + goto error; + } + + cds_list_for_each_entry(iter, <t_session_list.head, list) { + uuid_unparse(iter->uuid, llm.u.list_sessions.uuid); + strncpy(llm.u.list_sessions.name, iter->name, + sizeof(llm.u.list_sessions.name)); + ret = send_unix_sock(sock, (void*) &llm, sizeof(llm)); + if (ret < 0) { + goto send_error; + } + llm.num_pckt--; + } + + break; + } default: { /* Undefined command */ @@ -511,7 +547,9 @@ static void usage(void) "\t-a, --apps-sock PATH\t\tSpecify path for apps unix socket.\n" "\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-V, --version\t\tShow version number.\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); } @@ -526,15 +564,17 @@ static int parse_args(int argc, char **argv) { "client-sock", 1, 0, 'c' }, { "apps-sock", 1, 0, 'a' }, { "daemonize", 0, 0, 'd' }, + { "sig-parent", 0, 0, 'S' }, { "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, "dhV" "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; } @@ -564,6 +604,12 @@ static int parse_args(int argc, char **argv) case 'V': fprintf(stdout, "%s\n", VERSION); exit(EXIT_SUCCESS); + 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 */ @@ -674,7 +720,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; } @@ -688,48 +734,6 @@ end: return ret; } -/* - * daemonize - * - * Daemonize ltt-sessiond. - */ -static void daemonize(void) -{ - pid_t pid, sid; - const char *home_dir = get_home_dir(); - - /* Fork off the parent process */ - if ((pid = fork()) < 0) { - perror("fork"); - exit(EXIT_FAILURE); - } - - /* Parent can now exit */ - if (pid > 0) { - exit(EXIT_SUCCESS); - } - - /* Change the file mode mask */ - umask(0); - - /* Create a new SID for the child process */ - if ((sid = setsid()) < 0) { - perror("setsid"); - exit(EXIT_FAILURE); - } - - /* Change the current working directory */ - if ((chdir(home_dir)) < 0) { - perror("chdir"); - exit(EXIT_FAILURE); - } - - /* Close out the standard file descriptors */ - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); -} - /* * set_signal_handler * @@ -796,8 +800,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); @@ -822,7 +826,11 @@ int main(int argc, char **argv) /* Daemonize */ if (opt_daemon) { - daemonize(); + ret = daemon(0, 0); + if (ret < 0) { + perror("daemon"); + goto error; + } } /* Check if daemon is UID = 0 */ @@ -856,7 +864,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; } @@ -874,6 +882,11 @@ int main(int argc, char **argv) goto error; } + /* Get parent pid if -S, --sig-parent is specified. */ + if (opt_sig_parent) { + ppid = getppid(); + } + while (1) { /* Create thread to manage the client socket */ ret = pthread_create(&threads[0], NULL, thread_manage_clients, (void *) NULL);