X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fdestroy.c;h=f74bf515c79ae44c7668e8cd674156ce24159da0;hp=7b7ea0e8028cec3f15e160f4f2c374079982fc5f;hb=890d8fe47755c3bad936389cf48ffa141cff41c9;hpb=fd076c09672458b1bc5a8ea46f8fe060f5f8ab43 diff --git a/src/bin/lttng/commands/destroy.c b/src/bin/lttng/commands/destroy.c index 7b7ea0e80..f74bf515c 100644 --- a/src/bin/lttng/commands/destroy.c +++ b/src/bin/lttng/commands/destroy.c @@ -15,7 +15,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -26,11 +26,16 @@ #include "../command.h" +#include #include +#include static char *opt_session_name; static int opt_destroy_all; +/* Mi writer */ +static struct mi_writer *writer; + enum { OPT_HELP = 1, OPT_LIST_OPTIONS, @@ -49,11 +54,12 @@ static struct poptOption long_options[] = { */ static void usage(FILE *ofp) { - fprintf(ofp, "usage: lttng destroy [options] [NAME]\n"); + fprintf(ofp, "usage: lttng destroy [NAME] [OPTIONS]\n"); fprintf(ofp, "\n"); fprintf(ofp, "Where NAME is an optional session name. If not specified, lttng will\n"); fprintf(ofp, "get it from the configuration directory (.lttng).\n"); fprintf(ofp, "\n"); + fprintf(ofp, "Options:\n"); fprintf(ofp, " -h, --help Show this help\n"); fprintf(ofp, " -a, --all Destroy all sessions\n"); fprintf(ofp, " --list-options Simple listing of options\n"); @@ -66,26 +72,42 @@ static void usage(FILE *ofp) * Unregister the provided session to the session daemon. On success, removes * the default configuration. */ -static int destroy_session(const char *session_name) +static int destroy_session(struct lttng_session *session) { int ret; + char *session_name = NULL; - ret = lttng_destroy_session(session_name); + ret = lttng_destroy_session(session->name); if (ret < 0) { switch (-ret) { - case LTTCOMM_SESS_NOT_FOUND: - WARN("Session name %s not found", session_name); + case LTTNG_ERR_SESS_NOT_FOUND: + WARN("Session name %s not found", session->name); break; default: + ERR("%s", lttng_strerror(ret)); break; } goto error; } - MSG("Session %s destroyed", session_name); - config_destroy_default(); + MSG("Session %s destroyed", session->name); + + 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); + if (ret) { + ret = CMD_ERROR; + goto error; + } + } + ret = CMD_SUCCESS; error: + free(session_name); return ret; } @@ -94,17 +116,19 @@ error: * * Call destroy_sessions for each registered sessions */ -static int destroy_all_sessions() +static int destroy_all_sessions(struct lttng_session *sessions, int count) { - int count, i, ret = CMD_SUCCESS; - struct lttng_session *sessions; + int i, ret = CMD_SUCCESS; - count = lttng_list_sessions(&sessions); if (count == 0) { MSG("No session found, nothing to do."); + } else if (count < 0) { + ERR("%s", lttng_strerror(ret)); + goto error; } + for (i = 0; i < count; i++) { - ret = destroy_session(sessions[i].name); + ret = destroy_session(&sessions[i]); if (ret < 0) { goto error; } @@ -113,31 +137,20 @@ error: return ret; } -/* - * get_default_session_name - * - * Returns the default sessions name, if any - */ -static int get_default_session_name(char **name) -{ - char *session_name = get_session_name(); - if (session_name == NULL) { - return CMD_ERROR; - } - *name = session_name; - return CMD_SUCCESS; -} - /* * The 'destroy ' first level command */ int cmd_destroy(int argc, const char **argv) { int opt; - int ret = CMD_SUCCESS; + int ret = CMD_SUCCESS , i, command_ret = CMD_SUCCESS, success = 1; static poptContext pc; char *session_name = NULL; + struct lttng_session *sessions; + int count; + int found; + pc = poptGetContext(NULL, argc, argv, long_options, 0); poptReadDefaultConfig(pc, 0); @@ -157,32 +170,127 @@ int cmd_destroy(int argc, const char **argv) goto end; } - /* Ignore session name in case all sessions are to be destroyed */ - if (opt_destroy_all) { - ret = destroy_all_sessions(); - goto end; - } + /* Mi preparation */ + if (lttng_opt_mi) { + writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi); + if (!writer) { + ret = -LTTNG_ERR_NOMEM; + goto end; + } - opt_session_name = (char *) poptGetArg(pc); + /* Open command element */ + ret = mi_lttng_writer_command_open(writer, + mi_lttng_element_command_destroy); + if (ret) { + ret = CMD_ERROR; + goto end; + } - if (opt_session_name == NULL) { - /* No session name specified, lookup default */ - session_name = get_session_name(); - if (session_name == NULL) { + /* Open output element */ + ret = mi_lttng_writer_open_element(writer, + mi_lttng_element_command_output); + if (ret) { ret = CMD_ERROR; goto end; } + + /* For validation and semantic purpose we open a sessions element */ + ret = mi_lttng_sessions_open(writer); + if (ret) { + ret = CMD_ERROR; + goto end; + } + } + + /* Recuperate all sessions for further operation */ + count = lttng_list_sessions(&sessions); + if (count < 0) { + command_ret = count; + success = 0; + goto mi_closing; + } + + /* Ignore session name in case all sessions are to be destroyed */ + if (opt_destroy_all) { + command_ret = destroy_all_sessions(sessions, count); + if (command_ret) { + success = 0; + } } else { - session_name = opt_session_name; + opt_session_name = (char *) poptGetArg(pc); + + if (!opt_session_name) { + /* No session name specified, lookup default */ + session_name = get_session_name(); + if (session_name == NULL) { + command_ret = CMD_ERROR; + success = 0; + goto mi_closing; + } + } else { + session_name = opt_session_name; + } + + /* Find the corresponding lttng_session struct */ + found = 0; + for (i = 0; i < count; i++) { + if (strncmp(sessions[i].name, session_name, NAME_MAX) == 0) { + found = 1; + command_ret = destroy_session(&sessions[i]); + if (command_ret) { + success = 0; + } + + } + } + + if (!found) { + ERR("Session name %s not found", session_name); + command_ret = LTTNG_ERR_SESS_NOT_FOUND; + success = 0; + goto mi_closing; + } } - ret = destroy_session(session_name); +mi_closing: + /* Mi closing */ + if (lttng_opt_mi) { + /* Close sessions and output element element */ + ret = mi_lttng_close_multi_element(writer, 2); + if (ret) { + ret = CMD_ERROR; + goto end; + } + + /* Success ? */ + ret = mi_lttng_writer_write_element_bool(writer, + mi_lttng_element_command_success, success); + if (ret) { + ret = CMD_ERROR; + goto end; + } + /* Command element close */ + ret = mi_lttng_writer_command_close(writer); + if (ret) { + ret = CMD_ERROR; + goto end; + } + } end: + /* Mi clean-up */ + if (writer && mi_lttng_writer_destroy(writer)) { + /* Preserve original error code */ + ret = ret ? ret : -LTTNG_ERR_MI_IO_FAIL; + } + if (opt_session_name == NULL) { free(session_name); } + /* Overwrite ret if an error occurred during destroy_session/all */ + ret = command_ret ? command_ret : ret; + poptFreeContext(pc); return ret; }