X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fltt-sessiond.c;h=eee4cc84fb1729cc02afc36a3f04d23251bc7d3d;hp=fb197d43bc60c37228526ba6b72a3b5ff5abc1e2;hb=87378cf56f08f23cd6715a923ba10d98343902d7;hpb=ca95a21633510288dbb18a3cd8825195e5cbb4f3 diff --git a/ltt-sessiond/ltt-sessiond.c b/ltt-sessiond/ltt-sessiond.c index fb197d43b..eee4cc84f 100644 --- a/ltt-sessiond/ltt-sessiond.c +++ b/ltt-sessiond/ltt-sessiond.c @@ -50,27 +50,29 @@ 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 int setup_data_buffer(char **buf, size_t size, struct lttcomm_lttng_msg *llm); /* Command function */ -static void get_list_apps(void *buf); -static void get_list_sessions(void *buf); +static void get_list_apps(pid_t *pids); +static void get_list_sessions(struct lttng_session *lt); -static void *thread_manage_clients(void *); -static void *thread_manage_apps(void *); +static void *thread_manage_clients(void *data); +static void *thread_manage_apps(void *data); -static int create_session(const char*, uuid_t *); -static void destroy_session(uuid_t); +static int create_session(char *name, uuid_t *session_id); +static int destroy_session(uuid_t *uuid); -static struct ltt_session *find_session(uuid_t); +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; @@ -215,7 +217,7 @@ static void *thread_manage_clients(void *data) * request of the client. */ ret = lttcomm_recv_unix_sock(sock, &lsm, sizeof(lsm)); - if (ret < 0) { + if (ret <= 0) { continue; } @@ -301,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)) { @@ -315,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; } @@ -329,30 +361,35 @@ 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; } /* * 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; @@ -369,7 +406,7 @@ static int create_session(const 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; } } @@ -405,16 +442,15 @@ error: * List traceable user-space application and fill an * array of pids. */ -static void get_list_apps(void *buf) +static void get_list_apps(pid_t *pids) { - size_t index = 0; - struct ltt_traceable_app *iter = NULL; - pid_t *pids = (pid_t *) buf; + 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) { - pids[index] = iter->pid; - index++; + pids[i] = iter->pid; + i++; } } @@ -423,20 +459,21 @@ static void get_list_apps(void *buf) * * List sessions and fill the data buffer. */ -static void get_list_sessions(void *buf) +static void get_list_sessions(struct lttng_session *lt) { int i = 0; - struct ltt_session *iter = NULL; + struct ltt_session *iter; struct lttng_session lsess; - struct lttng_session *data = (struct lttng_session *) buf; /* 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)); - memcpy(data + (i * sizeof(struct lttng_session)), &lsess, sizeof(lsess)); + lsess.name[sizeof(lsess.name) - 1] = '\0'; + memcpy(<[i], &lsess, sizeof(lsess)); i++; /* Reset struct for next pass */ memset(&lsess, 0, sizeof(lsess)); @@ -452,10 +489,14 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi { llm->cmd_type = lsm->cmd_type; llm->pid = lsm->pid; + + /* Manage uuid */ if (!uuid_is_null(lsm->session_id)) { uuid_copy(llm->session_id, lsm->session_id); } - strncpy(llm->trace_name, lsm->trace_name, sizeof(llm->trace_name)); + + strncpy(llm->trace_name, lsm->trace_name, strlen(llm->trace_name)); + llm->trace_name[strlen(llm->trace_name) - 1] = '\0'; } /* @@ -466,15 +507,14 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi * * Return total size of the buffer pointed by buf. */ -static int setup_data_buffer(void **buf, size_t s_data, struct lttcomm_lttng_msg *llm) +static int setup_data_buffer(char **buf, size_t s_data, struct lttcomm_lttng_msg *llm) { int ret = 0; - void *new_buf; size_t buf_size; buf_size = sizeof(struct lttcomm_lttng_msg) + s_data; - new_buf = malloc(buf_size); - if (new_buf == NULL) { + *buf = malloc(buf_size); + if (*buf == NULL) { perror("malloc"); ret = -1; goto error; @@ -484,9 +524,7 @@ static int setup_data_buffer(void **buf, size_t s_data, struct lttcomm_lttng_msg * it to the newly allocated buffer. */ llm->size_payload = s_data; - memcpy(new_buf, llm, sizeof(struct lttcomm_lttng_msg)); - - *buf = new_buf; + memcpy(*buf, llm, sizeof(struct lttcomm_lttng_msg)); return buf_size; @@ -506,9 +544,9 @@ error: static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { int ret; - struct lttcomm_lttng_msg llm; - void *send_buf = NULL; int buf_size; + char *send_buf = NULL; + struct lttcomm_lttng_msg llm; /* Copy common data to identify the response * on the lttng client side. @@ -522,12 +560,39 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) /* Process by command type */ switch (lsm->cmd_type) { + case LTTNG_CREATE_SESSION: + { + ret = create_session(lsm->session_name, &llm.session_id); + if (ret < 0) { + goto end; + } + + buf_size = setup_data_buffer(&send_buf, 0, &llm); + if (buf_size < 0) { + ret = LTTCOMM_FATAL; + goto end; + } + + 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 */ @@ -535,15 +600,10 @@ 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(send_buf + sizeof(struct lttcomm_lttng_msg)); - - ret = send_unix_sock(sock, send_buf, buf_size); - if (ret < 0) { - goto send_error; - } + get_list_apps((pid_t *)(send_buf + sizeof(struct lttcomm_lttng_msg))); break; } @@ -552,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 */ @@ -560,15 +620,10 @@ 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(send_buf + sizeof(struct lttcomm_lttng_msg)); - - ret = send_unix_sock(sock, send_buf, buf_size); - if (ret < 0) { - goto send_error; - } + get_list_sessions((struct lttng_session *)(send_buf + sizeof(struct lttcomm_lttng_msg))); break; } @@ -576,26 +631,25 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) { /* Undefined command */ ret = LTTCOMM_UND; - goto error; + goto end; } } + ret = send_unix_sock(sock, send_buf, buf_size); + if (send_buf != NULL) { free(send_buf); } - return 0; - -send_error: 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; } /* @@ -843,6 +897,7 @@ static void sighandler(int sig) { switch (sig) { case SIGPIPE: + return; case SIGINT: case SIGTERM: cleanup();