X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fdirectory-handle.c;h=6e04c6a3c250bf20530656ab8bb9d336ecaa4036;hb=5c3892a6b0083de585509b7c71b76068b2f110bc;hp=781f2574b0ea652cadd2d8b8bb0e9e487d891d91;hpb=69e3a560d3063497c161ae00a9875dad1d546818;p=lttng-tools.git diff --git a/src/common/compat/directory-handle.c b/src/common/compat/directory-handle.c index 781f2574b..6e04c6a3c 100644 --- a/src/common/compat/directory-handle.c +++ b/src/common/compat/directory-handle.c @@ -41,6 +41,8 @@ int _run_as_mkdir(const struct lttng_directory_handle *handle, const char *path, 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 +void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle); #ifdef COMPAT_DIRFD @@ -79,13 +81,39 @@ void lttng_directory_handle_fini(struct lttng_directory_handle *handle) { int ret; - if (handle->dirfd == AT_FDCWD) { - return; + if (handle->dirfd == AT_FDCWD || handle->dirfd == -1) { + goto end; } ret = close(handle->dirfd); if (ret == -1) { PERROR("Failed to close directory file descriptor of directory handle"); } +end: + lttng_directory_handle_invalidate(handle); +} + +LTTNG_HIDDEN +int lttng_directory_handle_copy(const struct lttng_directory_handle *handle, + struct lttng_directory_handle *new_copy) +{ + int ret = 0; + + if (handle->dirfd == AT_FDCWD) { + new_copy->dirfd = handle->dirfd; + } else { + new_copy->dirfd = dup(handle->dirfd); + if (new_copy->dirfd == -1) { + PERROR("Failed to duplicate directory fd of directory handle"); + ret = -1; + } + } + return ret; +} + +static +void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle) +{ + handle->dirfd = -1; } static @@ -223,6 +251,21 @@ LTTNG_HIDDEN void lttng_directory_handle_fini(struct lttng_directory_handle *handle) { free(handle->base_path); + lttng_directory_handle_invalidate(handle); +} + +LTTNG_HIDDEN +int lttng_directory_handle_copy(const struct lttng_directory_handle *handle, + struct lttng_directory_handle *new_copy) +{ + new_copy->base_path = strdup(handle->base_path); + return new_copy->base_path ? 0 : -1; +} + +static +void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle) +{ + handle->base_path = NULL; } static @@ -359,6 +402,16 @@ end: } /* Common implementation. */ +LTTNG_HIDDEN +struct lttng_directory_handle +lttng_directory_handle_move(struct lttng_directory_handle *original) +{ + const struct lttng_directory_handle tmp = *original; + + lttng_directory_handle_invalidate(original); + return tmp; +} + static int create_directory_recursive(const struct lttng_directory_handle *handle, const char *path, mode_t mode)