X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fdirectory-handle.cpp;fp=src%2Fcommon%2Fcompat%2Fdirectory-handle.cpp;h=782c65b133d3ed94c1f138b74b80c4d5464477c1;hp=cd4bf1769a739c189576716096304dea956aa70a;hb=28ab034a2c3582d07d3423d2d746731f87d3969f;hpb=52e345b9ac912d033c2a2c25a170a01cf209839d diff --git a/src/common/compat/directory-handle.cpp b/src/common/compat/directory-handle.cpp index cd4bf1769..782c65b13 100644 --- a/src/common/compat/directory-handle.cpp +++ b/src/common/compat/directory-handle.cpp @@ -6,76 +6,77 @@ */ #include +#include +#include #include #include #include -#include + #include -#include -#include -#include +#include #include +#include +#include #include -#include /* * This compatibility layer shares a common "base" that is implemented * in terms of an internal API. This file contains two implementations * of the internal API below. */ -static -int lttng_directory_handle_mkdir( - const struct lttng_directory_handle *handle, - const char *path, mode_t mode); -static -int _run_as_mkdir(const struct lttng_directory_handle *handle, const char *path, - mode_t mode, uid_t uid, gid_t gid); -static -int _run_as_mkdir_recursive(const struct lttng_directory_handle *handle, - const char *path, mode_t mode, uid_t uid, gid_t gid); -static -int lttng_directory_handle_open(const struct lttng_directory_handle *handle, - const char *filename, int flags, mode_t mode); -static -int _run_as_open(const struct lttng_directory_handle *handle, - const char *filename, - int flags, mode_t mode, uid_t uid, gid_t gid); -static -int lttng_directory_handle_unlink( - const struct lttng_directory_handle *handle, - const char *filename); -static -int _run_as_unlink(const struct lttng_directory_handle *handle, - const char *filename, uid_t uid, gid_t gid); -static -int _lttng_directory_handle_rename( - const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name); -static -int _run_as_rename(const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name, uid_t uid, gid_t gid); -static -DIR *lttng_directory_handle_opendir(const struct lttng_directory_handle *handle, - const char *path); -static -int lttng_directory_handle_rmdir( - const struct lttng_directory_handle *handle, const char *name); -static -int _run_as_rmdir(const struct lttng_directory_handle *handle, - const char *name, uid_t uid, gid_t gid); -static -int _run_as_rmdir_recursive( - const struct lttng_directory_handle *handle, const char *name, - uid_t uid, gid_t gid, int flags); -static -void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle); -static -void lttng_directory_handle_release(struct urcu_ref *ref); +static int lttng_directory_handle_mkdir(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode); +static int _run_as_mkdir(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode, + uid_t uid, + gid_t gid); +static int _run_as_mkdir_recursive(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode, + uid_t uid, + gid_t gid); +static int lttng_directory_handle_open(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode); +static int _run_as_open(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode, + uid_t uid, + gid_t gid); +static int lttng_directory_handle_unlink(const struct lttng_directory_handle *handle, + const char *filename); +static int _run_as_unlink(const struct lttng_directory_handle *handle, + const char *filename, + uid_t uid, + gid_t gid); +static int _lttng_directory_handle_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name); +static int _run_as_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name, + uid_t uid, + gid_t gid); +static DIR *lttng_directory_handle_opendir(const struct lttng_directory_handle *handle, + const char *path); +static int lttng_directory_handle_rmdir(const struct lttng_directory_handle *handle, + const char *name); +static int +_run_as_rmdir(const struct lttng_directory_handle *handle, const char *name, uid_t uid, gid_t gid); +static int _run_as_rmdir_recursive(const struct lttng_directory_handle *handle, + const char *name, + uid_t uid, + gid_t gid, + int flags); +static void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle); +static void lttng_directory_handle_release(struct urcu_ref *ref); #ifdef HAVE_DIRFD @@ -101,16 +102,16 @@ void lttng_directory_handle_release(struct urcu_ref *ref); struct lttng_directory_handle *lttng_directory_handle_create(const char *path) { - lttng_directory_handle cwd_handle {}; + lttng_directory_handle cwd_handle{}; cwd_handle.dirfd = AT_FDCWD; /* Open a handle to the CWD if NULL is passed. */ return lttng_directory_handle_create_from_handle(path, &cwd_handle); } -struct lttng_directory_handle *lttng_directory_handle_create_from_handle( - const char *path, - const struct lttng_directory_handle *ref_handle) +struct lttng_directory_handle * +lttng_directory_handle_create_from_handle(const char *path, + const struct lttng_directory_handle *ref_handle) { int dirfd; struct lttng_directory_handle *handle = NULL; @@ -143,8 +144,7 @@ error_close: return NULL; } -struct lttng_directory_handle *lttng_directory_handle_create_from_dirfd( - int dirfd) +struct lttng_directory_handle *lttng_directory_handle_create_from_dirfd(int dirfd) { int ret; struct lttng_directory_handle *handle = zmalloc(); @@ -171,12 +171,11 @@ end: return handle; } -static -void lttng_directory_handle_release(struct urcu_ref *ref) +static void lttng_directory_handle_release(struct urcu_ref *ref) { int ret; struct lttng_directory_handle *handle = - lttng::utils::container_of(ref, <tng_directory_handle::ref); + lttng::utils::container_of(ref, <tng_directory_handle::ref); if (handle->destroy_cb) { handle->destroy_cb(handle, handle->destroy_cb_data); @@ -194,8 +193,8 @@ end: free(handle); } -struct lttng_directory_handle *lttng_directory_handle_copy( - const struct lttng_directory_handle *handle) +struct lttng_directory_handle * +lttng_directory_handle_copy(const struct lttng_directory_handle *handle) { struct lttng_directory_handle *new_handle = NULL; @@ -208,8 +207,7 @@ struct lttng_directory_handle *lttng_directory_handle_copy( PERROR("Failed to duplicate directory file descriptor of directory handle"); goto end; } - new_handle = lttng_directory_handle_create_from_dirfd( - new_dirfd); + new_handle = lttng_directory_handle_create_from_dirfd(new_dirfd); if (!new_handle && close(new_dirfd)) { PERROR("Failed to close directory file descriptor of directory handle"); } @@ -219,105 +217,105 @@ end: } bool lttng_directory_handle_equals(const struct lttng_directory_handle *lhs, - const struct lttng_directory_handle *rhs) + const struct lttng_directory_handle *rhs) { return lhs->directory_inode == rhs->directory_inode; } -static -void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle) +static void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle) { handle->dirfd = -1; } int lttng_directory_handle_stat(const struct lttng_directory_handle *handle, - const char *path, struct stat *st) + const char *path, + struct stat *st) { return fstatat(handle->dirfd, path, st, 0); } -bool lttng_directory_handle_uses_fd( - const struct lttng_directory_handle *handle) +bool lttng_directory_handle_uses_fd(const struct lttng_directory_handle *handle) { return handle->dirfd != AT_FDCWD; } -static -int lttng_directory_handle_mkdir( - const struct lttng_directory_handle *handle, - const char *path, mode_t mode) +static int lttng_directory_handle_mkdir(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode) { return mkdirat(handle->dirfd, path, mode); } -static -int lttng_directory_handle_open(const struct lttng_directory_handle *handle, - const char *filename, int flags, mode_t mode) +static int lttng_directory_handle_open(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode) { return openat(handle->dirfd, filename, flags, mode); } -static -int _run_as_open(const struct lttng_directory_handle *handle, - const char *filename, - int flags, mode_t mode, uid_t uid, gid_t gid) +static int _run_as_open(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode, + uid_t uid, + gid_t gid) { return run_as_openat(handle->dirfd, filename, flags, mode, uid, gid); } -static -int _run_as_unlink(const struct lttng_directory_handle *handle, - const char *filename, uid_t uid, gid_t gid) +static int _run_as_unlink(const struct lttng_directory_handle *handle, + const char *filename, + uid_t uid, + gid_t gid) { return run_as_unlinkat(handle->dirfd, filename, uid, gid); } -static -int lttng_directory_handle_unlink( - const struct lttng_directory_handle *handle, - const char *filename) +static int lttng_directory_handle_unlink(const struct lttng_directory_handle *handle, + const char *filename) { return unlinkat(handle->dirfd, filename, 0); } -static -int _run_as_mkdir(const struct lttng_directory_handle *handle, - const char *path, mode_t mode, uid_t uid, gid_t gid) +static int _run_as_mkdir(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode, + uid_t uid, + gid_t gid) { return run_as_mkdirat(handle->dirfd, path, mode, uid, gid); } -static -int _run_as_mkdir_recursive(const struct lttng_directory_handle *handle, - const char *path, mode_t mode, uid_t uid, gid_t gid) +static int _run_as_mkdir_recursive(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode, + uid_t uid, + gid_t gid) { return run_as_mkdirat_recursive(handle->dirfd, path, mode, uid, gid); } -static -int _lttng_directory_handle_rename( - const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name) +static int _lttng_directory_handle_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name) { - return renameat(old_handle->dirfd, old_name, - new_handle->dirfd, new_name); + return renameat(old_handle->dirfd, old_name, new_handle->dirfd, new_name); } -static -int _run_as_rename(const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name, uid_t uid, gid_t gid) +static int _run_as_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name, + uid_t uid, + gid_t gid) { - return run_as_renameat(old_handle->dirfd, old_name, new_handle->dirfd, - new_name, uid, gid); + return run_as_renameat(old_handle->dirfd, old_name, new_handle->dirfd, new_name, uid, gid); } -static -DIR *lttng_directory_handle_opendir(const struct lttng_directory_handle *handle, - const char *path) +static DIR *lttng_directory_handle_opendir(const struct lttng_directory_handle *handle, + const char *path) { DIR *dir_stream = NULL; int fd = openat(handle->dirfd, path, O_RDONLY); @@ -342,9 +340,8 @@ end: return dir_stream; } -static -int lttng_directory_handle_rmdir( - const struct lttng_directory_handle *handle, const char *name) +static int lttng_directory_handle_rmdir(const struct lttng_directory_handle *handle, + const char *name) { int ret = unlinkat(handle->dirfd, name, AT_REMOVEDIR); if (ret) { @@ -354,44 +351,44 @@ int lttng_directory_handle_rmdir( return ret; } -static -int _run_as_rmdir(const struct lttng_directory_handle *handle, - const char *name, uid_t uid, gid_t gid) +static int +_run_as_rmdir(const struct lttng_directory_handle *handle, const char *name, uid_t uid, gid_t gid) { return run_as_rmdirat(handle->dirfd, name, uid, gid); } -static -int _run_as_rmdir_recursive( - const struct lttng_directory_handle *handle, const char *name, - uid_t uid, gid_t gid, int flags) +static int _run_as_rmdir_recursive(const struct lttng_directory_handle *handle, + const char *name, + uid_t uid, + gid_t gid, + int flags) { return run_as_rmdirat_recursive(handle->dirfd, name, uid, gid, flags); } #else /* HAVE_DIRFD */ -static -int get_full_path(const struct lttng_directory_handle *handle, - const char *subdirectory, char *fullpath, size_t size) +static int get_full_path(const struct lttng_directory_handle *handle, + const char *subdirectory, + char *fullpath, + size_t size) { int ret; - const bool subdirectory_is_absolute = - subdirectory && *subdirectory == '/'; - const char * const base = subdirectory_is_absolute ? - subdirectory : handle->base_path; - const char * const end = subdirectory && !subdirectory_is_absolute ? - subdirectory : NULL; + const bool subdirectory_is_absolute = subdirectory && *subdirectory == '/'; + const char *const base = subdirectory_is_absolute ? subdirectory : handle->base_path; + const char *const end = subdirectory && !subdirectory_is_absolute ? subdirectory : NULL; const size_t base_len = strlen(base); const size_t end_len = end ? strlen(end) : 0; const bool add_separator_slash = end && base[base_len - 1] != '/'; const bool add_trailing_slash = end && end[end_len - 1] != '/'; - ret = snprintf(fullpath, size, "%s%s%s%s", - base, - add_separator_slash ? "/" : "", - end ? end : "", - add_trailing_slash ? "/" : ""); + ret = snprintf(fullpath, + size, + "%s%s%s%s", + base, + add_separator_slash ? "/" : "", + end ? end : "", + add_trailing_slash ? "/" : ""); if (ret == -1 || ret >= size) { ERR("Failed to format subdirectory from directory handle"); ret = -1; @@ -402,8 +399,7 @@ end: return ret; } -static -struct lttng_directory_handle *_lttng_directory_handle_create(char *path) +static struct lttng_directory_handle *_lttng_directory_handle_create(char *path) { struct lttng_directory_handle *handle = zmalloc(); @@ -416,8 +412,7 @@ end: return handle; } -struct lttng_directory_handle *lttng_directory_handle_create( - const char *path) +struct lttng_directory_handle *lttng_directory_handle_create(const char *path) { int ret; const char *cwd = ""; @@ -448,11 +443,13 @@ struct lttng_directory_handle *lttng_directory_handle_create( add_cwd_slash = cwd[cwd_len - 1] != '/'; } - ret = snprintf(handle_buf, sizeof(handle_buf), "%s%s%s%s", - cwd, - add_cwd_slash ? "/" : "", - path ? : "", - add_trailing_slash ? "/" : ""); + ret = snprintf(handle_buf, + sizeof(handle_buf), + "%s%s%s%s", + cwd, + add_cwd_slash ? "/" : "", + path ?: "", + add_trailing_slash ? "/" : ""); if (ret == -1 || ret >= LTTNG_PATH_MAX) { ERR("Failed to initialize directory handle, failed to format directory path"); goto end; @@ -463,9 +460,9 @@ end: return new_handle; } -struct lttng_directory_handle *lttng_directory_handle_create_from_handle( - const char *path, - const struct lttng_directory_handle *ref_handle) +struct lttng_directory_handle * +lttng_directory_handle_create_from_handle(const char *path, + const struct lttng_directory_handle *ref_handle) { int ret; size_t path_len, handle_path_len; @@ -484,14 +481,12 @@ struct lttng_directory_handle *lttng_directory_handle_create_from_handle( char full_path[LTTNG_PATH_MAX]; /* Best effort for logging purposes. */ - ret = get_full_path(ref_handle, path, full_path, - sizeof(full_path)); + ret = get_full_path(ref_handle, path, full_path, sizeof(full_path)); if (ret) { full_path[0] = '\0'; } - ERR("Failed to initialize directory handle to \"%s\": not a directory", - full_path); + ERR("Failed to initialize directory handle to \"%s\": not a directory", full_path); goto end; } if (!path) { @@ -518,11 +513,11 @@ struct lttng_directory_handle *lttng_directory_handle_create_from_handle( add_trailing_slash = path[path_len - 1] != '/'; - handle_path_len = strlen(ref_handle->base_path) + path_len + - !!add_trailing_slash; + handle_path_len = strlen(ref_handle->base_path) + path_len + !!add_trailing_slash; if (handle_path_len >= LTTNG_PATH_MAX) { ERR("Failed to initialize directory handle as the resulting path's length (%zu bytes) exceeds the maximal allowed length (%d bytes)", - handle_path_len, LTTNG_PATH_MAX); + handle_path_len, + LTTNG_PATH_MAX); goto end; } new_path = zmalloc(handle_path_len); @@ -531,10 +526,11 @@ struct lttng_directory_handle *lttng_directory_handle_create_from_handle( goto end; } - ret = sprintf(new_handle->base_path, "%s%s%s", - ref_handle->base_path, - path, - add_trailing_slash ? "/" : ""); + ret = sprintf(new_handle->base_path, + "%s%s%s", + ref_handle->base_path, + path, + add_trailing_slash ? "/" : ""); if (ret == -1 || ret >= handle_path_len) { ERR("Failed to initialize directory handle: path formatting failed"); goto end; @@ -546,26 +542,24 @@ end: return new_handle; } -struct lttng_directory_handle *lttng_directory_handle_create_from_dirfd( - int dirfd) +struct lttng_directory_handle *lttng_directory_handle_create_from_dirfd(int dirfd) { LTTNG_ASSERT(dirfd == AT_FDCWD); return lttng_directory_handle_create(NULL); } -static -void lttng_directory_handle_release(struct urcu_ref *ref) +static void lttng_directory_handle_release(struct urcu_ref *ref) { struct lttng_directory_handle *handle = - lttng::utils::container_of(ref, <tng_directory_handle::ref); + lttng::utils::container_of(ref, <tng_directory_handle::ref); free(handle->base_path); lttng_directory_handle_invalidate(handle); free(handle); } -struct lttng_directory_handle *lttng_directory_handle_copy( - const struct lttng_directory_handle *handle) +struct lttng_directory_handle * +lttng_directory_handle_copy(const struct lttng_directory_handle *handle) { struct lttng_directory_handle *new_handle = NULL; char *new_path = NULL; @@ -582,19 +576,19 @@ end: } bool lttng_directory_handle_equals(const struct lttng_directory_handle *lhs, - const struct lttng_directory_handle *rhs) + const struct lttng_directory_handle *rhs) { return strcmp(lhs->base_path, rhs->base_path) == 0; } -static -void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle) +static void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle) { handle->base_path = NULL; } int lttng_directory_handle_stat(const struct lttng_directory_handle *handle, - const char *subdirectory, struct stat *st) + const char *subdirectory, + struct stat *st) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -610,15 +604,14 @@ end: return ret; } -bool lttng_directory_handle_uses_fd( - const struct lttng_directory_handle *handle) +bool lttng_directory_handle_uses_fd(const struct lttng_directory_handle *handle) { return false; } -static -int lttng_directory_handle_mkdir(const struct lttng_directory_handle *handle, - const char *subdirectory, mode_t mode) +static int lttng_directory_handle_mkdir(const struct lttng_directory_handle *handle, + const char *subdirectory, + mode_t mode) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -634,9 +627,10 @@ end: return ret; } -static -int lttng_directory_handle_open(const struct lttng_directory_handle *handle, - const char *filename, int flags, mode_t mode) +static int lttng_directory_handle_open(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -652,10 +646,8 @@ end: return ret; } -static -int lttng_directory_handle_unlink( - const struct lttng_directory_handle *handle, - const char *filename) +static int lttng_directory_handle_unlink(const struct lttng_directory_handle *handle, + const char *filename) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -671,9 +663,11 @@ end: return ret; } -static -int _run_as_mkdir(const struct lttng_directory_handle *handle, const char *path, - mode_t mode, uid_t uid, gid_t gid) +static int _run_as_mkdir(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode, + uid_t uid, + gid_t gid) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -689,10 +683,12 @@ end: return ret; } -static -int _run_as_open(const struct lttng_directory_handle *handle, - const char *filename, - int flags, mode_t mode, uid_t uid, gid_t gid) +static int _run_as_open(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode, + uid_t uid, + gid_t gid) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -708,9 +704,10 @@ end: return ret; } -static -int _run_as_unlink(const struct lttng_directory_handle *handle, - const char *filename, uid_t uid, gid_t gid) +static int _run_as_unlink(const struct lttng_directory_handle *handle, + const char *filename, + uid_t uid, + gid_t gid) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -726,9 +723,11 @@ end: return ret; } -static -int _run_as_mkdir_recursive(const struct lttng_directory_handle *handle, - const char *path, mode_t mode, uid_t uid, gid_t gid) +static int _run_as_mkdir_recursive(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode, + uid_t uid, + gid_t gid) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -744,25 +743,21 @@ end: return ret; } -static -int _lttng_directory_handle_rename( - const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name) +static int _lttng_directory_handle_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name) { int ret; char old_fullpath[LTTNG_PATH_MAX]; char new_fullpath[LTTNG_PATH_MAX]; - ret = get_full_path(old_handle, old_name, old_fullpath, - sizeof(old_fullpath)); + ret = get_full_path(old_handle, old_name, old_fullpath, sizeof(old_fullpath)); if (ret) { errno = ENOMEM; goto end; } - ret = get_full_path(new_handle, new_name, new_fullpath, - sizeof(new_fullpath)); + ret = get_full_path(new_handle, new_name, new_fullpath, sizeof(new_fullpath)); if (ret) { errno = ENOMEM; goto end; @@ -773,24 +768,23 @@ end: return ret; } -static -int _run_as_rename(const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name, uid_t uid, gid_t gid) +static int _run_as_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name, + uid_t uid, + gid_t gid) { int ret; char old_fullpath[LTTNG_PATH_MAX]; char new_fullpath[LTTNG_PATH_MAX]; - ret = get_full_path(old_handle, old_name, old_fullpath, - sizeof(old_fullpath)); + ret = get_full_path(old_handle, old_name, old_fullpath, sizeof(old_fullpath)); if (ret) { errno = ENOMEM; goto end; } - ret = get_full_path(new_handle, new_name, new_fullpath, - sizeof(new_fullpath)); + ret = get_full_path(new_handle, new_name, new_fullpath, sizeof(new_fullpath)); if (ret) { errno = ENOMEM; goto end; @@ -801,9 +795,8 @@ end: return ret; } -static -DIR *lttng_directory_handle_opendir(const struct lttng_directory_handle *handle, - const char *path) +static DIR *lttng_directory_handle_opendir(const struct lttng_directory_handle *handle, + const char *path) { int ret; DIR *dir_stream = NULL; @@ -820,9 +813,8 @@ end: return dir_stream; } -static -int lttng_directory_handle_rmdir( - const struct lttng_directory_handle *handle, const char *name) +static int lttng_directory_handle_rmdir(const struct lttng_directory_handle *handle, + const char *name) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -838,9 +830,8 @@ end: return ret; } -static -int _run_as_rmdir(const struct lttng_directory_handle *handle, - const char *name, uid_t uid, gid_t gid) +static int +_run_as_rmdir(const struct lttng_directory_handle *handle, const char *name, uid_t uid, gid_t gid) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -856,10 +847,11 @@ end: return ret; } -static -int _run_as_rmdir_recursive( - const struct lttng_directory_handle *handle, const char *name, - uid_t uid, gid_t gid, int flags) +static int _run_as_rmdir_recursive(const struct lttng_directory_handle *handle, + const char *name, + uid_t uid, + gid_t gid, + int flags) { int ret; char fullpath[LTTNG_PATH_MAX]; @@ -888,9 +880,9 @@ end: * * Checking the path for existence allows us to work around this behaviour. */ -static -int create_directory_check_exists(const struct lttng_directory_handle *handle, - const char *path, mode_t mode) +static int create_directory_check_exists(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode) { int ret = 0; struct stat st; @@ -919,9 +911,9 @@ end: return ret; } -static -int create_directory_recursive(const struct lttng_directory_handle *handle, - const char *path, mode_t mode) +static int create_directory_recursive(const struct lttng_directory_handle *handle, + const char *path, + mode_t mode) { char *p, tmp[LTTNG_PATH_MAX]; size_t len; @@ -932,7 +924,8 @@ int create_directory_recursive(const struct lttng_directory_handle *handle, ret = lttng_strncpy(tmp, path, sizeof(tmp)); if (ret) { ERR("Failed to create directory: provided path's length (%zu bytes) exceeds the maximal allowed length (%zu bytes)", - strlen(path) + 1, sizeof(tmp)); + strlen(path) + 1, + sizeof(tmp)); goto error; } @@ -944,19 +937,16 @@ int create_directory_recursive(const struct lttng_directory_handle *handle, for (p = tmp + 1; *p; p++) { if (*p == '/') { *p = 0; - if (tmp[strlen(tmp) - 1] == '.' && - tmp[strlen(tmp) - 2] == '.' && - tmp[strlen(tmp) - 3] == '/') { - ERR("Using '/../' is not permitted in the trace path (%s)", - tmp); + if (tmp[strlen(tmp) - 1] == '.' && tmp[strlen(tmp) - 2] == '.' && + tmp[strlen(tmp) - 3] == '/') { + ERR("Using '/../' is not permitted in the trace path (%s)", tmp); ret = -1; goto error; } ret = create_directory_check_exists(handle, tmp, mode); if (ret < 0) { if (errno != EACCES) { - PERROR("Failed to create directory \"%s\"", - path); + PERROR("Failed to create directory \"%s\"", path); ret = -errno; goto error; } @@ -988,95 +978,96 @@ void lttng_directory_handle_put(struct lttng_directory_handle *handle) urcu_ref_put(&handle->ref, lttng_directory_handle_release); } -int lttng_directory_handle_create_subdirectory_as_user( - const struct lttng_directory_handle *handle, - const char *subdirectory, - mode_t mode, const struct lttng_credentials *creds) +int lttng_directory_handle_create_subdirectory_as_user(const struct lttng_directory_handle *handle, + const char *subdirectory, + mode_t mode, + const struct lttng_credentials *creds) { int ret; if (!creds) { /* Run as current user. */ - ret = create_directory_check_exists(handle, - subdirectory, mode); + ret = create_directory_check_exists(handle, subdirectory, mode); } else { - ret = _run_as_mkdir(handle, subdirectory, mode, - lttng_credentials_get_uid(creds), - lttng_credentials_get_gid(creds)); + ret = _run_as_mkdir(handle, + subdirectory, + mode, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds)); } return ret; } int lttng_directory_handle_create_subdirectory_recursive_as_user( - const struct lttng_directory_handle *handle, - const char *subdirectory_path, - mode_t mode, const struct lttng_credentials *creds) + const struct lttng_directory_handle *handle, + const char *subdirectory_path, + mode_t mode, + const struct lttng_credentials *creds) { int ret; if (!creds) { /* Run as current user. */ - ret = create_directory_recursive(handle, - subdirectory_path, mode); + ret = create_directory_recursive(handle, subdirectory_path, mode); } else { - ret = _run_as_mkdir_recursive(handle, subdirectory_path, - mode, lttng_credentials_get_uid(creds), lttng_credentials_get_gid(creds)); + ret = _run_as_mkdir_recursive(handle, + subdirectory_path, + mode, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds)); } return ret; } -int lttng_directory_handle_create_subdirectory( - const struct lttng_directory_handle *handle, - const char *subdirectory, - mode_t mode) +int lttng_directory_handle_create_subdirectory(const struct lttng_directory_handle *handle, + const char *subdirectory, + mode_t mode) { - return lttng_directory_handle_create_subdirectory_as_user( - handle, subdirectory, mode, NULL); + return lttng_directory_handle_create_subdirectory_as_user(handle, subdirectory, mode, NULL); } int lttng_directory_handle_create_subdirectory_recursive( - const struct lttng_directory_handle *handle, - const char *subdirectory_path, - mode_t mode) + const struct lttng_directory_handle *handle, const char *subdirectory_path, mode_t mode) { return lttng_directory_handle_create_subdirectory_recursive_as_user( - handle, subdirectory_path, mode, NULL); + handle, subdirectory_path, mode, NULL); } -int lttng_directory_handle_open_file_as_user( - const struct lttng_directory_handle *handle, - const char *filename, - int flags, mode_t mode, - const struct lttng_credentials *creds) +int lttng_directory_handle_open_file_as_user(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode, + const struct lttng_credentials *creds) { int ret; if (!creds) { /* Run as current user. */ - ret = lttng_directory_handle_open(handle, filename, flags, - mode); + ret = lttng_directory_handle_open(handle, filename, flags, mode); } else { - ret = _run_as_open(handle, filename, flags, mode, - lttng_credentials_get_uid(creds), lttng_credentials_get_gid(creds)); + ret = _run_as_open(handle, + filename, + flags, + mode, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds)); } return ret; } -int lttng_directory_handle_open_file( - const struct lttng_directory_handle *handle, - const char *filename, - int flags, mode_t mode) +int lttng_directory_handle_open_file(const struct lttng_directory_handle *handle, + const char *filename, + int flags, + mode_t mode) { - return lttng_directory_handle_open_file_as_user(handle, filename, flags, - mode, NULL); + return lttng_directory_handle_open_file_as_user(handle, filename, flags, mode, NULL); } -int lttng_directory_handle_unlink_file_as_user( - const struct lttng_directory_handle *handle, - const char *filename, - const struct lttng_credentials *creds) +int lttng_directory_handle_unlink_file_as_user(const struct lttng_directory_handle *handle, + const char *filename, + const struct lttng_credentials *creds) { int ret; @@ -1084,61 +1075,60 @@ int lttng_directory_handle_unlink_file_as_user( /* Run as current user. */ ret = lttng_directory_handle_unlink(handle, filename); } else { - ret = _run_as_unlink(handle, filename, lttng_credentials_get_uid(creds), lttng_credentials_get_gid(creds)); + ret = _run_as_unlink(handle, + filename, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds)); } return ret; } -int lttng_directory_handle_unlink_file( - const struct lttng_directory_handle *handle, - const char *filename) +int lttng_directory_handle_unlink_file(const struct lttng_directory_handle *handle, + const char *filename) { - return lttng_directory_handle_unlink_file_as_user(handle, - filename, NULL); + return lttng_directory_handle_unlink_file_as_user(handle, filename, NULL); } -int lttng_directory_handle_rename( - const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name) +int lttng_directory_handle_rename(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name) { - return lttng_directory_handle_rename_as_user(old_handle, old_name, - new_handle, new_name, NULL); + return lttng_directory_handle_rename_as_user( + old_handle, old_name, new_handle, new_name, NULL); } -int lttng_directory_handle_rename_as_user( - const struct lttng_directory_handle *old_handle, - const char *old_name, - const struct lttng_directory_handle *new_handle, - const char *new_name, - const struct lttng_credentials *creds) +int lttng_directory_handle_rename_as_user(const struct lttng_directory_handle *old_handle, + const char *old_name, + const struct lttng_directory_handle *new_handle, + const char *new_name, + const struct lttng_credentials *creds) { int ret; if (!creds) { /* Run as current user. */ - ret = _lttng_directory_handle_rename(old_handle, - old_name, new_handle, new_name); + ret = _lttng_directory_handle_rename(old_handle, old_name, new_handle, new_name); } else { - ret = _run_as_rename(old_handle, old_name, new_handle, - new_name, lttng_credentials_get_uid(creds), lttng_credentials_get_gid(creds)); + ret = _run_as_rename(old_handle, + old_name, + new_handle, + new_name, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds)); } return ret; } -int lttng_directory_handle_remove_subdirectory( - const struct lttng_directory_handle *handle, - const char *name) +int lttng_directory_handle_remove_subdirectory(const struct lttng_directory_handle *handle, + const char *name) { - return lttng_directory_handle_remove_subdirectory_as_user(handle, name, - NULL); + return lttng_directory_handle_remove_subdirectory_as_user(handle, name, NULL); } -int lttng_directory_handle_remove_subdirectory_as_user( - const struct lttng_directory_handle *handle, - const char *name, - const struct lttng_credentials *creds) +int lttng_directory_handle_remove_subdirectory_as_user(const struct lttng_directory_handle *handle, + const char *name, + const struct lttng_credentials *creds) { int ret; @@ -1146,7 +1136,10 @@ int lttng_directory_handle_remove_subdirectory_as_user( /* Run as current user. */ ret = lttng_directory_handle_rmdir(handle, name); } else { - ret = _run_as_rmdir(handle, name, lttng_credentials_get_uid(creds), lttng_credentials_get_gid(creds)); + ret = _run_as_rmdir(handle, + name, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds)); } return ret; } @@ -1161,8 +1154,7 @@ struct rmdir_frame { }; } /* namespace */ -static -void rmdir_frame_fini(void *data) +static void rmdir_frame_fini(void *data) { int ret; struct rmdir_frame *frame = (rmdir_frame *) data; @@ -1173,9 +1165,8 @@ void rmdir_frame_fini(void *data) } } -static -int remove_directory_recursive(const struct lttng_directory_handle *handle, - const char *path, int flags) +static int +remove_directory_recursive(const struct lttng_directory_handle *handle, const char *path, int flags) { int ret; struct lttng_dynamic_array frames; @@ -1190,19 +1181,18 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, const char separator = '/'; lttng_dynamic_buffer_init(¤t_path); - lttng_dynamic_array_init(&frames, sizeof(struct rmdir_frame), - rmdir_frame_fini); + lttng_dynamic_array_init(&frames, sizeof(struct rmdir_frame), rmdir_frame_fini); - if (flags & ~(LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG | - LTTNG_DIRECTORY_HANDLE_FAIL_NON_EMPTY_FLAG)) { + if (flags & + ~(LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG | + LTTNG_DIRECTORY_HANDLE_FAIL_NON_EMPTY_FLAG)) { ERR("Unknown flags %d", flags); ret = -1; goto end; } if (!initial_frame.dir) { - if (flags & LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG && - errno == ENOENT) { + if (flags & LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG && errno == ENOENT) { DBG("Cannot rmdir \"%s\": root does not exist", path); ret = 0; goto end; @@ -1220,8 +1210,7 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, goto end; } - ret = lttng_dynamic_buffer_append( - ¤t_path, path, initial_frame.path_size); + ret = lttng_dynamic_buffer_append(¤t_path, path, initial_frame.path_size); if (ret) { ERR("Failed to set initial path during recursive directory removal"); ret = -1; @@ -1231,47 +1220,40 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, while (lttng_dynamic_array_get_count(&frames) > 0) { struct dirent *entry; struct rmdir_frame *current_frame = - (rmdir_frame *) lttng_dynamic_array_get_element( - &frames, current_frame_idx); + (rmdir_frame *) lttng_dynamic_array_get_element(&frames, current_frame_idx); LTTNG_ASSERT(current_frame->dir); - ret = lttng_dynamic_buffer_set_size( - ¤t_path, current_frame->path_size); + ret = lttng_dynamic_buffer_set_size(¤t_path, current_frame->path_size); LTTNG_ASSERT(!ret); current_path.data[current_path.size - 1] = '\0'; while ((entry = readdir(current_frame->dir))) { struct stat st; - if (!strcmp(entry->d_name, ".") || - !strcmp(entry->d_name, "..")) { + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) { continue; } /* Set current_path to the entry's path. */ - ret = lttng_dynamic_buffer_set_size( - ¤t_path, current_path.size - 1); + ret = lttng_dynamic_buffer_set_size(¤t_path, current_path.size - 1); LTTNG_ASSERT(!ret); - ret = lttng_dynamic_buffer_append(¤t_path, - &separator, sizeof(separator)); + ret = lttng_dynamic_buffer_append( + ¤t_path, &separator, sizeof(separator)); if (ret) { goto end; } - ret = lttng_dynamic_buffer_append(¤t_path, - entry->d_name, - strlen(entry->d_name) + 1); + ret = lttng_dynamic_buffer_append( + ¤t_path, entry->d_name, strlen(entry->d_name) + 1); if (ret) { goto end; } - if (lttng_directory_handle_stat( - handle, current_path.data, &st)) { + if (lttng_directory_handle_stat(handle, current_path.data, &st)) { if ((flags & LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG) && - errno == ENOENT) { + errno == ENOENT) { break; } - PERROR("Failed to stat \"%s\"", - current_path.data); + PERROR("Failed to stat \"%s\"", current_path.data); ret = -1; goto end; } @@ -1283,23 +1265,22 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, } else { /* Not empty, abort. */ DBG("Directory \"%s\" is not empty; refusing to remove directory", - current_path.data); + current_path.data); ret = -1; goto end; } } else { struct rmdir_frame new_frame = { .parent_frame_idx = (ssize_t) current_frame_idx, - .dir = lttng_directory_handle_opendir( - handle, - current_path.data), + .dir = lttng_directory_handle_opendir(handle, + current_path.data), .empty = true, .path_size = current_path.size, }; if (!new_frame.dir) { if (flags & LTTNG_DIRECTORY_HANDLE_SKIP_NON_EMPTY_FLAG && - errno == ENOENT) { + errno == ENOENT) { DBG("Non-existing directory stream during recursive directory removal"); break; } else { @@ -1308,8 +1289,7 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, goto end; } } - ret = lttng_dynamic_array_add_element( - &frames, &new_frame); + ret = lttng_dynamic_array_add_element(&frames, &new_frame); if (ret) { ERR("Failed to push context frame during recursive directory removal"); rmdir_frame_fini(&new_frame); @@ -1326,13 +1306,12 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, /* Pop rmdir frame. */ if (current_frame->empty) { - ret = lttng_directory_handle_rmdir( - handle, current_path.data); + ret = lttng_directory_handle_rmdir(handle, current_path.data); if (ret) { if ((flags & LTTNG_DIRECTORY_HANDLE_FAIL_NON_EMPTY_FLAG) || - errno != ENOENT) { + errno != ENOENT) { PERROR("Failed to remove \"%s\" during recursive directory removal", - current_path.data); + current_path.data); goto end; } DBG("Non-existing directory stream during recursive directory removal"); @@ -1340,13 +1319,12 @@ int remove_directory_recursive(const struct lttng_directory_handle *handle, } else if (current_frame->parent_frame_idx >= 0) { struct rmdir_frame *parent_frame; - parent_frame = (rmdir_frame *) lttng_dynamic_array_get_element(&frames, - current_frame->parent_frame_idx); + parent_frame = (rmdir_frame *) lttng_dynamic_array_get_element( + &frames, current_frame->parent_frame_idx); LTTNG_ASSERT(parent_frame); parent_frame->empty = false; } - ret = lttng_dynamic_array_remove_element( - &frames, current_frame_idx); + ret = lttng_dynamic_array_remove_element(&frames, current_frame_idx); if (ret) { ERR("Failed to pop context frame during recursive directory removal"); goto end; @@ -1360,19 +1338,17 @@ end: } int lttng_directory_handle_remove_subdirectory_recursive( - const struct lttng_directory_handle *handle, - const char *name, - int flags) + const struct lttng_directory_handle *handle, const char *name, int flags) { return lttng_directory_handle_remove_subdirectory_recursive_as_user( - handle, name, NULL, flags); + handle, name, NULL, flags); } int lttng_directory_handle_remove_subdirectory_recursive_as_user( - const struct lttng_directory_handle *handle, - const char *name, - const struct lttng_credentials *creds, - int flags) + const struct lttng_directory_handle *handle, + const char *name, + const struct lttng_credentials *creds, + int flags) { int ret; @@ -1380,8 +1356,11 @@ int lttng_directory_handle_remove_subdirectory_recursive_as_user( /* Run as current user. */ ret = remove_directory_recursive(handle, name, flags); } else { - ret = _run_as_rmdir_recursive(handle, name, lttng_credentials_get_uid(creds), - lttng_credentials_get_gid(creds), flags); + ret = _run_as_rmdir_recursive(handle, + name, + lttng_credentials_get_uid(creds), + lttng_credentials_get_gid(creds), + flags); } return ret; }