#include "trace.h"
#include "traceable-app.h"
+/*
+ * TODO:
+ * teardown: signal SIGTERM handler -> write into pipe. Threads waits
+ * with epoll on pipe and on other pipes/sockets for commands. Main
+ * simply waits on pthread join.
+ */
+
/* Const values */
const char default_home_dir[] = DEFAULT_HOME_DIR;
const char default_tracing_group[] = DEFAULT_TRACING_GROUP;
int sock, ret;
/* TODO: Something more elegant is needed but fine for now */
+ /* FIXME: change all types to either uint8_t, uint32_t, uint64_t
+ * for 32-bit vs 64-bit compat processes. */
+ /* replicate in ust with version number */
struct {
int reg; /* 1:register, 0:unregister */
pid_t pid;
DBG("[thread] Manage apps started");
- /* Notify all applications to register */
- notify_apps(default_global_apps_pipe);
-
ret = lttcomm_listen_unix_sock(apps_sock);
if (ret < 0) {
goto error;
}
+ /* Notify all applications to register */
+ notify_apps(default_global_apps_pipe);
+
while (1) {
/* Blocking call, waiting for transmission */
sock = lttcomm_accept_unix_sock(apps_sock);
copy_common_data(&llh, lsm);
/* Check command that needs a session */
- if (lsm->cmd_type != LTTNG_CREATE_SESSION &&
- lsm->cmd_type != LTTNG_LIST_SESSIONS &&
- lsm->cmd_type != UST_LIST_APPS)
- {
+ switch (lsm->cmd_type) {
+ case LTTNG_CREATE_SESSION:
+ case LTTNG_LIST_SESSIONS:
+ case UST_LIST_APPS:
+ break;
+ default:
current_session = find_session_by_uuid(lsm->session_id);
if (current_session == NULL) {
ret = LTTCOMM_SELECT_SESS;
goto end;
}
+ break;
}
/* Default return code.
/* Process by command type */
switch (lsm->cmd_type) {
- case LTTNG_CREATE_SESSION:
- {
- ret = create_session(lsm->session_name, &llh.session_id);
- if (ret < 0) {
- if (ret == -1) {
- ret = LTTCOMM_EXIST_SESS;
- } else {
- ret = LTTCOMM_FATAL;
- }
- goto end;
- }
-
- buf_size = setup_data_buffer(&send_buf, 0, &llh);
- if (buf_size < 0) {
+ case LTTNG_CREATE_SESSION:
+ {
+ ret = create_session(lsm->session_name, &llh.session_id);
+ if (ret < 0) {
+ if (ret == -1) {
+ ret = LTTCOMM_EXIST_SESS;
+ } else {
ret = LTTCOMM_FATAL;
- goto end;
}
-
- break;
+ goto end;
}
- 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 llh struct. */
+ buf_size = setup_data_buffer(&send_buf, 0, &llh);
+ if (buf_size < 0) {
+ ret = LTTCOMM_FATAL;
goto end;
}
- case LTTNG_LIST_TRACES:
- {
- unsigned int trace_count = get_trace_count_per_session(current_session);
- if (trace_count == 0) {
- ret = LTTCOMM_NO_TRACE;
- goto end;
- }
+ break;
+ }
+ case LTTNG_DESTROY_SESSION:
+ {
+ ret = destroy_session(&lsm->session_id);
+ if (ret < 0) {
+ ret = LTTCOMM_NO_SESS;
+ } else {
+ ret = LTTCOMM_OK;
+ }
- buf_size = setup_data_buffer(&send_buf,
- sizeof(struct lttng_trace) * trace_count, &llh);
- if (buf_size < 0) {
- ret = LTTCOMM_FATAL;
- goto end;
- }
+ /* No auxiliary data so only send the llh struct. */
+ goto end;
+ }
+ case LTTNG_LIST_TRACES:
+ {
+ unsigned int trace_count = get_trace_count_per_session(current_session);
- get_traces_per_session(current_session, (struct lttng_trace *)(send_buf + header_size));
- break;
+ if (trace_count == 0) {
+ ret = LTTCOMM_NO_TRACE;
+ goto end;
}
- case UST_CREATE_TRACE:
- {
- ret = ust_create_trace(ust_sock, lsm->pid);
- if (ret < 0) {
- /* If -1 is returned from ust_create_trace, malloc
- * failed so it's pretty much a fatal error.
- */
- ret = LTTCOMM_FATAL;
- goto end;
- }
- /* No auxiliary data so only send the llh struct. */
+ buf_size = setup_data_buffer(&send_buf,
+ sizeof(struct lttng_trace) * trace_count, &llh);
+ if (buf_size < 0) {
+ ret = LTTCOMM_FATAL;
goto end;
}
- case UST_LIST_APPS:
- {
- unsigned int app_count = get_app_count();
- /* Stop right now if no apps */
- if (app_count == 0) {
- ret = LTTCOMM_NO_APPS;
- goto end;
- }
-
- /* Setup data buffer and details for transmission */
- buf_size = setup_data_buffer(&send_buf,
- sizeof(pid_t) * app_count, &llh);
- if (buf_size < 0) {
- ret = LTTCOMM_FATAL;
- goto end;
- }
- get_app_list_pids((pid_t *)(send_buf + header_size));
-
- break;
+ get_traces_per_session(current_session, (struct lttng_trace *)(send_buf + header_size));
+ break;
+ }
+ case UST_CREATE_TRACE:
+ {
+ ret = ust_create_trace(ust_sock, lsm->pid);
+ if (ret < 0) {
+ /* If -1 is returned from ust_create_trace, malloc
+ * failed so it's pretty much a fatal error.
+ */
+ ret = LTTCOMM_FATAL;
+ goto end;
}
- case UST_START_TRACE:
- {
- ret = ust_start_trace(ust_sock, lsm->pid);
- /* No auxiliary data so only send the llh struct. */
+ /* No auxiliary data so only send the llh struct. */
+ goto end;
+ }
+ case UST_LIST_APPS:
+ {
+ unsigned int app_count = get_app_count();
+ /* Stop right now if no apps */
+ if (app_count == 0) {
+ ret = LTTCOMM_NO_APPS;
goto end;
}
- case UST_STOP_TRACE:
- {
- ret = ust_stop_trace(ust_sock, lsm->pid);
- /* No auxiliary data so only send the llh struct. */
+ /* Setup data buffer and details for transmission */
+ buf_size = setup_data_buffer(&send_buf,
+ sizeof(pid_t) * app_count, &llh);
+ if (buf_size < 0) {
+ ret = LTTCOMM_FATAL;
goto end;
}
- case LTTNG_LIST_SESSIONS:
- {
- unsigned int session_count = get_session_count();
- /* Stop right now if no session */
- if (session_count == 0) {
- ret = LTTCOMM_NO_SESS;
- goto end;
- }
- /* Setup data buffer and details for transmission */
- buf_size = setup_data_buffer(&send_buf,
- (sizeof(struct lttng_session) * session_count), &llh);
- if (buf_size < 0) {
- ret = LTTCOMM_FATAL;
- goto end;
- }
+ get_app_list_pids((pid_t *)(send_buf + header_size));
+
+ break;
+ }
+ case UST_START_TRACE:
+ {
+ ret = ust_start_trace(ust_sock, lsm->pid);
- get_lttng_session((struct lttng_session *)(send_buf + header_size));
+ /* No auxiliary data so only send the llh struct. */
+ goto end;
+ }
+ case UST_STOP_TRACE:
+ {
+ ret = ust_stop_trace(ust_sock, lsm->pid);
- break;
+ /* No auxiliary data so only send the llh struct. */
+ goto end;
+ }
+ case LTTNG_LIST_SESSIONS:
+ {
+ unsigned int session_count = get_session_count();
+ /* Stop right now if no session */
+ if (session_count == 0) {
+ ret = LTTCOMM_NO_SESS;
+ goto end;
}
- default:
- {
- /* Undefined command */
- ret = LTTCOMM_UND;
+
+ /* Setup data buffer and details for transmission */
+ buf_size = setup_data_buffer(&send_buf,
+ (sizeof(struct lttng_session) * session_count), &llh);
+ if (buf_size < 0) {
+ ret = LTTCOMM_FATAL;
goto end;
}
+
+ get_lttng_session((struct lttng_session *)(send_buf + header_size));
+
+ break;
+ }
+ default:
+ /* Undefined command */
+ ret = LTTCOMM_UND;
+ goto end;
}
ret = send_unix_sock(sock, send_buf, buf_size);
/*
* set_permissions
*
- * Set the tracing group gid onto the client socket.
+ * Set the tracing group gid onto the client socket.
+ *
+ * Race window between mkdir and chown is OK because we are going from
+ * less permissive (root.root) to more permissive (root.tracing).
*/
static int set_permissions(void)
{
/* We do not goto error because we must not
* cleanup() because a daemon is already running.
*/
- return EXIT_FAILURE;
+ exit(EXIT_FAILURE);
}
if (set_signal_handler() < 0) {
}
cleanup();
- return 0;
+ exit(EXIT_SUCCESS);
error:
cleanup();
-
- return EXIT_FAILURE;
+ exit(EXIT_FAILURE);
}
*/
if (opt_trace_kernel) {
ERR("Not implemented yet");
+ ret = -ENOSYS;
goto end;
}
end:
ERR("%s", lttng_get_readable_code(ret));
- return ret;
-
-error:
+error: /* fall through */
return ret;
}
MSG("Spawning session daemon");
pid = fork();
if (pid == 0) {
- /* Spawn session daemon and tell
+ /*
+ * Spawn session daemon and tell
* it to signal us when ready.
*/
- ret = execlp(pathname, "ltt-sessiond", "--sig-parent", "--quiet", NULL);
- if (ret < 0) {
- if (errno == ENOENT) {
- ERR("No session daemon found. Use --sessiond-path.");
- } else {
- perror("execlp");
- }
- kill(getppid(), SIGTERM);
- exit(EXIT_FAILURE);
+ execlp(pathname, "ltt-sessiond", "--sig-parent", "--quiet", NULL);
+ /* execlp only returns if error happened */
+ if (errno == ENOENT) {
+ ERR("No session daemon found. Use --sessiond-path.");
+ } else {
+ perror("execlp");
}
- exit(EXIT_SUCCESS);
+ kill(getppid(), SIGTERM); /* unpause parent */
+ exit(EXIT_FAILURE);
} else if (pid > 0) {
/* Wait for ltt-sessiond to start */
pause();
static int check_ltt_sessiond(void)
{
int ret;
- char *pathname = NULL;
+ char *pathname = NULL, *alloc_pathname = NULL;
ret = lttng_check_session_daemon();
if (ret < 0) {
} else {
/* Try LTTNG_SESSIOND_PATH env variable */
pathname = getenv(LTTNG_SESSIOND_PATH_ENV);
- if (pathname != NULL) {
- /* strdup here in order to make the free()
- * not fail later on.
- */
- pathname = strdup(pathname);
- }
}
/* Let's rock and roll */
if (pathname == NULL) {
- ret = asprintf(&pathname, "ltt-sessiond");
+ ret = asprintf(&alloc_pathname, "ltt-sessiond");
if (ret < 0) {
goto end;
}
+ pathname = alloc_pathname;
}
ret = spawn_sessiond(pathname);
- free(pathname);
+ free(alloc_pathname);
if (ret < 0) {
ERR("Problem occurs when starting %s", pathname);
goto end;