* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <assert.h>
#include <inttypes.h>
#include <popt.h>
{ NULL, NULL } /* Array closure */
};
-/*
- * usage
- */
-static void usage(FILE *ofp)
-{
- fprintf(ofp, "usage: lttng snapshot [OPTION] ACTION\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Actions:\n");
- fprintf(ofp, " add-output [-m <SIZE>] [-s <NAME>] [-n <NAME>] <URL> | -C <URL> -D <URL>\n");
- fprintf(ofp, " Setup and add an snapshot output for a session.\n");
- fprintf(ofp, "\n");
- fprintf(ofp, " del-output ID | NAME [-s <NAME>]\n");
- fprintf(ofp, " Delete an output for a session using the ID.\n");
- fprintf(ofp, "\n");
- fprintf(ofp, " list-output [-s <NAME>]\n");
- fprintf(ofp, " List the output of a session.\n");
- fprintf(ofp, "\n");
- fprintf(ofp, " record [-m <SIZE>] [-s <NAME>] [-n <NAME>] [<URL> | -C <URL> -D <URL>]\n");
- fprintf(ofp, " Snapshot a session's buffer(s) for all domains. If an URL is\n");
- fprintf(ofp, " specified, it is used instead of a previously added output.\n");
- fprintf(ofp, " Specifying only a name or/a size will override the current output value.\n");
- fprintf(ofp, " For instance, you can record a snapshot with a custom maximum size\n");
- fprintf(ofp, " or with a different name.\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Options:\n");
- fprintf(ofp, " -h, --help Show this help\n");
- fprintf(ofp, " --list-options Simple listing of options\n");
- fprintf(ofp, " -s, --session NAME Apply to session name\n");
- fprintf(ofp, " -n, --name NAME Name of the output or snapshot\n");
- fprintf(ofp, " -m, --max-size SIZE Maximum bytes size of the snapshot {+k,+M,+G}\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");
-}
-
/*
* Count and return the number of arguments in argv.
*/
return NULL;
}
-static int mi_list_output(void)
+static int list_output(void)
{
- int ret;
+ int ret, output_seen = 0;
struct lttng_snapshot_output *s_iter;
struct lttng_snapshot_output_list *list;
- assert(writer);
-
ret = lttng_snapshot_list_output(current_session_name, &list);
if (ret < 0) {
goto error;
}
- ret = mi_lttng_snapshot_output_session_name(writer, current_session_name);
- if (ret) {
- ret = CMD_ERROR;
- goto end;
- }
+ MSG("Snapshot output list for session %s", current_session_name);
- while ((s_iter = lttng_snapshot_output_list_get_next(list)) != NULL) {
- ret = mi_lttng_snapshot_list_output(writer, s_iter);
+ if (lttng_opt_mi) {
+ ret = mi_lttng_snapshot_output_session_name(writer,
+ current_session_name);
if (ret) {
ret = CMD_ERROR;
goto end;
}
}
-
- /* Close snapshot snapshots element */
- ret = mi_lttng_writer_close_element(writer);
- if (ret) {
- ret = CMD_ERROR;
- goto end;
- }
-
- /* Close snapshot session element */
- ret = mi_lttng_writer_close_element(writer);
- if (ret) {
- ret = CMD_ERROR;
- }
-end:
- lttng_snapshot_output_list_destroy(list);
-error:
- return ret;
-}
-
-static int list_output(void)
-{
- int ret, output_seen = 0;
- struct lttng_snapshot_output *s_iter;
- struct lttng_snapshot_output_list *list;
-
- ret = lttng_snapshot_list_output(current_session_name, &list);
- if (ret < 0) {
- goto error;
- }
-
- MSG("Snapshot output list for session %s", current_session_name);
-
while ((s_iter = lttng_snapshot_output_list_get_next(list)) != NULL) {
MSG("%s[%" PRIu32 "] %s: %s (max-size: %" PRId64 ")", indent4,
lttng_snapshot_output_get_id(s_iter),
lttng_snapshot_output_get_ctrl_url(s_iter),
lttng_snapshot_output_get_maxsize(s_iter));
output_seen = 1;
+ if (lttng_opt_mi) {
+ ret = mi_lttng_snapshot_list_output(writer, s_iter);
+ if (ret) {
+ ret = CMD_ERROR;
+ goto end;
+ }
+ }
}
+ if (lttng_opt_mi) {
+ /* Close snapshot snapshots element */
+ ret = mi_lttng_writer_close_element(writer);
+ if (ret) {
+ ret = CMD_ERROR;
+ goto end;
+ }
+
+ /* Close snapshot session element */
+ ret = mi_lttng_writer_close_element(writer);
+ if (ret) {
+ ret = CMD_ERROR;
+ }
+ }
+end:
lttng_snapshot_output_list_destroy(list);
if (!output_seen) {
int ret;
if (argc < 2 && (!opt_data_url || !opt_ctrl_url)) {
- usage(stderr);
ret = CMD_ERROR;
goto end;
}
long id;
if (argc < 2) {
- usage(stderr);
ret = CMD_ERROR;
goto end;
}
{
int ret;
- if (lttng_opt_mi) {
- ret = mi_list_output();
- } else {
- ret = list_output();
- }
+ ret = list_output();
return ret;
}
-/*
- * Do a snapshot record with the URL if one is given (machine interface).
- */
-static int mi_record(const char *url)
-{
- int ret;
- struct lttng_snapshot_output *output = NULL;
-
- output = create_output_from_args(url);
- if (!output) {
- ret = CMD_FATAL;
- goto error;
- }
-
- ret = lttng_snapshot_record(current_session_name, output, 0);
- if (ret < 0) {
- ret = CMD_ERROR;
- goto error;
- }
-
- ret = mi_lttng_snapshot_record(writer, current_session_name, url,
- opt_ctrl_url, opt_data_url);
- if (ret) {
- ret = CMD_ERROR;
- }
-
-error:
- lttng_snapshot_output_destroy(output);
- return ret;
-}
-
/*
* Do a snapshot record with the URL if one is given.
*/
ret = lttng_snapshot_record(current_session_name, output, 0);
if (ret < 0) {
if (ret == -LTTNG_ERR_MAX_SIZE_INVALID) {
- ERR("The minimum size of a snapshot is computed by multiplying "
- "the total amount of streams with the largest subbuffer "
- "in the session.");
+ ERR("Invalid snapshot size. Cannot fit at least one packet per stream.");
}
goto error;
}
opt_data_url);
}
+ if (lttng_opt_mi) {
+ ret = mi_lttng_snapshot_record(writer, current_session_name, url,
+ opt_ctrl_url, opt_data_url);
+ if (ret) {
+ ret = CMD_ERROR;
+ }
+ }
+
error:
lttng_snapshot_output_destroy(output);
return ret;
int ret;
if (argc == 2) {
- /* With a given URL */
- if (lttng_opt_mi) {
- ret = mi_record(argv[1]);
- } else {
- ret = record(argv[1]);
- }
+ ret = record(argv[1]);
} else {
- if (lttng_opt_mi) {
- ret = mi_record(NULL);
- } else {
- ret = record(NULL);
- }
+ ret = record(NULL);
}
return ret;
if (argv == NULL || (!opt_ctrl_url && opt_data_url) ||
(opt_ctrl_url && !opt_data_url)) {
- usage(stderr);
command_ret = CMD_ERROR;
goto end;
}
while ((opt = poptGetNextOpt(pc)) != -1) {
switch (opt) {
case OPT_HELP:
- usage(stdout);
+ SHOW_HELP();
goto end;
case OPT_LIST_OPTIONS:
list_cmd_options(stdout, snapshot_opts);
break;
}
default:
- usage(stderr);
ret = CMD_UNDEFINED;
goto end;
}
break;
case LTTNG_ERR_SNAPSHOT_NODATA:
WARN("%s", lttng_strerror(command_ret));
+
+ /* A warning is fine since the user has no control on
+ * whether or not applications (or the kernel) have
+ * produced any event between the start of the tracing
+ * session and the recording of the snapshot. MI wise
+ * the command is not a success since nothing was
+ * recorded.
+ */
+ command_ret = 0;
break;
default:
ERR("%s", lttng_strerror(command_ret));