X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fsession.c;h=92111ffed981cc5f2593bc0770efc8c5f8e893aa;hp=9e93d89cef07814fffa795fdfac74ad59f2ed63d;hb=7a485870536daad1f6c5aeb1ae18783a8862cbee;hpb=91d76f53238ce994e91e1213e46c138b1b5529c6 diff --git a/ltt-sessiond/session.c b/ltt-sessiond/session.c index 9e93d89ce..92111ffed 100644 --- a/ltt-sessiond/session.c +++ b/ltt-sessiond/session.c @@ -17,12 +17,11 @@ */ #define _GNU_SOURCE -#include #include #include #include +#include #include -#include #include "lttngerr.h" #include "session.h" @@ -34,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 * @@ -74,35 +83,6 @@ static void del_session_list(struct ltt_session *ls) } } -/* - * find_session_by_uuid - * - * Return a ltt_session structure ptr that matches the uuid. - */ -struct ltt_session *find_session_by_uuid(uuid_t session_id) -{ - int found = 0; - struct ltt_session *iter; - - /* Sanity check for NULL session_id */ - if (uuid_is_null(session_id)) { - goto end; - } - - cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (uuid_compare(iter->uuid, session_id) == 0) { - found = 1; - break; - } - } - -end: - if (!found) { - iter = NULL; - } - return iter; -} - /* * find_session_by_name * @@ -115,7 +95,7 @@ struct ltt_session *find_session_by_name(char *name) struct ltt_session *iter; cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (strncmp(iter->name, name, strlen(iter->name)) == 0) { + if (strncmp(iter->name, name, strlen(name)) == 0) { found = 1; break; } @@ -137,13 +117,14 @@ 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); found = 1; @@ -157,83 +138,117 @@ 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; + 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; } - /* UUID generation */ - uuid_generate(new_session->uuid); - uuid_copy(*session_id, new_session->uuid); + /* 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'; + } - /* Set consumer (identifier) to 0. This means that there is + 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; + } + + /* + * Set consumer (identifier) to 0. This means that there is * NO consumer attach to that session yet. */ new_session->ust_consumer = 0; - new_session->lttng_consumer = 0; + + /* Init kernel session */ + new_session->kernel_session = NULL; /* Init list */ CDS_INIT_LIST_HEAD(&new_session->ust_traces); - CDS_INIT_LIST_HEAD(&new_session->lttng_traces); + + /* Set trace list counter */ + new_session->ust_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; struct lttng_session lsess; + DBG("Getting all available session"); + /* Iterate over session list and append data after * the control struct in the buffer. */ cds_list_for_each_entry(iter, <t_session_list.head, list) { - /* Copy name and uuid */ - uuid_unparse(iter->uuid, lsess.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));