#define _LIBLTTNGCTL_H
#include <limits.h>
+#include <uuid/uuid.h>
/* Default unix group name for tracing.
*/
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);
* 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;
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;
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;
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;
}
/*
- * 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)) {
}
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;
}
*
* 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;
}
/*
}
} 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;
}
}
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';
}
/*
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 */
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:
/* 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 */
(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) {
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;
}
/*
static int process_client_opt(void)
{
int ret;
+ uuid_t uuid;
/* Connect to the session daemon */
ret = lttng_connect_sessiond();
}
}
+ if (opt_destroy_session != NULL) {
+ uuid_parse(opt_destroy_session, uuid);
+ ret = lttng_destroy_session(&uuid);
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
return 0;
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;
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;
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;
{"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}
};
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");