*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <getopt.h>
#include <signal.h>
#include <stdio.h>
#include <lttng/lttng.h>
#include <common/error.h>
+#include <common/compat/getenv.h>
#include "command.h"
{ "snapshot", cmd_snapshot},
{ "save", cmd_save},
{ "load", cmd_load},
- { "enable-consumer", cmd_enable_consumer}, /* OBSOLETE */
- { "disable-consumer", cmd_disable_consumer}, /* OBSOLETE */
{ NULL, NULL} /* Array closure */
};
static void usage(FILE *ofp)
{
- fprintf(ofp, "LTTng Trace Control " FULL_VERSION" - " VERSION_NAME"\n\n");
+ fprintf(ofp, "LTTng Trace Control " VERSION " - " VERSION_NAME "%s\n\n",
+ GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION);
fprintf(ofp, "usage: lttng [OPTIONS] <COMMAND> [<ARGS>]\n");
fprintf(ofp, "\n");
fprintf(ofp, "Options:\n");
static void version(FILE *ofp)
{
- fprintf(ofp, "%s (LTTng Trace Control) " FULL_VERSION" - " VERSION_NAME"\n",
- progname);
+ fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME "%s\n",
+ progname,
+ GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION);
}
/*
sigset_t sigset;
if ((ret = sigemptyset(&sigset)) < 0) {
- perror("sigemptyset");
+ PERROR("sigemptyset");
goto end;
}
sa.sa_mask = sigset;
sa.sa_flags = 0;
if ((ret = sigaction(SIGUSR1, &sa, NULL)) < 0) {
- perror("sigaction");
+ PERROR("sigaction");
goto end;
}
if ((ret = sigaction(SIGTERM, &sa, NULL)) < 0) {
- perror("sigaction");
+ PERROR("sigaction");
goto end;
}
if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) {
- perror("sigaction");
+ PERROR("sigaction");
goto end;
}
if (errno == ENOENT) {
ERR("No session daemon found. Use --sessiond-path.");
} else {
- perror("execlp");
+ PERROR("execlp");
}
kill(getppid(), SIGTERM); /* wake parent */
exit(EXIT_FAILURE);
}
goto end;
} else {
- perror("fork");
+ PERROR("fork");
ret = -1;
goto end;
}
static int parse_args(int argc, char **argv)
{
int opt, ret;
+ char *user;
+
+ if (lttng_is_setuid_setgid()) {
+ ERR("'%s' is not allowed to be executed as a setuid/setgid binary for security reasons. Aborting.", argv[0]);
+ clean_exit(EXIT_FAILURE);
+ }
if (argc < 2) {
usage(stderr);
break;
case OPT_SESSION_PATH:
opt_sessiond_path = strdup(optarg);
+ if (!opt_sessiond_path) {
+ ret = -1;
+ goto error;
+ }
break;
case OPT_RELAYD_PATH:
opt_relayd_path = strdup(optarg);
+ if (!opt_relayd_path) {
+ ret = -1;
+ goto error;
+ }
break;
case OPT_DUMP_OPTIONS:
list_options(stdout);
goto error;
}
+ /* For Mathieu Desnoyers a.k.a. Dr. Tracing */
+ user = getenv("USER");
+ if (user != NULL && ((strncmp(progname, "drtrace", 7) == 0 ||
+ strncmp("compudj", user, 7) == 0))) {
+ MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n", 27,1,33,27,0);
+ }
+ /* Thanks Mathieu */
+
/*
* Handle leftovers which is a first level command with the trailing
* options.
int main(int argc, char *argv[])
{
int ret;
- char *user;
progname = argv[0] ? argv[0] : "lttng";
- /* For Mathieu Desnoyers a.k.a. Dr. Tracing */
- user = getenv("USER");
- if (user != NULL && ((strncmp(progname, "drtrace", 7) == 0 ||
- strncmp("compudj", user, 7) == 0))) {
- MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n", 27,1,33,27,0);
- }
- /* Thanks Mathieu */
-
ret = set_signal_handler();
if (ret < 0) {
clean_exit(ret);