[lttng-dev] [PATCH] Enforce exactly one LTTNG_DOMAIN (add_context.c) (update 2) (REPLACES PREVIOUS PATCH)
Thibault, Daniel
Daniel.Thibault at drdc-rddc.gc.ca
Fri Feb 10 16:22:48 EST 2012
>From 38de214f7fb42f814b421eb8c9b17f4fd7cfd343 Fri, 10 Feb 2012 16:19:34 -0500
From: Daniel U. Thibault <daniel.thibault at drdc-rddc.gc.ca>
Date: Fri, 10 Feb 2012 16:18:53 -0500
Subject: [PATCH] Enforce exactly one LTTNG_DOMAIN (add_context.c) (update 2)
Also fix a memory leak.
Signed-off-by: Daniel U. Thibault <daniel.thibault at drdc-rddc.gc.ca>
diff --git a/src/bin/lttng/commands/add_context.c b/src/bin/lttng/commands/add_context.c
index e499ef3..2192018 100644
--- a/src/bin/lttng/commands/add_context.c
+++ b/src/bin/lttng/commands/add_context.c
@@ -37,6 +37,7 @@
static char *opt_session_name;
static int opt_kernel;
static int opt_userspace;
+static enum lttng_domain_type opt_domain;
static char *opt_type;
#if 0
/* Not implemented yet */
@@ -272,7 +273,7 @@
};
/*
- * Pretty print context type.
+ * Pretty print context type (FILE *ofp must be valid).
*/
static void print_ctx_type(FILE *ofp)
{
@@ -309,6 +310,7 @@
fprintf(ofp, "will be added to all events and all channels.\n");
fprintf(ofp, "Otherwise the context will be added only to the channel (-c)\n");
fprintf(ofp, "and/or event (-e) indicated.\n");
+ fprintf(ofp, "Exactly one domain (-k/--kernel or -u/--userspace) must be specified.\n");
fprintf(ofp, "\n");
fprintf(ofp, "Options:\n");
fprintf(ofp, " -h, --help Show this help\n");
@@ -325,9 +327,8 @@
#else
fprintf(ofp, " -u, --userspace Apply to the user-space tracer\n");
#endif
- fprintf(ofp, " -t, --type TYPE Context type. You can repeat that option on\n");
- fprintf(ofp, " the command line to specify multiple contexts at once.\n");
- fprintf(ofp, " (--kernel preempts --userspace)\n");
+ fprintf(ofp, " -t, --type TYPE Context type. You can repeat that option on the\n");
+ fprintf(ofp, " command line to specify multiple contexts at once.\n");
fprintf(ofp, " TYPE can be one of the strings below:\n");
print_ctx_type(ofp);
fprintf(ofp, "\n");
@@ -340,7 +341,8 @@
}
/*
- * Find context numerical value from string.
+ * Find context numerical value from string (which must not be NULL).
+ * Returns the index on success, -1 on failure.
*/
static int find_ctx_type_idx(const char *opt)
{
@@ -360,6 +362,7 @@
/*
* Add context to channel or event.
+ * Returns a CMD_* result value.
*/
static int add_context(char *session_name)
{
@@ -372,19 +375,12 @@
memset(&context, 0, sizeof(context));
memset(&dom, 0, sizeof(dom));
- if (opt_kernel) {
- dom.type = LTTNG_DOMAIN_KERNEL;
- } else if (opt_userspace) {
- dom.type = LTTNG_DOMAIN_UST;
- } else {
- ERR("Please specify a tracer (-k/--kernel or -u/--userspace)");
- ret = CMD_ERROR;
- goto error;
- }
+ /* cmd_add_context() ensures exactly one domain is set */
+ dom.type = opt_domain;
handle = lttng_create_handle(session_name, &dom);
if (handle == NULL) {
- ret = CMD_ERROR;
+ ret = CMD_FATAL;
goto error;
}
@@ -431,23 +427,25 @@
}
}
- ret = CMD_SUCCESS;
+ /*
+ * CMD_WARNING means that at least one lttng_add_context() failed and
+ * tells the user to look on stderr for error(s).
+ */
+ if (warn) {
+ ret = CMD_WARNING;
+ } else {
+ ret = CMD_SUCCESS;
+ }
error:
lttng_destroy_handle(handle);
- /*
- * This means that at least one add_context failed and tells the user to
- * look on stderr for error(s).
- */
- if (warn) {
- ret = CMD_WARNING;
- }
return ret;
}
/*
* Add context to channel or event.
+ * Returns a CMD_* result value.
*/
int cmd_add_context(int argc, const char **argv)
{
@@ -456,6 +454,7 @@
struct ctx_type *type, *tmptype;
char *session_name = NULL;
+ opt_domain = 0; /* LTTNG_DOMAIN_UNSPECIFIED */
if (argc < 2) {
usage(stderr);
ret = CMD_ERROR;
@@ -500,6 +499,13 @@
}
break;
case OPT_USERSPACE:
+ /* Early enforcement of requirement for exactly one domain */
+ if (opt_domain != 0) { /* opt_domain != LTTNG_DOMAIN_UNSPECIFIED */
+ ERR("More than one domain specified");
+ ret = CMD_ERROR;
+ goto end;
+ }
+ opt_domain = LTTNG_DOMAIN_UST;
opt_userspace = 1;
#if 0
opt_cmd_name = poptGetOptArg(pc);
@@ -522,18 +528,34 @@
goto end;
}
- if (!opt_session_name) {
- session_name = get_session_name();
- if (session_name == NULL) {
- ret = CMD_ERROR;
- goto end;
- }
- } else {
- session_name = opt_session_name;
+ /* Enforce requirement for exactly one domain */
+ /* Five LTTNG_DOMAIN_* values are currently planned */
+ if (opt_kernel && opt_userspace) {
+ ERR("More than one domain specified");
+ ret = CMD_ERROR;
+ goto end;
+ } else if (!opt_kernel && !opt_userspace) {
+ ERR("No domain specified: Use one of -k/--kernel or -u/--userspace");
+ ret = CMD_ERROR;
+ goto end;
+ }
+ /* OPT_KERNEL not in loop */
+ if (opt_kernel) {
+ opt_domain = LTTNG_DOMAIN_KERNEL;
+ }
+
+ session_name = (opt_session_name ? opt_session_name : get_session_name() );
+ if (session_name == NULL) {
+ ret = CMD_ERROR;
+ goto end;
}
ret = add_context(session_name);
+ if (!opt_session_name) {
+ free (session_name);
+ }
+
end:
/* Cleanup allocated memory */
cds_list_for_each_entry_safe(type, tmptype, &ctx_type_list.head, list) {
------------------------------
Using static enum lttng_domain_type opt_domain and the implicit LTTNG_DOMAIN_UNSPECIFIED constant.
Daniel U. Thibault
R & D pour la défense Canada - Valcartier (RDDC Valcartier) / Defence R&D Canada - Valcartier (DRDC Valcartier)
Système de systèmes (SdS) / System of Systems (SoS)
Solutions informatiques et expérimentations (SIE) / Computing Solutions and Experimentations (CSE)
2459 Boul. Pie XI Nord
Québec, QC G3J 1X5
CANADA
Vox : (418) 844-4000 x4245
Fax : (418) 844-4538
NAC: 918V QSDJ
Gouvernement du Canada / Government of Canada
<http://www.valcartier.drdc-rddc.gc.ca/>
More information about the lttng-dev
mailing list