X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=0effeb1f5ab51a0c91973505c7efd9629dee5a3c;hp=92e41b1c6aff91b1573843079cfd3420b38dc275;hb=2b1173d8cb43cb5d7c9ce3772dbdbef3436c407e;hpb=b9f1dd6997ea64db8c140c617d2a74cf90767e3b diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 92e41b1c6..0effeb1f5 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include "traceable-app.h" #include "lttng-kconsumerd.h" #include "libustctl.h" +#include "utils.h" /* * TODO: @@ -282,12 +284,10 @@ static int create_trace_dir(struct ltt_kernel_session *session) /* Create all channel directories */ cds_list_for_each_entry(chan, &session->channel_list.head, list) { DBG("Creating trace directory at %s", chan->pathname); - // TODO: recursive create dir - ret = mkdir(chan->pathname, S_IRWXU | S_IRWXG ); + ret = mkdir_recursive(chan->pathname, S_IRWXU | S_IRWXG ); if (ret < 0) { if (ret != EEXIST) { - perror("mkdir trace path"); - ret = -errno; + ERR("Trace directory creation error"); goto error; } } @@ -581,7 +581,7 @@ static pid_t spawn_kconsumerd(void) /* * Exec kconsumerd. */ - execlp("kconsumerd", "kconsumerd", "--verbose", NULL); + execlp("ltt-kconsumerd", "ltt-kconsumerd", "--verbose", NULL); if (errno != 0) { perror("kernel start consumer exec"); } @@ -642,6 +642,58 @@ error: return ret; } +/* + * modprobe_kernel_modules + */ +static int modprobe_kernel_modules(void) +{ + int ret = 0, i = 0; + char modprobe[256]; + + while (kernel_modules_list[i] != NULL) { + ret = snprintf(modprobe, sizeof(modprobe), "/sbin/modprobe %s", + kernel_modules_list[i]); + if (ret < 0) { + perror("snprintf modprobe"); + goto error; + } + ret = system(modprobe); + if (ret < 0) { + ERR("Unable to load module %s", kernel_modules_list[i]); + } + DBG("Modprobe successfully %s", kernel_modules_list[i]); + i++; + } + +error: + return ret; +} + +/* + * mount_debugfs + */ +static int mount_debugfs(char *path) +{ + int ret; + char *type = "debugfs"; + + ret = mkdir_recursive(path, S_IRWXU | S_IRWXG); + if (ret < 0) { + goto error; + } + + ret = mount(type, path, type, 0, NULL); + if (ret < 0) { + perror("mount debugfs"); + goto error; + } + + DBG("Mounted debugfs successfully at %s", path); + +error: + return ret; +} + /* * init_kernel_tracer * @@ -649,14 +701,80 @@ error: */ static void init_kernel_tracer(void) { - /* Set the global kernel tracer fd */ - kernel_tracer_fd = open(DEFAULT_KERNEL_TRACER_PATH, O_RDWR); + int ret; + char *proc_mounts = "/proc/mounts"; + char line[256]; + char *debugfs_path = NULL, *lttng_path; + FILE *fp; + + /* Detect debugfs */ + fp = fopen(proc_mounts, "r"); + if (fp == NULL) { + ERR("Unable to probe %s", proc_mounts); + goto error; + } + + while (fgets(line, sizeof(line), fp) != NULL) { + if (strstr(line, "debugfs") != NULL) { + /* Remove first string */ + strtok(line, " "); + /* Dup string here so we can reuse line later on */ + debugfs_path = strdup(strtok(NULL, " ")); + DBG("Got debugfs path : %s", debugfs_path); + break; + } + } + + fclose(fp); + + /* Mount debugfs if needded */ + if (debugfs_path == NULL) { + ret = asprintf(&debugfs_path, "/mnt/debugfs"); + if (ret < 0) { + perror("asprintf debugfs path"); + goto error; + } + ret = mount_debugfs(debugfs_path); + if (ret < 0) { + goto error; + } + } + + /* Modprobe lttng kernel modules */ + ret = modprobe_kernel_modules(); + if (ret < 0) { + goto error; + } + + /* Setup lttng kernel path */ + ret = asprintf(<tng_path, "%s/lttng", debugfs_path); + if (ret < 0) { + perror("asprintf lttng path"); + goto error; + } + + /* Open debugfs lttng */ + kernel_tracer_fd = open(lttng_path, O_RDWR); if (kernel_tracer_fd < 0) { - WARN("No kernel tracer available"); - kernel_tracer_fd = 0; + DBG("Failed to open %s", lttng_path); + goto error; } + free(lttng_path); + free(debugfs_path); DBG("Kernel tracer fd %d", kernel_tracer_fd); + return; + +error: + if (lttng_path) { + free(lttng_path); + } + if (debugfs_path) { + free(debugfs_path); + } + WARN("No kernel tracer available"); + kernel_tracer_fd = 0; + return; } /* @@ -720,7 +838,7 @@ static struct lttng_channel *init_default_channel(void) chan->attr.num_subbuf = DEFAULT_CHANNEL_SUBBUF_NUM; chan->attr.switch_timer_interval = DEFAULT_CHANNEL_SWITCH_TIMER; chan->attr.read_timer_interval = DEFAULT_CHANNEL_READ_TIMER; - chan->attr.output = DEFAULT_CHANNEL_OUTPUT; + chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; error: return chan; @@ -752,7 +870,7 @@ static int create_kernel_session(struct ltt_session *session) DBG("Creating default kernel channel %s", DEFAULT_CHANNEL_NAME); - ret = kernel_create_channel(session->kernel_session, chan); + ret = kernel_create_channel(session->kernel_session, chan, session->path); if (ret < 0) { ret = LTTCOMM_KERN_CHAN_FAIL; goto error; @@ -944,7 +1062,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) DBG("Creating kernel channel"); ret = kernel_create_channel(cmd_ctx->session->kernel_session, - &cmd_ctx->lsm->u.channel.chan); + &cmd_ctx->lsm->u.channel.chan, cmd_ctx->session->path); if (ret < 0) { ret = LTTCOMM_KERN_CHAN_FAIL; goto error; @@ -1226,7 +1344,8 @@ static int process_client_msg(struct command_ctx *cmd_ctx) if (cmd_ctx->session->kernel_session != NULL) { if (cmd_ctx->session->kernel_session->metadata == NULL) { DBG("Open kernel metadata"); - ret = kernel_open_metadata(cmd_ctx->session->kernel_session); + ret = kernel_open_metadata(cmd_ctx->session->kernel_session, + cmd_ctx->session->path); if (ret < 0) { ret = LTTCOMM_KERN_META_FAIL; goto error; @@ -1755,32 +1874,13 @@ static int check_existing_daemon() return ret; } -/* - * get_home_dir - * - * Return pointer to home directory path using - * the env variable HOME. - * - * Default : /tmp - */ -static const char *get_home_dir(void) -{ - const char *home_path; - - if ((home_path = (const char *) getenv("HOME")) == NULL) { - home_path = default_home_dir; - } - - return home_path; -} - /* * set_permissions * * 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). + * more permissive (root.root) to les permissive (root.tracing). */ static int set_permissions(void) { @@ -1793,8 +1893,13 @@ static int set_permissions(void) (grp = getgrnam(default_tracing_group)); if (grp == NULL) { - ERR("Missing tracing group. Aborting execution.\n"); - ret = -1; + if (is_root) { + WARN("No tracing group detected"); + ret = 0; + } else { + ERR("Missing tracing group. Aborting execution."); + ret = -1; + } goto end; } @@ -1989,6 +2094,7 @@ int main(int argc, char **argv) { int ret = 0; void *status; + const char *home_path; /* Parse arguments */ progname = argv[0]; @@ -2008,7 +2114,6 @@ int main(int argc, char **argv) /* Check if daemon is UID = 0 */ is_root = !getuid(); - /* Set all sockets path */ if (is_root) { ret = create_lttng_rundir(); if (ret < 0) { @@ -2036,15 +2141,22 @@ int main(int argc, char **argv) /* Set ulimit for open files */ set_ulimit(); } else { + home_path = get_home_dir(); + if (home_path == NULL) { + ERR("Can't get HOME directory for sockets creation.\n \ + Please specify --socket PATH."); + goto error; + } + if (strlen(apps_unix_sock_path) == 0) { snprintf(apps_unix_sock_path, PATH_MAX, - DEFAULT_HOME_APPS_UNIX_SOCK, get_home_dir()); + DEFAULT_HOME_APPS_UNIX_SOCK, home_path); } /* Set the cli tool unix socket path */ if (strlen(client_unix_sock_path) == 0) { snprintf(client_unix_sock_path, PATH_MAX, - DEFAULT_HOME_CLIENT_UNIX_SOCK, get_home_dir()); + DEFAULT_HOME_CLIENT_UNIX_SOCK, home_path); } }