X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=73f80599c06b3491acedb298fd7e1d37d4cd569c;hb=a2fb29a51133de95720cc389121f403c21b25b8f;hp=5e99c7987ce59cb7122e6109d198e35d8399b196;hpb=273ea72ccbbffd1d6b9d5478923d30571d503a6c;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 5e99c7987..73f80599c 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -226,18 +226,18 @@ static int send_unix_sock(int sock, void *buf, size_t len) * * Free memory of a command context structure. */ -static void clean_command_ctx(struct command_ctx *cmd_ctx) +static void clean_command_ctx(struct command_ctx **cmd_ctx) { - DBG("Clean command context structure %p", cmd_ctx); - if (cmd_ctx) { - if (cmd_ctx->llm) { - free(cmd_ctx->llm); + DBG("Clean command context structure"); + if (*cmd_ctx) { + if ((*cmd_ctx)->llm) { + free((*cmd_ctx)->llm); } - if (cmd_ctx->lsm) { - free(cmd_ctx->lsm); + if ((*cmd_ctx)->lsm) { + free((*cmd_ctx)->lsm); } - free(cmd_ctx); - cmd_ctx = NULL; + free(*cmd_ctx); + *cmd_ctx = NULL; } } @@ -2081,7 +2081,7 @@ static void *thread_manage_clients(void *data) /* TODO: Inform client somehow of the fatal error. At this point, * ret < 0 means that a malloc failed (ENOMEM). */ /* Error detected but still accept command */ - clean_command_ctx(cmd_ctx); + clean_command_ctx(&cmd_ctx); continue; } @@ -2092,7 +2092,7 @@ static void *thread_manage_clients(void *data) ERR("Failed to send data back to client"); } - clean_command_ctx(cmd_ctx); + clean_command_ctx(&cmd_ctx); /* End of transmission */ close(sock); @@ -2109,7 +2109,7 @@ error: unlink(client_unix_sock_path); - clean_command_ctx(cmd_ctx); + clean_command_ctx(&cmd_ctx); return NULL; } @@ -2495,6 +2495,7 @@ static void set_ulimit(void) int ret; struct rlimit lim; + /* The kernel does not allowed an infinite limit for open files */ lim.rlim_cur = 65535; lim.rlim_max = 65535; @@ -2515,14 +2516,13 @@ int main(int argc, char **argv) /* Create thread quit pipe */ if (init_thread_quit_pipe() < 0) { - /* No goto error because nothing is initialized at this point */ - exit(EXIT_FAILURE); + goto exit; } /* Parse arguments */ progname = argv[0]; if ((ret = parse_args(argc, argv) < 0)) { - goto error; + goto exit; } /* Daemonize */ @@ -2530,7 +2530,7 @@ int main(int argc, char **argv) ret = daemon(0, 0); if (ret < 0) { perror("daemon"); - goto error; + goto exit; } } @@ -2540,7 +2540,7 @@ int main(int argc, char **argv) if (is_root) { ret = create_lttng_rundir(); if (ret < 0) { - goto error; + goto exit; } if (strlen(apps_unix_sock_path) == 0) { @@ -2552,23 +2552,12 @@ int main(int argc, char **argv) snprintf(client_unix_sock_path, PATH_MAX, DEFAULT_GLOBAL_CLIENT_UNIX_SOCK); } - - ret = set_kconsumerd_sockets(); - if (ret < 0) { - goto error; - } - - /* Setup kernel tracer */ - init_kernel_tracer(); - - /* Set ulimit for open files */ - set_ulimit(); } else { home_path = get_home_dir(); if (home_path == NULL) { /* TODO: Add --socket PATH option */ ERR("Can't get HOME directory for sockets creation."); - goto error; + goto exit; } if (strlen(apps_unix_sock_path) == 0) { @@ -2594,10 +2583,31 @@ int main(int argc, char **argv) if ((ret = check_existing_daemon()) == 0) { ERR("Already running daemon.\n"); /* - * We do not goto error because we must not - * cleanup() because a daemon is already running. + * We do not goto error because we must not cleanup() because a daemon + * is already running. */ - exit(EXIT_FAILURE); + goto exit; + } + + /* After this point, we can safely call cleanup() so goto error is used */ + + /* + * These actions must be executed as root. We do that *after* setting up + * the sockets path because we MUST make the check for another daemon using + * those paths *before* trying to set the kernel consumer sockets and init + * kernel tracer. + */ + if (is_root) { + ret = set_kconsumerd_sockets(); + if (ret < 0) { + goto error; + } + + /* Setup kernel tracer */ + init_kernel_tracer(); + + /* Set ulimit for open files */ + set_ulimit(); } if (set_signal_handler() < 0) { @@ -2664,5 +2674,7 @@ int main(int argc, char **argv) error: cleanup(); + +exit: exit(EXIT_FAILURE); }