*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <getopt.h>
#include <signal.h>
#include <stdio.h>
static pid_t sessiond_pid;
static volatile int recv_child_signal;
+char *opt_relayd_path;
+
enum {
+ OPT_RELAYD_PATH,
OPT_SESSION_PATH,
OPT_DUMP_OPTIONS,
OPT_DUMP_COMMANDS,
{"group", 1, NULL, 'g'},
{"verbose", 0, NULL, 'v'},
{"quiet", 0, NULL, 'q'},
+ {"mi", 1, NULL, 'm'},
{"no-sessiond", 0, NULL, 'n'},
{"sessiond-path", 1, NULL, OPT_SESSION_PATH},
+ {"relayd-path", 1, NULL, OPT_RELAYD_PATH},
{"list-options", 0, NULL, OPT_DUMP_OPTIONS},
{"list-commands", 0, NULL, OPT_DUMP_COMMANDS},
{NULL, 0, NULL, 0}
{ "calibrate", cmd_calibrate},
{ "view", cmd_view},
{ "snapshot", cmd_snapshot},
- { "enable-consumer", cmd_enable_consumer}, /* OBSOLETE */
- { "disable-consumer", cmd_disable_consumer}, /* OBSOLETE */
+ { "save", cmd_save},
+ { "load", cmd_load},
{ NULL, NULL} /* Array closure */
};
static void usage(FILE *ofp)
{
- fprintf(ofp, "LTTng Trace Control " 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");
fprintf(ofp, " --list-commands Simple listing of lttng commands\n");
fprintf(ofp, " -v, --verbose Increase verbosity\n");
fprintf(ofp, " -q, --quiet Quiet mode\n");
+ fprintf(ofp, " -m, --mi TYPE Machine Interface mode.\n");
+ fprintf(ofp, " Type: xml\n");
fprintf(ofp, " -g, --group NAME Unix tracing group name. (default: tracing)\n");
fprintf(ofp, " -n, --no-sessiond Don't spawn a session daemon\n");
fprintf(ofp, " --sessiond-path PATH Session daemon full path\n");
+ fprintf(ofp, " --relayd-path PATH Relayd daemon full path\n");
fprintf(ofp, "\n");
fprintf(ofp, "Commands:\n");
fprintf(ofp, " add-context Add context to event and/or channel\n");
fprintf(ofp, " stop Stop tracing\n");
fprintf(ofp, " version Show version information\n");
fprintf(ofp, " view Start trace viewer\n");
+ fprintf(ofp, " save Save session configuration\n");
+ fprintf(ofp, " load Load session configuration\n");
fprintf(ofp, "\n");
fprintf(ofp, "Each command also has its own -h, --help option.\n");
fprintf(ofp, "\n");
static void version(FILE *ofp)
{
- fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME"\n",
- progname);
+ fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME "%s\n",
+ progname,
+ GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION);
+}
+
+/*
+ * Find the MI output type enum from a string. This function is for the support
+ * of machine interface output.
+ */
+static int mi_output_type(const char *output_type)
+{
+ int ret = 0;
+
+ if (!strncasecmp("xml", output_type, 3)) {
+ ret = LTTNG_MI_XML;
+ } else {
+ /* Invalid output format */
+ ERR("MI output format not supported");
+ ret = -LTTNG_ERR_MI_OUTPUT_TYPE;
+ }
+
+ return ret;
}
/*
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 (argc < 2) {
usage(stderr);
clean_exit(EXIT_FAILURE);
}
- while ((opt = getopt_long(argc, argv, "+Vhnvqg:", long_options, NULL)) != -1) {
+ while ((opt = getopt_long(argc, argv, "+Vhnvqg:m:", long_options, NULL)) != -1) {
switch (opt) {
case 'V':
version(stdout);
ret = 0;
goto end;
case 'v':
- lttng_opt_verbose += 1;
+ /* There is only 3 possible level of verbosity. (-vvv) */
+ if (lttng_opt_verbose < 3) {
+ lttng_opt_verbose += 1;
+ }
break;
case 'q':
lttng_opt_quiet = 1;
break;
+ case 'm':
+ lttng_opt_mi = mi_output_type(optarg);
+ if (lttng_opt_mi < 0) {
+ ret = lttng_opt_mi;
+ goto error;
+ }
+ break;
case 'g':
lttng_set_tracing_group(optarg);
break;
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);