X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fsession.c;h=be820ee552dace6d6c5df188b8d8dee9e2c63681;hb=5c9408af9daa0f6e17911397019edb5981bc78c9;hp=93f03e4c5ef11386d7fc5fdf36288993d246b078;hpb=96243366860d20e371efed0500070cdbc4a01ec7;p=lttng-tools.git diff --git a/ltt-sessiond/session.c b/ltt-sessiond/session.c index 93f03e4c5..be820ee55 100644 --- a/ltt-sessiond/session.c +++ b/ltt-sessiond/session.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "lttngerr.h" @@ -32,11 +33,21 @@ static unsigned int session_count; static void add_session_list(struct ltt_session *ls); static void del_session_list(struct ltt_session *ls); -/* Init session's list */ -static struct ltt_session_list ltt_session_list = { +/* Init global session list */ +struct ltt_session_list ltt_session_list = { .head = CDS_LIST_HEAD_INIT(ltt_session_list.head), }; +/* + * get_session_list + * + * Return a pointer to the session list. + */ +struct ltt_session_list *get_session_list(void) +{ + return <t_session_list; +} + /* * get_session_count * @@ -135,13 +146,13 @@ struct ltt_session *find_session_by_name(char *name) * Return -1 if no session is found. * On success, return 1; */ -int destroy_session(uuid_t *uuid) +int destroy_session(char *name) { int found = -1; struct ltt_session *iter; cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (uuid_compare(iter->uuid, *uuid) == 0) { + if (strcmp(iter->name, name) == 0) { DBG("Destroying session %s", iter->name); del_session_list(iter); free(iter); @@ -156,75 +167,105 @@ int destroy_session(uuid_t *uuid) /* * create_session * - * Create a brand new session and add it to the - * global session list. + * Create a brand new session and add it to the global session list. */ -int create_session(char *name, uuid_t *session_id) +int create_session(char *name, char *path) { + int ret; + char date_time[NAME_MAX]; struct ltt_session *new_session; - - DBG("Creating session %s", name); + time_t rawtime; + struct tm *timeinfo; new_session = find_session_by_name(name); if (new_session != NULL) { - goto error; + ret = -EEXIST; + goto error_exist; } /* Allocate session data structure */ new_session = malloc(sizeof(struct ltt_session)); if (new_session == NULL) { perror("malloc"); - goto error_mem; + ret = -ENOMEM; + goto error_malloc; } + /* Define session name */ if (name != NULL) { if (asprintf(&new_session->name, "%s", name) < 0) { - goto error_mem; + ret = -ENOMEM; + goto error_asprintf; } } else { - /* Generate session name based on the session count */ - if (asprintf(&new_session->name, "%s%d", "lttng-", session_count) < 0) { - goto error_mem; + ERR("No session name given"); + ret = -1; + goto error; + } + + /* Define session system path */ + if (path != NULL) { + if (strstr(name, "auto-") == NULL) { + time(&rawtime); + timeinfo = localtime(&rawtime); + strftime(date_time, sizeof(date_time), "-%Y%m%d-%H%M%S", timeinfo); + } else { + date_time[0] = '\0'; + } + + if (asprintf(&new_session->path, "%s/%s%s", path, name, date_time) < 0) { + ret = -ENOMEM; + goto error_asprintf; } + } else { + ERR("No session path given"); + ret = -1; + goto error; } /* UUID generation */ uuid_generate(new_session->uuid); - uuid_copy(*session_id, new_session->uuid); - /* Set consumer (identifier) to 0. This means that there is + /* + * Set consumer (identifier) to 0. This means that there is * NO consumer attach to that session yet. */ new_session->ust_consumer = 0; - new_session->kernel_consumer = 0; + + /* Init kernel session */ + new_session->kernel_session = NULL; + new_session->kern_session_count = 0; /* Init list */ CDS_INIT_LIST_HEAD(&new_session->ust_traces); - CDS_INIT_LIST_HEAD(&new_session->kernel_traces); /* Set trace list counter */ new_session->ust_trace_count = 0; - new_session->kern_trace_count = 0; /* Add new session to the global session list */ add_session_list(new_session); + DBG("Tracing session %s created in %s", name, new_session->path); + return 0; error: - return -1; +error_asprintf: + if (new_session != NULL) { + free(new_session); + } -error_mem: - return -ENOMEM; +error_exist: +error_malloc: + return ret; } /* * get_lttng_session * - * Iterate over the global session list and - * fill the lttng_session array. + * Iterate over the global session list and fill the lttng_session array. */ -void get_lttng_session(struct lttng_session *lt) +void get_lttng_session(struct lttng_session *sessions) { int i = 0; struct ltt_session *iter; @@ -236,11 +277,11 @@ void get_lttng_session(struct lttng_session *lt) * the control struct in the buffer. */ cds_list_for_each_entry(iter, <t_session_list.head, list) { - /* Copy name and uuid */ - uuid_copy(lsess.uuid, iter->uuid); + strncpy(lsess.path, iter->path, sizeof(lsess.path)); + lsess.path[sizeof(lsess.path) - 1] = '\0'; strncpy(lsess.name, iter->name, sizeof(lsess.name)); lsess.name[sizeof(lsess.name) - 1] = '\0'; - memcpy(<[i], &lsess, sizeof(lsess)); + memcpy(&sessions[i], &lsess, sizeof(lsess)); i++; /* Reset struct for next pass */ memset(&lsess, 0, sizeof(lsess));