X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng-sessiond%2Futils.c;h=22a07ffaefd4174d7e2bb2cad1878eefd78d66b4;hp=489b61af8e1b744c5aac3117fb5b85a0b05cb732;hb=60b6c79cedc1023732ff0935aa85b5d0d1c2bcbf;hpb=fedf5c6b82a7bc13c358ab5b02a204631e3f94e1 diff --git a/lttng-sessiond/utils.c b/lttng-sessiond/utils.c index 489b61af8..22a07ffae 100644 --- a/lttng-sessiond/utils.c +++ b/lttng-sessiond/utils.c @@ -22,9 +22,6 @@ #include #include #include -#include -#include -#include #include #include @@ -55,121 +52,3 @@ const char *get_home_dir(void) { return ((const char *) getenv("HOME")); } - -/* - * Create recursively directory using the FULL path. - */ -static -int _mkdir_recursive(const char *path, mode_t mode, uid_t uid, gid_t gid) -{ - int ret; - char *p, tmp[PATH_MAX]; - size_t len; - mode_t old_umask; - - ret = snprintf(tmp, sizeof(tmp), "%s", path); - if (ret < 0) { - PERROR("snprintf mkdir"); - goto error; - } - - len = ret; - if (tmp[len - 1] == '/') { - tmp[len - 1] = 0; - } - - old_umask = umask(0); - for (p = tmp + 1; *p; p++) { - if (*p == '/') { - *p = 0; - ret = mkdir(tmp, mode); - if (ret < 0) { - if (!(errno == EEXIST)) { - PERROR("mkdir recursive"); - ret = -errno; - goto umask_error; - } - } - *p = '/'; - } - } - - ret = mkdir(tmp, mode); - if (ret < 0) { - if (!(errno == EEXIST)) { - PERROR("mkdir recursive last piece"); - ret = -errno; - } else { - ret = 0; - } - } - -umask_error: - umask(old_umask); -error: - return ret; -} - -static -int run_as(int (*cmd)(const char *path, mode_t mode, uid_t uid, gid_t gid), - const char *path, mode_t mode, uid_t uid, gid_t gid) -{ - int ret = 0; - pid_t pid; - - /* - * If we are non-root, we can only deal with our own uid. - */ - if (geteuid() != 0) { - if (uid != geteuid()) { - ERR("Client (%d)/Server (%d) UID mismatch (and sessiond is not root)", - uid, geteuid()); - return -EPERM; - } - return (*cmd)(path, mode, uid, gid); - } - - pid = fork(); - if (pid > 0) { - int status; - - /* - * Parent: wait for child to return, in which case the - * shared memory map will have been created. - */ - pid = wait(&status); - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { - ret = -1; - goto end; - } - goto end; - } else if (pid == 0) { - /* Child */ - setegid(gid); - if (ret < 0) { - perror("setegid"); - exit(EXIT_FAILURE); - } - ret = seteuid(uid); - if (ret < 0) { - perror("seteuid"); - exit(EXIT_FAILURE); - } - ret = (*cmd)(path, mode, uid, gid); - if (!ret) - exit(EXIT_SUCCESS); - else - exit(EXIT_FAILURE); - } else { - return -1; - } -end: - return ret; -} - -int mkdir_recursive(const char *path, mode_t mode, uid_t uid, gid_t gid) -{ - DBG3("mkdir() recursive %s with mode %d for uid %d and gid %d", - path, mode, uid, gid); - return run_as(_mkdir_recursive, path, mode, uid, gid); -}