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
{
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
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)
void lttng_directory_handle_fini(struct lttng_directory_handle *handle)
{
free(handle->base_path);
+ lttng_directory_handle_invalidate(handle);
}
LTTNG_HIDDEN
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)
}
/* 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)
int lttng_directory_handle_copy(const struct lttng_directory_handle *handle,
struct lttng_directory_handle *new_copy);
+/*
+ * Move a directory handle. The original directory handle may no longer be
+ * used after this call. This call cannot fail; directly assign the
+ * return value to the new directory handle.
+ *
+ * It is safe (but unnecessary) to call lttng_directory_handle_fini on the
+ * original handle.
+ */
+LTTNG_HIDDEN
+struct lttng_directory_handle
+lttng_directory_handle_move(struct lttng_directory_handle *original);
+
/*
* Release the resources of a directory handle.
*/