X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fcreate.c;h=ba62940c62fbb4dec65057d9942250d6c7d8fa7a;hb=5d5baaa365798454df0fa41879399dd88a8413c1;hp=4145e14d85e88e15b5d1b025d38881dfa61e856c;hpb=acc0921507a42345aa6b032231180c7c6999f55a;p=lttng-tools.git diff --git a/src/bin/lttng/commands/create.c b/src/bin/lttng/commands/create.c index 4145e14d8..ba62940c6 100644 --- a/src/bin/lttng/commands/create.c +++ b/src/bin/lttng/commands/create.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -43,11 +44,11 @@ static char *opt_session_name; static char *opt_url; static char *opt_ctrl_url; static char *opt_data_url; +static char *opt_shm_path; static int opt_no_consumer; static int opt_no_output; static int opt_snapshot; static unsigned int opt_live_timer; -static int opt_disable_consumer; enum { OPT_HELP = 1, @@ -67,9 +68,9 @@ static struct poptOption long_options[] = { {"data-url", 'D', POPT_ARG_STRING, &opt_data_url, 0, 0, 0}, {"no-output", 0, POPT_ARG_VAL, &opt_no_output, 1, 0, 0}, {"no-consumer", 0, POPT_ARG_VAL, &opt_no_consumer, 1, 0, 0}, - {"disable-consumer", 0, POPT_ARG_VAL, &opt_disable_consumer, 1, 0, 0}, {"snapshot", 0, POPT_ARG_VAL, &opt_snapshot, 1, 0, 0}, {"live", 0, POPT_ARG_INT | POPT_ARGFLAG_OPTIONAL, 0, OPT_LIVE_TIMER, 0, 0}, + {"shm-path", 0, POPT_ARG_STRING, &opt_shm_path, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -107,6 +108,9 @@ static void usage(FILE *ofp) fprintf(ofp, " By default, %u is used for the timer and the\n", DEFAULT_LTTNG_LIVE_TIMER); fprintf(ofp, " network URL is set to net://127.0.0.1.\n"); + fprintf(ofp, " --shm-path PATH Path where shared memory holding buffers\n"); + fprintf(ofp, " should be created. Useful when used with pramfs\n"); + fprintf(ofp, " to extract trace data after crash.\n"); fprintf(ofp, "\n"); fprintf(ofp, "Extended Options:\n"); fprintf(ofp, "\n"); @@ -115,7 +119,6 @@ static void usage(FILE *ofp) fprintf(ofp, " -U, --set-url=URL Set URL destination of the trace data.\n"); fprintf(ofp, " It is persistent for the session lifetime.\n"); fprintf(ofp, " This will set both data and control URL.\n"); - fprintf(ofp, " You can change it with the enable-consumer cmd\n"); fprintf(ofp, " -C, --ctrl-url=URL Set control path URL. (Must use -D also)\n"); fprintf(ofp, " -D, --data-url=URL Set data path URL. (Must use -C also)\n"); fprintf(ofp, "\n"); @@ -152,11 +155,9 @@ static void usage(FILE *ofp) } /* - * Retrieve the created session and - * mi output it of the created session based on provided argument + * Retrieve the created session and mi output it based on provided argument * This is currently a summary of what was pretty printed and is subject to * enhancements. - * str_url is a placement string for output url (snapshot or regular trace) */ static int mi_created_session(const char *session_name) { @@ -301,6 +302,7 @@ static int create_session(void) char session_name_date[NAME_MAX + 17], *print_str_url = NULL; time_t rawtime; struct tm *timeinfo; + char shm_path[PATH_MAX] = ""; /* Get date and time for automatic session name/path */ time(&rawtime); @@ -381,16 +383,22 @@ static int create_session(void) */ url = NULL; } else if (!opt_no_output) { + char *tmp_path; + /* Auto output path */ - alloc_path = utils_get_home_dir(); - if (alloc_path == NULL) { + tmp_path = utils_get_home_dir(); + if (tmp_path == NULL) { ERR("HOME path not found.\n \ Please specify an output path using -o, --output PATH"); ret = CMD_FATAL; goto error; } - alloc_path = strdup(alloc_path); - + alloc_path = strdup(tmp_path); + if (!alloc_path) { + PERROR("allocating alloc_path"); + ret = CMD_FATAL; + goto error; + } ret = asprintf(&alloc_url, "file://%s/" DEFAULT_TRACE_DIR_NAME "/%s", alloc_path, session_name_date); @@ -479,6 +487,21 @@ static int create_session(void) } } + if (opt_shm_path) { + ret = snprintf(shm_path, sizeof(shm_path), + "%s/%s", opt_shm_path, session_name_date); + if (ret < 0) { + PERROR("snprintf shm_path"); + goto error; + } + + ret = lttng_set_session_shm_path(session_name, shm_path); + if (ret < 0) { + lttng_destroy_session(session_name); + goto error; + } + } + MSG("Session %s created.", session_name); if (print_str_url && !opt_snapshot) { MSG("Traces will be written in %s", print_str_url); @@ -493,6 +516,10 @@ static int create_session(void) MSG("Snapshot mode set. Every channel enabled for that session will " "be set in overwrite mode and mmap output."); } + if (opt_shm_path) { + MSG("Session %s set to shm_path: %s.", session_name, + shm_path); + } /* Mi output */ if (lttng_opt_mi) { @@ -570,6 +597,11 @@ int cmd_create(int argc, const char **argv) ret = CMD_ERROR; goto end; } + if (v == 0) { + ERR("Live timer interval must be greater than zero"); + ret = CMD_ERROR; + goto end; + } opt_live_timer = (uint32_t) v; DBG("Session live timer interval set to %d", opt_live_timer); break; @@ -587,13 +619,6 @@ int cmd_create(int argc, const char **argv) goto end; } - if (opt_disable_consumer) { - MSG("The option --disable-consumer is obsolete."); - ret = CMD_WARNING; - goto end; - } - - /* MI initialization */ if (lttng_opt_mi) { writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);