X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Flttng.c;h=a8cc2e72ff1ef1809d7941e5870ffde1418e9d88;hp=65cea55a25e73a8698fd01c2846b4a405488916a;hb=bbccc3d2cb9f83aecf00a207de9eef68c766bf9c;hpb=10a8a2237343699e3923d87e24dbf2d7fe225377 diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c index 65cea55a2..a8cc2e72f 100644 --- a/src/bin/lttng/lttng.c +++ b/src/bin/lttng/lttng.c @@ -22,14 +22,15 @@ #include #include #include +#include +#include #include #include #include -#include +#include -#include "cmd.h" -#include "conf.h" +#include "command.h" /* Variables */ static char *progname; @@ -38,6 +39,7 @@ int opt_quiet; int opt_verbose; static int opt_no_sessiond; static char *opt_sessiond_path; +static pid_t sessiond_pid; enum { OPT_SESSION_PATH, @@ -169,17 +171,26 @@ static void clean_exit(int code) */ static void sighandler(int sig) { + int status; + switch (sig) { case SIGTERM: - DBG("SIGTERM catched"); + DBG("SIGTERM caugth"); clean_exit(EXIT_FAILURE); break; case SIGCHLD: + DBG("SIGCHLD caugth"); + waitpid(sessiond_pid, &status, 0); + /* Indicate that the session daemon died */ + sessiond_pid = 0; + ERR("Session daemon died (exit status %d)", WEXITSTATUS(status)); + break; + case SIGUSR1: /* Notify is done */ - DBG("SIGCHLD catched"); + DBG("SIGUSR1 caugth"); break; default: - DBG("Unknown signal %d catched", sig); + DBG("Unknown signal %d caugth", sig); break; } @@ -205,7 +216,7 @@ static int set_signal_handler(void) sa.sa_handler = sighandler; sa.sa_mask = sigset; sa.sa_flags = 0; - if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) { + if ((ret = sigaction(SIGUSR1, &sa, NULL)) < 0) { perror("sigaction"); goto end; } @@ -215,6 +226,11 @@ static int set_signal_handler(void) goto end; } + if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) { + perror("sigaction"); + goto end; + } + end: return ret; } @@ -247,9 +263,6 @@ static int handle_command(int argc, char **argv) case CMD_ERROR: ERR("Command error"); break; - case CMD_NOT_IMPLEMENTED: - ERR("Options not implemented"); - break; case CMD_UNDEFINED: ERR("Undefined command"); break; @@ -297,8 +310,12 @@ static int spawn_sessiond(char *pathname) kill(getppid(), SIGTERM); /* unpause parent */ exit(EXIT_FAILURE); } else if (pid > 0) { + sessiond_pid = pid; /* Wait for lttng-sessiond to start */ pause(); + if (!sessiond_pid) { + exit(EXIT_FAILURE); + } goto end; } else { perror("fork"); @@ -334,7 +351,7 @@ static int check_sessiond(void) pathname = opt_sessiond_path; } else { /* Try LTTNG_SESSIOND_PATH env variable */ - pathname = getenv(LTTNG_SESSIOND_PATH_ENV); + pathname = getenv(DEFAULT_SESSIOND_PATH_ENV); } /* Let's rock and roll */ @@ -360,15 +377,19 @@ end: } /* - * Check for the "help" option in the argv. If found, return 1 else return 0. + * Check args for specific options that *must* not trigger a session daemon + * execution. + * + * Return 1 if match else 0. */ -static int check_help_command(int argc, char **argv) +static int check_args_no_sessiond(int argc, char **argv) { int i; for (i = 0; i < argc; i++) { if ((strncmp(argv[i], "-h", 2) == 0) || - strncmp(argv[i], "--h", 3) == 0) { + strncmp(argv[i], "--h", 3) == 0 || + strncmp(argv[i], "--list-options", 14)) { return 1; } } @@ -431,7 +452,7 @@ static int parse_args(int argc, char **argv) } /* Spawn session daemon if needed */ - if (opt_no_sessiond == 0 && check_help_command(argc, argv) == 0 && + if (opt_no_sessiond == 0 && check_args_no_sessiond(argc, argv) == 0 && (check_sessiond() < 0)) { goto error; } @@ -473,8 +494,9 @@ int main(int argc, char *argv[]) progname = argv[0] ? argv[0] : "lttng"; /* For Mathieu Desnoyers aka Dr Tracing */ - if (strncmp(progname, "drtrace", 7) == 0) { - MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n\n", 27,1,33,27,0); + if (strncmp(progname, "drtrace", 7) == 0 || + strncmp("compudj", getenv("USER"), 7) == 0) { + MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n", 27,1,33,27,0); } ret = set_signal_handler();