X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fltt-sessiond.c;h=2dcf62f4518b620a31bd3b674dab166b143c67b3;hp=a51593a96f32a82791f56909366de6ae24f9eb6d;hb=1fd70b72ff7f1c98e4629392236d76ca9083295f;hpb=75462a81e727e0b081dd21805836302bfbd77788 diff --git a/ltt-sessiond/ltt-sessiond.c b/ltt-sessiond/ltt-sessiond.c index a51593a96..2dcf62f45 100644 --- a/ltt-sessiond/ltt-sessiond.c +++ b/ltt-sessiond/ltt-sessiond.c @@ -35,6 +35,7 @@ #include /* URCU list library (-lurcu) */ #include /* UST control lib (-lust) */ +#include #include "liblttsessiondcomm.h" #include "ltt-sessiond.h" @@ -49,24 +50,28 @@ const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE; /* Static functions */ static int set_signal_handler(void); static int set_socket_perms(void); -static void sighandler(int); +static void sighandler(int sig); static void cleanup(void); static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_session_msg *lsm); static int check_existing_daemon(void); -static int notify_apps(const char*); -static int connect_app(pid_t); +static int notify_apps(const char* name); +static int connect_app(pid_t pid); static int init_daemon_socket(void); static int process_client_msg(int sock, struct lttcomm_session_msg*); static int send_unix_sock(int sock, void *buf, size_t len); -static size_t ust_list_apps(pid_t **pids); +static int setup_data_buffer(char **buf, size_t size, struct lttcomm_lttng_msg *llm); -static void *thread_manage_clients(void *); -static void *thread_manage_apps(void *); +/* Command function */ +static void get_list_apps(pid_t *pids); +static void get_list_sessions(struct lttng_session *lt); -static int create_session(const char*, uuid_t *); -static void destroy_session(uuid_t); +static void *thread_manage_clients(void *data); +static void *thread_manage_apps(void *data); -static struct ltt_session *find_session(uuid_t); +static int create_session(char *name, uuid_t *session_id); +static void destroy_session(uuid_t session_id); + +static struct ltt_session *find_session(uuid_t session_id); /* Variables */ const char *progname; @@ -346,9 +351,10 @@ static void destroy_session(uuid_t session_id) /* * create_session * - * Create a brand new session, + * Create a brand new session and add it to the + * global session list. */ -static int create_session(const char *name, uuid_t *session_id) +static int create_session(char *name, uuid_t *session_id) { struct ltt_session *new_session; @@ -396,36 +402,47 @@ error: } /* - * ust_list_apps + * get_list_apps * * List traceable user-space application and fill an * array of pids. - * - * Return size of the array. */ -static size_t ust_list_apps(pid_t **pids) +static void get_list_apps(pid_t *pids) { - size_t size = 0; - struct ltt_traceable_app *iter = NULL; - pid_t *p; - - if (traceable_app_count == 0) { - /* No dynamic allocation is done */ - goto end; - } - - p = malloc(sizeof(pid_t) * traceable_app_count); + int i = 0; + struct ltt_traceable_app *iter; /* TODO: Mutex needed to access this list */ cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { - p[size] = iter->pid; - size++; + pids[i] = iter->pid; + i++; } +} - *pids = p; +/* + * get_list_sessions + * + * List sessions and fill the data buffer. + */ +static void get_list_sessions(struct lttng_session *lt) +{ + int i = 0; + struct ltt_session *iter; + struct lttng_session lsess; -end: - return size; + /* 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.name, iter->name, sizeof(lsess.name)); + lsess.name[sizeof(lsess.name) - 1] = '\0'; + memcpy(<[i], &lsess, sizeof(lsess)); + i++; + /* Reset struct for next pass */ + memset(&lsess, 0, sizeof(lsess)); + } } /* @@ -437,10 +454,46 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi { llm->cmd_type = lsm->cmd_type; llm->pid = lsm->pid; - if (!uuid_is_null(lsm->session_id)) { - uuid_copy(llm->session_id, lsm->session_id); + + /* Manage uuid */ + if (lsm->session_id != NULL) { + strncpy(llm->session_id, lsm->session_id, UUID_STR_LEN); + } + + strncpy(llm->trace_name, lsm->trace_name, strlen(llm->trace_name)); +} + +/* + * setup_data_buffer + * + * Setup the outgoing data buffer for the response + * data allocating the right amount of memory. + * + * Return total size of the buffer pointed by buf. + */ +static int setup_data_buffer(char **buf, size_t s_data, struct lttcomm_lttng_msg *llm) +{ + int ret = 0; + size_t buf_size; + + buf_size = sizeof(struct lttcomm_lttng_msg) + s_data; + *buf = malloc(buf_size); + if (*buf == NULL) { + perror("malloc"); + ret = -1; + goto error; } - strncpy(llm->trace_name, lsm->trace_name, sizeof(llm->trace_name)); + + /* Setup lttcomm_lttng_msg data and copy + * it to the newly allocated buffer. + */ + llm->size_payload = s_data; + memcpy(*buf, llm, sizeof(struct lttcomm_lttng_msg)); + + return buf_size; + +error: + return ret; } /* @@ -455,6 +508,8 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { int ret; + int buf_size; + char *send_buf = NULL; struct lttcomm_lttng_msg llm; /* Copy common data to identify the response @@ -469,68 +524,88 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* Process by command type */ switch (lsm->cmd_type) { + case LTTNG_CREATE_SESSION: + { + uuid_t uuid; + ret = create_session(lsm->session_name, &uuid); + if (ret < 0) { + goto error; + } + + 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 send; + break; + } case UST_LIST_APPS: { - pid_t *pids; - llm.num_pckt = ust_list_apps(&pids); - if (llm.num_pckt == 0) { + /* Stop right now if no apps */ + if (traceable_app_count == 0) { ret = LTTCOMM_NO_APPS; goto error; } - /* Send all packets */ - while (llm.num_pckt != 0) { - llm.u.list_apps.pid = pids[traceable_app_count - llm.num_pckt]; - ret = send_unix_sock(sock, (void*) &llm, sizeof(llm)); - if (ret < 0) { - goto send_error; - } - llm.num_pckt--; + /* Setup data buffer and details for transmission */ + buf_size = setup_data_buffer(&send_buf, + sizeof(pid_t) * traceable_app_count, &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto error; } - /* Allocated array by ust_list_apps() */ - free(pids); + get_list_apps((pid_t *)(send_buf + sizeof(struct lttcomm_lttng_msg))); + + goto send; break; } case LTTNG_LIST_SESSIONS: { - struct ltt_session *iter = NULL; - - llm.num_pckt = session_count; - if (llm.num_pckt == 0) { + /* Stop right now if no session */ + if (session_count == 0) { ret = LTTCOMM_NO_SESS; goto error; } - cds_list_for_each_entry(iter, <t_session_list.head, list) { - uuid_unparse(iter->uuid, llm.u.list_sessions.uuid); - strncpy(llm.u.list_sessions.name, iter->name, - sizeof(llm.u.list_sessions.name)); - ret = send_unix_sock(sock, (void*) &llm, sizeof(llm)); - if (ret < 0) { - goto send_error; - } - llm.num_pckt--; + /* Setup data buffer and details for transmission */ + buf_size = setup_data_buffer(&send_buf, + (sizeof(struct lttng_session) * session_count), &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto error; } + get_list_sessions((struct lttng_session *)(send_buf + sizeof(struct lttcomm_lttng_msg))); + + goto send; break; } default: { /* Undefined command */ ret = LTTCOMM_UND; - break; + goto error; } } - return 0; +send: + ret = send_unix_sock(sock, send_buf, buf_size); + + if (send_buf != NULL) { + free(send_buf); + } -send_error: return ret; error: /* Notify client of error */ llm.ret_code = ret; + llm.size_payload = 0; send_unix_sock(sock, (void*) &llm, sizeof(llm)); return -1;