projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add a '--list-options' option to each command.
[lttng-tools.git]
/
src
/
bin
/
lttng
/
lttng.c
diff --git
a/src/bin/lttng/lttng.c
b/src/bin/lttng/lttng.c
index 2ee93253fe7b50f7ddfc139c58bde769465ec09c..64f3efa446530ed61663c9434eb77251cc923c91 100644
(file)
--- a/
src/bin/lttng/lttng.c
+++ b/
src/bin/lttng/lttng.c
@@
-22,6
+22,8
@@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include <unistd.h>
#include <config.h>
#include <unistd.h>
#include <config.h>
@@
-37,6
+39,7
@@
int opt_quiet;
int opt_verbose;
static int opt_no_sessiond;
static char *opt_sessiond_path;
int opt_verbose;
static int opt_no_sessiond;
static char *opt_sessiond_path;
+static pid_t sessiond_pid;
enum {
OPT_SESSION_PATH,
enum {
OPT_SESSION_PATH,
@@
-168,14
+171,23
@@
static void clean_exit(int code)
*/
static void sighandler(int sig)
{
*/
static void sighandler(int sig)
{
+ int status;
+
switch (sig) {
case SIGTERM:
DBG("SIGTERM caugth");
clean_exit(EXIT_FAILURE);
break;
case SIGCHLD:
switch (sig) {
case SIGTERM:
DBG("SIGTERM caugth");
clean_exit(EXIT_FAILURE);
break;
case SIGCHLD:
- /* Notify is done */
DBG("SIGCHLD caugth");
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("SIGUSR1 caugth");
break;
default:
DBG("Unknown signal %d caugth", sig);
break;
default:
DBG("Unknown signal %d caugth", sig);
@@
-204,7
+216,7
@@
static int set_signal_handler(void)
sa.sa_handler = sighandler;
sa.sa_mask = sigset;
sa.sa_flags = 0;
sa.sa_handler = sighandler;
sa.sa_mask = sigset;
sa.sa_flags = 0;
- if ((ret = sigaction(SIG
CHLD
, &sa, NULL)) < 0) {
+ if ((ret = sigaction(SIG
USR1
, &sa, NULL)) < 0) {
perror("sigaction");
goto end;
}
perror("sigaction");
goto end;
}
@@
-214,6
+226,11
@@
static int set_signal_handler(void)
goto end;
}
goto end;
}
+ if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) {
+ perror("sigaction");
+ goto end;
+ }
+
end:
return ret;
}
end:
return ret;
}
@@
-246,9
+263,6
@@
static int handle_command(int argc, char **argv)
case CMD_ERROR:
ERR("Command error");
break;
case CMD_ERROR:
ERR("Command error");
break;
- case CMD_NOT_IMPLEMENTED:
- ERR("Options not implemented");
- break;
case CMD_UNDEFINED:
ERR("Undefined command");
break;
case CMD_UNDEFINED:
ERR("Undefined command");
break;
@@
-296,8
+310,12
@@
static int spawn_sessiond(char *pathname)
kill(getppid(), SIGTERM); /* unpause parent */
exit(EXIT_FAILURE);
} else if (pid > 0) {
kill(getppid(), SIGTERM); /* unpause parent */
exit(EXIT_FAILURE);
} else if (pid > 0) {
+ sessiond_pid = pid;
/* Wait for lttng-sessiond to start */
pause();
/* Wait for lttng-sessiond to start */
pause();
+ if (!sessiond_pid) {
+ exit(EXIT_FAILURE);
+ }
goto end;
} else {
perror("fork");
goto end;
} else {
perror("fork");
@@
-359,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_comma
nd(int argc, char **argv)
+static int check_
args_no_sessio
nd(int argc, char **argv)
{
int i;
for (i = 0; i < argc; i++) {
if ((strncmp(argv[i], "-h", 2) == 0) ||
{
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;
}
}
return 1;
}
}
@@
-430,7
+452,7
@@
static int parse_args(int argc, char **argv)
}
/* Spawn session daemon if needed */
}
/* Spawn session daemon if needed */
- if (opt_no_sessiond == 0 && check_
help_comma
nd(argc, argv) == 0 &&
+ if (opt_no_sessiond == 0 && check_
args_no_sessio
nd(argc, argv) == 0 &&
(check_sessiond() < 0)) {
goto error;
}
(check_sessiond() < 0)) {
goto error;
}
This page took
0.028312 seconds
and
4
git commands to generate.