From: David Goulet Date: Tue, 26 Apr 2011 20:36:38 +0000 (-0400) Subject: Add destroy session feature X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=8028d92056a3f0f8999cb895d0fd21eeca0ce849;hp=1fd70b72ff7f1c98e4629392236d76ca9083295f;p=lttng-tools.git Add destroy session feature The destroy command is added. Some fixes were needed for destroy_session function in ltt-sessiond and basic handling of uuid. Now, the whole chain of tools uses libuuid. Signed-off-by: David Goulet --- diff --git a/include/lttng/liblttngctl.h b/include/lttng/liblttngctl.h index 3c084de32..b729f2b5b 100644 --- a/include/lttng/liblttngctl.h +++ b/include/lttng/liblttngctl.h @@ -20,6 +20,7 @@ #define _LIBLTTNGCTL_H #include +#include /* Default unix group name for tracing. */ @@ -41,7 +42,8 @@ struct lttng_session { char uuid[UUID_STR_LEN]; }; -extern int lttng_create_session(char *name, char **session_id); +extern int lttng_create_session(char *name, uuid_t *session_id); +extern int lttng_destroy_session(uuid_t *uuid); extern int lttng_connect_sessiond(void); extern int lttng_set_tracing_group(const char *name); extern int lttng_check_session_daemon(void); diff --git a/liblttngctl/liblttngctl.c b/liblttngctl/liblttngctl.c index bd7dcb0c5..9afd6fda3 100644 --- a/liblttngctl/liblttngctl.c +++ b/liblttngctl/liblttngctl.c @@ -194,23 +194,40 @@ int lttng_ust_list_apps(pid_t **pids) * Create a brand new session using name. Allocate * the session_id param pointing to the UUID. */ -int lttng_create_session(char *name, char **session_id) +int lttng_create_session(char *name, uuid_t *session_id) { int ret; char *uuid; strncpy(lsm.session_name, name, sizeof(lsm.session_name)); + lsm.session_name[sizeof(lsm.session_name) - 1] = '\0'; ret = ask_sessiond(LTTNG_CREATE_SESSION, NULL); if (ret < 0) { goto end; } - /* Allocate UUID string length */ - uuid = malloc(UUID_STR_LEN); + uuid_copy(*session_id, llm.session_id); - strncpy(uuid, llm.session_id, UUID_STR_LEN); - *session_id = uuid; +end: + return ret; +} + +/* + * lttng_destroy_session + * + * Destroy session using name. + */ +int lttng_destroy_session(uuid_t *uuid) +{ + int ret; + + uuid_copy(lsm.session_id, *uuid); + + ret = ask_sessiond(LTTNG_DESTROY_SESSION, NULL); + if (ret < 0) { + goto end; + } end: return ret; diff --git a/liblttsessiondcomm/liblttsessiondcomm.h b/liblttsessiondcomm/liblttsessiondcomm.h index 56414063c..6d6290d0a 100644 --- a/liblttsessiondcomm/liblttsessiondcomm.h +++ b/liblttsessiondcomm/liblttsessiondcomm.h @@ -85,7 +85,7 @@ enum lttcomm_return_code { struct lttcomm_session_msg { /* Common data to almost all command */ enum lttcomm_command_type cmd_type; - char session_id[37]; + uuid_t session_id; char trace_name[NAME_MAX]; char session_name[NAME_MAX]; pid_t pid; @@ -125,7 +125,7 @@ struct lttcomm_session_msg { struct lttcomm_lttng_msg { enum lttcomm_command_type cmd_type; enum lttcomm_return_code ret_code; - char session_id[37]; + uuid_t session_id; pid_t pid; char trace_name[NAME_MAX]; unsigned int size_payload; diff --git a/ltt-sessiond/ltt-sessiond.c b/ltt-sessiond/ltt-sessiond.c index 2dcf62f45..3590d7e44 100644 --- a/ltt-sessiond/ltt-sessiond.c +++ b/ltt-sessiond/ltt-sessiond.c @@ -69,9 +69,10 @@ static void *thread_manage_clients(void *data); static void *thread_manage_apps(void *data); static int create_session(char *name, uuid_t *session_id); -static void destroy_session(uuid_t session_id); +static int destroy_session(uuid_t *uuid); -static struct ltt_session *find_session(uuid_t session_id); +static struct ltt_session *find_session_by_uuid(uuid_t session_id); +static struct ltt_session *find_session_by_name(char *name); /* Variables */ const char *progname; @@ -302,13 +303,14 @@ error: } /* - * find_session + * find_session_by_uuid * * Return a ltt_session structure ptr that matches the uuid. */ -static struct ltt_session *find_session(uuid_t session_id) +static struct ltt_session *find_session_by_uuid(uuid_t session_id) { - struct ltt_session *iter = NULL; + int found = 0; + struct ltt_session *iter; /* Sanity check for NULL session_id */ if (uuid_is_null(session_id)) { @@ -316,12 +318,41 @@ static struct ltt_session *find_session(uuid_t session_id) } cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (uuid_compare(iter->uuid, session_id)) { + if (uuid_compare(iter->uuid, session_id) == 0) { + found = 1; break; } } end: + if (!found) { + iter = NULL; + } + return iter; +} + +/* + * find_session_by_name + * + * Return a ltt_session structure ptr that matches name. + * If no session found, NULL is returned. + */ +static struct ltt_session *find_session_by_name(char *name) +{ + int found = 0; + struct ltt_session *iter; + + cds_list_for_each_entry(iter, <t_session_list.head, list) { + if (strncmp(iter->name, name, strlen(iter->name)) == 0) { + found = 1; + break; + } + } + + if (!found) { + iter = NULL; + } + return iter; } @@ -330,22 +361,26 @@ end: * * Delete session from the global session list * and free the memory. + * + * Return -1 if no session is found. + * On success, return 1; */ -static void destroy_session(uuid_t session_id) +static int destroy_session(uuid_t *uuid) { - struct ltt_session *iter = NULL; + int found = -1; + struct ltt_session *iter; cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (uuid_compare(iter->uuid, session_id)) { + if (uuid_compare(iter->uuid, *uuid) == 0) { cds_list_del(&iter->list); + free(iter); + session_count--; + found = 1; break; } } - if (iter) { - free(iter); - session_count--; - } + return found; } /* @@ -371,7 +406,7 @@ static int create_session(char *name, uuid_t *session_id) } } else { /* Generate session name based on the session count */ - if (asprintf(&new_session->name, "%s%d", "auto", session_count) < 0) { + if (asprintf(&new_session->name, "%s%d", "lttng-", session_count) < 0) { goto error; } } @@ -456,11 +491,12 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi llm->pid = lsm->pid; /* Manage uuid */ - if (lsm->session_id != NULL) { - strncpy(llm->session_id, lsm->session_id, UUID_STR_LEN); + if (!uuid_is_null(lsm->session_id)) { + uuid_copy(llm->session_id, lsm->session_id); } strncpy(llm->trace_name, lsm->trace_name, strlen(llm->trace_name)); + llm->trace_name[strlen(llm->trace_name) - 1] = '\0'; } /* @@ -526,29 +562,37 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) switch (lsm->cmd_type) { case LTTNG_CREATE_SESSION: { - uuid_t uuid; - ret = create_session(lsm->session_name, &uuid); + ret = create_session(lsm->session_name, &llm.session_id); if (ret < 0) { - goto error; + goto end; } - uuid_unparse(uuid, llm.session_id); - buf_size = setup_data_buffer(&send_buf, 0, &llm); if (buf_size < 0) { ret = LTTCOMM_FATAL; - goto error; + goto end; } - goto send; break; } + case LTTNG_DESTROY_SESSION: + { + ret = destroy_session(&lsm->session_id); + if (ret < 0) { + ret = LTTCOMM_NO_SESS; + } else { + ret = LTTCOMM_OK; + } + + /* No auxiliary data so only send the llm struct. */ + goto end; + } case UST_LIST_APPS: { /* Stop right now if no apps */ if (traceable_app_count == 0) { ret = LTTCOMM_NO_APPS; - goto error; + goto end; } /* Setup data buffer and details for transmission */ @@ -556,12 +600,11 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) sizeof(pid_t) * traceable_app_count, &llm); if (buf_size < 0) { ret = LTTCOMM_FATAL; - goto error; + goto end; } get_list_apps((pid_t *)(send_buf + sizeof(struct lttcomm_lttng_msg))); - goto send; break; } case LTTNG_LIST_SESSIONS: @@ -569,7 +612,7 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* Stop right now if no session */ if (session_count == 0) { ret = LTTCOMM_NO_SESS; - goto error; + goto end; } /* Setup data buffer and details for transmission */ @@ -577,23 +620,21 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) (sizeof(struct lttng_session) * session_count), &llm); if (buf_size < 0) { ret = LTTCOMM_FATAL; - goto error; + goto end; } get_list_sessions((struct lttng_session *)(send_buf + sizeof(struct lttcomm_lttng_msg))); - goto send; break; } default: { /* Undefined command */ ret = LTTCOMM_UND; - goto error; + goto end; } } -send: ret = send_unix_sock(sock, send_buf, buf_size); if (send_buf != NULL) { @@ -602,13 +643,13 @@ send: return ret; -error: +end: /* Notify client of error */ llm.ret_code = ret; llm.size_payload = 0; send_unix_sock(sock, (void*) &llm, sizeof(llm)); - return -1; + return ret; } /* diff --git a/lttng/lttng.c b/lttng/lttng.c index b08ecfed8..169e70eb0 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -56,6 +56,7 @@ static int set_signal_handler(void); static int process_client_opt(void) { int ret; + uuid_t uuid; /* Connect to the session daemon */ ret = lttng_connect_sessiond(); @@ -84,6 +85,14 @@ static int process_client_opt(void) } } + if (opt_destroy_session != NULL) { + uuid_parse(opt_destroy_session, uuid); + ret = lttng_destroy_session(&uuid); + if (ret < 0) { + goto end; + } + } + return 0; end: @@ -100,15 +109,18 @@ end: static int process_opt_create_session(void) { int ret; - char *session_id; + uuid_t session_id; + char str_uuid[37]; ret = lttng_create_session(opt_create_session, &session_id); if (ret < 0) { goto error; } + uuid_unparse(session_id, str_uuid); + MSG("Session created:"); - MSG(" %s (%s)", opt_create_session, session_id); + MSG(" %s (%s)", opt_create_session, str_uuid); error: return ret; diff --git a/lttng/lttng.h b/lttng/lttng.h index 1faa29d79..f9e75538c 100644 --- a/lttng/lttng.h +++ b/lttng/lttng.h @@ -30,6 +30,7 @@ extern char *opt_tracing_group; extern char *opt_session_name; extern char *opt_create_session; extern char *opt_sessiond_path; +extern char *opt_destroy_session; extern int opt_list_apps; extern int opt_no_sessiond; extern int opt_list_session; diff --git a/lttng/options.c b/lttng/options.c index eb31108c4..befeab54a 100644 --- a/lttng/options.c +++ b/lttng/options.c @@ -26,6 +26,7 @@ char *opt_tracing_group; char *opt_session_name; char *opt_create_session; char *opt_sessiond_path; +char *opt_destroy_session; int opt_trace_kernel = 0; int opt_quiet = 0; int opt_verbose = 0; @@ -51,6 +52,7 @@ static struct poptOption long_options[] = { {"no-sessiond", 0, POPT_ARG_VAL, &opt_no_sessiond, 1, 0}, {"sessiond-path", 0, POPT_ARG_STRING, &opt_sessiond_path, 0, 0}, {"list-session", 0, POPT_ARG_VAL, &opt_list_session, 1, 0}, + {"destroy-session", 'd', POPT_ARG_STRING, &opt_destroy_session, 0, 0}, {0, 0, 0, 0, 0, 0} }; @@ -74,8 +76,9 @@ static void usage(FILE *ofp) fprintf(ofp, "Session options:\n"); fprintf(ofp, " -c, --create-session NAME Create a new session\n"); fprintf(ofp, " --list-session List all available sessions\n"); - //fprintf(ofp, " --session [NAME] Specify tracing session. If no NAME is given\n"); - //fprintf(ofp, " or option is ommited, a session will be created\n"); + fprintf(ofp, " --session [NAME] Specify tracing session. If no NAME is given\n"); + fprintf(ofp, " or option is ommited, a session will be created\n"); + fprintf(ofp, " -d, --destroy-session=NAME Destroy the session specified by NAME\n"); fprintf(ofp, "\n"); fprintf(ofp, "Tracing options:\n"); //fprintf(ofp, " --kernel Enable kernel tracing\n");