From 1dac0189ed7311146ff2cfc6605bac81213ee90b Mon Sep 17 00:00:00 2001 From: Partha Pratim Mukherjee Date: Sun, 5 Jul 2015 15:31:15 -0400 Subject: [PATCH] Fix: destroy session removes the default config file MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Destroy session command by default removes the default config file without checking the current session. As a result when we call any other command which expects a default session by calling get_session_name() function, it fails. This patch will fix this by checking that the default config file gets removed only when destroy session is called with the current session. Fixes: #887 Signed-off-by: Partha Pratim Mukherjee Signed-off-by: Jérémie Galarneau --- src/bin/lttng/commands/destroy.c | 11 +++++- src/bin/lttng/conf.c | 66 +++++++++++++++++++++++--------- src/bin/lttng/conf.h | 1 + src/bin/lttng/utils.c | 34 ++++++++++++---- src/bin/lttng/utils.h | 1 + 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/src/bin/lttng/commands/destroy.c b/src/bin/lttng/commands/destroy.c index 95343c9c9..53fe3aca1 100644 --- a/src/bin/lttng/commands/destroy.c +++ b/src/bin/lttng/commands/destroy.c @@ -29,6 +29,7 @@ #include #include +#include static char *opt_session_name; static int opt_destroy_all; @@ -75,6 +76,7 @@ static void usage(FILE *ofp) static int destroy_session(struct lttng_session *session) { int ret; + char *session_name = NULL; ret = lttng_destroy_session(session->name); if (ret < 0) { @@ -90,7 +92,11 @@ static int destroy_session(struct lttng_session *session) } MSG("Session %s destroyed", session->name); - config_destroy_default(); + + session_name = get_session_name_quiet(); + if (session_name && !strncmp(session->name, session_name, NAME_MAX)) { + config_destroy_default(); + } if (lttng_opt_mi) { ret = mi_lttng_session(writer, session, 0); @@ -102,6 +108,7 @@ static int destroy_session(struct lttng_session *session) ret = CMD_SUCCESS; error: + free(session_name); return ret; } @@ -213,7 +220,7 @@ int cmd_destroy(int argc, const char **argv) } else { opt_session_name = (char *) poptGetArg(pc); - if (opt_session_name == NULL) { + if (!opt_session_name) { /* No session name specified, lookup default */ session_name = get_session_name(); if (session_name == NULL) { diff --git a/src/bin/lttng/conf.c b/src/bin/lttng/conf.c index 7e6c83344..f96be3a81 100644 --- a/src/bin/lttng/conf.c +++ b/src/bin/lttng/conf.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -177,14 +178,10 @@ int config_exists(const char *path) return S_ISREG(info.st_mode) || S_ISDIR(info.st_mode); } -/* - * Returns the session name from the config file. - * The caller is responsible for freeing the returned string. - * On error, NULL is returned. - */ -char *config_read_session_name(char *path) +static +int _config_read_session_name(char *path, char **name) { - int ret; + int ret = 0; FILE *fp; char var[NAME_MAX], *session_name; #if (NAME_MAX == 255) @@ -193,15 +190,14 @@ char *config_read_session_name(char *path) session_name = zmalloc(NAME_MAX); if (session_name == NULL) { + ret = -ENOMEM; ERR("Out of memory"); goto error; } fp = open_config(path, "r"); if (fp == NULL) { - ERR("Can't find valid lttng config %s/.lttngrc", path); - MSG("Did you create a session? (lttng create )"); - free(session_name); + ret = -ENOENT; goto error; } @@ -222,22 +218,54 @@ char *config_read_session_name(char *path) } error_close: - free(session_name); - ret = fclose(fp); - if (ret < 0) { + if (fclose(fp) < 0) { PERROR("close config read session name"); } - error: - return NULL; - + free(session_name); + return ret; found: - ret = fclose(fp); - if (ret < 0) { + *name = session_name; + if (fclose(fp) < 0) { PERROR("close config read session name found"); } - return session_name; + return ret; +} + +/* + * Returns the session name from the config file. + * + * The caller is responsible for freeing the returned string. + * On error, NULL is returned. + */ +char *config_read_session_name(char *path) +{ + int ret; + char *name = NULL; + + ret = _config_read_session_name(path, &name); + if (ret == -ENOENT) { + const char *home_dir = utils_get_home_dir(); + + ERR("Can't find valid lttng config %s/.lttngrc", home_dir); + MSG("Did you create a session? (lttng create )"); + } + + return name; +} + +/* + * Returns the session name from the config file. (no warnings/errors emitted) + * + * The caller is responsible for freeing the returned string. + * On error, NULL is returned. + */ +char *config_read_session_name_quiet(char *path) +{ + char *name = NULL; + (void) _config_read_session_name(path, &name); + return name; } /* diff --git a/src/bin/lttng/conf.h b/src/bin/lttng/conf.h index 3bed59c2a..a26a6b8e3 100644 --- a/src/bin/lttng/conf.h +++ b/src/bin/lttng/conf.h @@ -28,6 +28,7 @@ int config_add_session_name(char *path, char *name); /* Must free() the return pointer */ char *config_read_session_name(char *path); +char *config_read_session_name_quiet(char *path); char *config_get_file_path(char *path); #endif /* _LTTNG_CONFIG_H */ diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index ef8d0235a..d52d4622a 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -40,13 +40,8 @@ static const char *str_jul = "JUL"; static const char *str_log4j = "LOG4J"; static const char *str_python = "Python"; -/* - * get_session_name - * - * Return allocated string with the session name found in the config - * directory. - */ -char *get_session_name(void) +static +char *_get_session_name(int quiet) { char *path, *session_name = NULL; @@ -57,7 +52,8 @@ char *get_session_name(void) } /* Get session name from config */ - session_name = config_read_session_name(path); + session_name = quiet ? config_read_session_name_quiet(path) : + config_read_session_name(path); if (session_name == NULL) { goto error; } @@ -70,6 +66,28 @@ error: return NULL; } +/* + * get_session_name + * + * Return allocated string with the session name found in the config + * directory. + */ +char *get_session_name(void) +{ + return _get_session_name(0); +} + +/* + * get_session_name_quiet (no warnings/errors emitted) + * + * Return allocated string with the session name found in the config + * directory. + */ +char *get_session_name_quiet(void) +{ + return _get_session_name(1); +} + /* * list_commands * diff --git a/src/bin/lttng/utils.h b/src/bin/lttng/utils.h index d3941279a..ea92bb9bc 100644 --- a/src/bin/lttng/utils.h +++ b/src/bin/lttng/utils.h @@ -28,6 +28,7 @@ extern char *opt_relayd_path; struct cmd_struct; char *get_session_name(void); +char *get_session_name_quiet(void); void list_commands(struct cmd_struct *commands, FILE *ofp); void list_cmd_options(FILE *ofp, struct poptOption *options); -- 2.34.1