Allow lttng_directory_handle to be moved
[lttng-tools.git] / src / common / compat / directory-handle.c
index 562a7928719031856164f5a7fb2333fe30bcfc75..6e04c6a3c250bf20530656ab8bb9d336ecaa4036 100644 (file)
@@ -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,15 @@ 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
@@ -106,6 +110,12 @@ int lttng_directory_handle_copy(const struct lttng_directory_handle *handle,
        return ret;
 }
 
+static
+void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle)
+{
+       handle->dirfd = -1;
+}
+
 static
 int lttng_directory_handle_stat(const struct lttng_directory_handle *handle,
                const char *path, struct stat *st)
@@ -241,6 +251,7 @@ LTTNG_HIDDEN
 void lttng_directory_handle_fini(struct lttng_directory_handle *handle)
 {
        free(handle->base_path);
+       lttng_directory_handle_invalidate(handle);
 }
 
 LTTNG_HIDDEN
@@ -251,6 +262,12 @@ int lttng_directory_handle_copy(const struct lttng_directory_handle *handle,
        return new_copy->base_path ? 0 : -1;
 }
 
+static
+void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle)
+{
+       handle->base_path = NULL;
+}
+
 static
 int get_full_path(const struct lttng_directory_handle *handle,
                const char *subdirectory, char *fullpath, size_t size)
@@ -385,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)
This page took 0.026345 seconds and 5 git commands to generate.