X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmain.c;h=e1d50974bfc2f3c220fd7cf219e6145b005f5ae4;hp=0d1a916c2b0f7e40abf5a0c15bc5b1cbf33b0166;hb=096102bd1f0665d96f75ad12410ea23189fbf861;hpb=10a8a2237343699e3923d87e24dbf2d7fe225377 diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 0d1a916c2..e1d50974b 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -38,19 +38,19 @@ #include #include -#include -#include +#include +#include +#include #include #include -#include #include "lttng-sessiond.h" #include "channel.h" -#include "compat/poll.h" #include "context.h" #include "event.h" #include "futex.h" #include "kernel.h" +#include "modprobe.h" #include "shm.h" #include "ust-ctl.h" #include "utils.h" @@ -98,18 +98,18 @@ static char *rundir; /* Consumer daemon specific control data */ static struct consumer_data kconsumer_data = { .type = LTTNG_CONSUMER_KERNEL, - .err_unix_sock_path = KCONSUMERD_ERR_SOCK_PATH, - .cmd_unix_sock_path = KCONSUMERD_CMD_SOCK_PATH, + .err_unix_sock_path = DEFAULT_KCONSUMERD_ERR_SOCK_PATH, + .cmd_unix_sock_path = DEFAULT_KCONSUMERD_CMD_SOCK_PATH, }; static struct consumer_data ustconsumer64_data = { .type = LTTNG_CONSUMER64_UST, - .err_unix_sock_path = USTCONSUMERD64_ERR_SOCK_PATH, - .cmd_unix_sock_path = USTCONSUMERD64_CMD_SOCK_PATH, + .err_unix_sock_path = DEFAULT_USTCONSUMERD64_ERR_SOCK_PATH, + .cmd_unix_sock_path = DEFAULT_USTCONSUMERD64_CMD_SOCK_PATH, }; static struct consumer_data ustconsumer32_data = { .type = LTTNG_CONSUMER32_UST, - .err_unix_sock_path = USTCONSUMERD32_ERR_SOCK_PATH, - .cmd_unix_sock_path = USTCONSUMERD32_CMD_SOCK_PATH, + .err_unix_sock_path = DEFAULT_USTCONSUMERD32_ERR_SOCK_PATH, + .cmd_unix_sock_path = DEFAULT_USTCONSUMERD32_CMD_SOCK_PATH, }; static int dispatch_thread_exit; @@ -269,41 +269,6 @@ static int check_thread_quit_pipe(int fd, uint32_t events) return 0; } -/* - * Remove modules in reverse load order. - */ -static int modprobe_remove_kernel_modules(void) -{ - int ret = 0, i; - char modprobe[256]; - - for (i = ARRAY_SIZE(kernel_modules_list) - 1; i >= 0; i--) { - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe -r -q %s", - kernel_modules_list[i].name); - if (ret < 0) { - perror("snprintf modprobe -r"); - goto error; - } - modprobe[sizeof(modprobe) - 1] = '\0'; - ret = system(modprobe); - if (ret == -1) { - ERR("Unable to launch modprobe -r for module %s", - kernel_modules_list[i].name); - } else if (kernel_modules_list[i].required - && WEXITSTATUS(ret) != 0) { - ERR("Unable to remove module %s", - kernel_modules_list[i].name); - } else { - DBG("Modprobe removal successful %s", - kernel_modules_list[i].name); - } - } - -error: - return ret; -} - /* * Return group ID of the tracing group or -1 if not found. */ @@ -456,7 +421,7 @@ static void cleanup(void) DBG2("Closing kernel fd"); close(kernel_tracer_fd); DBG("Unloading kernel modules"); - modprobe_remove_kernel_modules(); + modprobe_remove_lttng_all(); } close(thread_quit_pipe[0]); @@ -1702,147 +1667,64 @@ error: } /* - * modprobe_kernel_modules + * Check version of the lttng-modules. */ -static int modprobe_kernel_modules(void) +static int validate_lttng_modules_version(void) { - int ret = 0, i; - char modprobe[256]; - - for (i = 0; i < ARRAY_SIZE(kernel_modules_list); i++) { - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe %s%s", - kernel_modules_list[i].required ? "" : "-q ", - kernel_modules_list[i].name); - if (ret < 0) { - perror("snprintf modprobe"); - goto error; - } - modprobe[sizeof(modprobe) - 1] = '\0'; - ret = system(modprobe); - if (ret == -1) { - ERR("Unable to launch modprobe for module %s", - kernel_modules_list[i].name); - } else if (kernel_modules_list[i].required - && WEXITSTATUS(ret) != 0) { - ERR("Unable to load module %s", - kernel_modules_list[i].name); - } else { - DBG("Modprobe successfully %s", - kernel_modules_list[i].name); - } - } - -error: - return ret; + return kernel_validate_version(kernel_tracer_fd); } /* - * mount_debugfs + * Setup necessary data for kernel tracer action. */ -static int mount_debugfs(char *path) +static int init_kernel_tracer(void) { int ret; - char *type = "debugfs"; - - ret = run_as_mkdir_recursive(path, S_IRWXU | S_IRWXG, geteuid(), getegid()); - if (ret < 0) { - PERROR("Cannot create debugfs path"); - goto error; - } - ret = mount(type, path, type, 0, NULL); + /* Modprobe lttng kernel modules */ + ret = modprobe_lttng_control(); if (ret < 0) { - PERROR("Cannot mount debugfs"); goto error; } - DBG("Mounted debugfs successfully at %s", path); - -error: - return ret; -} - -/* - * Setup necessary data for kernel tracer action. - */ -static void init_kernel_tracer(void) -{ - int ret; - char *proc_mounts = "/proc/mounts"; - char line[256]; - char *debugfs_path = NULL, *lttng_path = NULL; - 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) { - perror("Cannot mount debugfs"); - goto error; - } + /* Open debugfs lttng */ + kernel_tracer_fd = open(module_proc_lttng, O_RDWR); + if (kernel_tracer_fd < 0) { + DBG("Failed to open %s", module_proc_lttng); + ret = -1; + goto error_open; } - /* Modprobe lttng kernel modules */ - ret = modprobe_kernel_modules(); + /* Validate kernel version */ + ret = validate_lttng_modules_version(); if (ret < 0) { - goto error; + goto error_version; } - /* Setup lttng kernel path */ - ret = asprintf(<tng_path, "%s/lttng", debugfs_path); + ret = modprobe_lttng_data(); 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) { - DBG("Failed to open %s", lttng_path); - goto error; + goto error_modules; } - free(lttng_path); - free(debugfs_path); DBG("Kernel tracer fd %d", kernel_tracer_fd); - return; + return 0; + +error_version: + modprobe_remove_lttng_control(); + close(kernel_tracer_fd); + kernel_tracer_fd = 0; + return LTTCOMM_KERN_VERSION; + +error_modules: + close(kernel_tracer_fd); + +error_open: + modprobe_remove_lttng_control(); error: - if (lttng_path) { - free(lttng_path); - } - if (debugfs_path) { - free(debugfs_path); - } WARN("No kernel tracer available"); kernel_tracer_fd = 0; - return; + return LTTCOMM_KERN_NA; } /* @@ -3278,9 +3160,8 @@ static int process_client_msg(struct command_ctx *cmd_ctx) /* Kernel tracer check */ if (kernel_tracer_fd == 0) { /* Basically, load kernel tracer modules */ - init_kernel_tracer(); - if (kernel_tracer_fd == 0) { - ret = LTTCOMM_KERN_NA; + ret = init_kernel_tracer(); + if (ret != 0) { goto error; } } @@ -4112,13 +3993,13 @@ static int set_consumer_sockets(struct consumer_data *consumer_data, switch (consumer_data->type) { case LTTNG_CONSUMER_KERNEL: - snprintf(path, PATH_MAX, KCONSUMERD_PATH, rundir); + snprintf(path, PATH_MAX, DEFAULT_KCONSUMERD_PATH, rundir); break; case LTTNG_CONSUMER64_UST: - snprintf(path, PATH_MAX, USTCONSUMERD64_PATH, rundir); + snprintf(path, PATH_MAX, DEFAULT_USTCONSUMERD64_PATH, rundir); break; case LTTNG_CONSUMER32_UST: - snprintf(path, PATH_MAX, USTCONSUMERD32_PATH, rundir); + snprintf(path, PATH_MAX, DEFAULT_USTCONSUMERD32_PATH, rundir); break; default: ERR("Consumer type unknown"); @@ -4169,14 +4050,14 @@ static void sighandler(int sig) { switch (sig) { case SIGPIPE: - DBG("SIGPIPE catched"); + DBG("SIGPIPE caugth"); return; case SIGINT: - DBG("SIGINT catched"); + DBG("SIGINT caugth"); stop_threads(); break; case SIGTERM: - DBG("SIGTERM catched"); + DBG("SIGTERM caugth"); stop_threads(); break; default: @@ -4278,7 +4159,7 @@ int main(int argc, char **argv) is_root = !getuid(); if (is_root) { - rundir = strdup(LTTNG_RUNDIR); + rundir = strdup(DEFAULT_LTTNG_RUNDIR); /* Create global run dir with root access */ ret = create_lttng_rundir(rundir); @@ -4304,9 +4185,9 @@ int main(int argc, char **argv) /* Setup kernel consumerd path */ snprintf(kconsumer_data.err_unix_sock_path, PATH_MAX, - KCONSUMERD_ERR_SOCK_PATH, rundir); + DEFAULT_KCONSUMERD_ERR_SOCK_PATH, rundir); snprintf(kconsumer_data.cmd_unix_sock_path, PATH_MAX, - KCONSUMERD_CMD_SOCK_PATH, rundir); + DEFAULT_KCONSUMERD_CMD_SOCK_PATH, rundir); DBG2("Kernel consumer err path: %s", kconsumer_data.err_unix_sock_path); @@ -4325,7 +4206,7 @@ int main(int argc, char **argv) * Create rundir from home path. This will create something like * $HOME/.lttng */ - ret = asprintf(&rundir, LTTNG_HOME_RUNDIR, home_path); + ret = asprintf(&rundir, DEFAULT_LTTNG_HOME_RUNDIR, home_path); if (ret < 0) { ret = -ENOMEM; goto error; @@ -4360,9 +4241,9 @@ int main(int argc, char **argv) /* 32 bits consumerd path setup */ snprintf(ustconsumer32_data.err_unix_sock_path, PATH_MAX, - USTCONSUMERD32_ERR_SOCK_PATH, rundir); + DEFAULT_USTCONSUMERD32_ERR_SOCK_PATH, rundir); snprintf(ustconsumer32_data.cmd_unix_sock_path, PATH_MAX, - USTCONSUMERD32_CMD_SOCK_PATH, rundir); + DEFAULT_USTCONSUMERD32_CMD_SOCK_PATH, rundir); DBG2("UST consumer 32 bits err path: %s", ustconsumer32_data.err_unix_sock_path); @@ -4371,9 +4252,9 @@ int main(int argc, char **argv) /* 64 bits consumerd path setup */ snprintf(ustconsumer64_data.err_unix_sock_path, PATH_MAX, - USTCONSUMERD64_ERR_SOCK_PATH, rundir); + DEFAULT_USTCONSUMERD64_ERR_SOCK_PATH, rundir); snprintf(ustconsumer64_data.cmd_unix_sock_path, PATH_MAX, - USTCONSUMERD64_CMD_SOCK_PATH, rundir); + DEFAULT_USTCONSUMERD64_CMD_SOCK_PATH, rundir); DBG2("UST consumer 64 bits err path: %s", ustconsumer64_data.err_unix_sock_path);