summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2014-02-27 11:46:49 -0500
committerColin Walters <walters@verbum.org>2014-02-27 11:48:02 -0500
commit681eef7fbb5b13fd747ad074eea216c72e673940 (patch)
tree13ae8edf71653e2fb59bfc96df4a644fcc49a876
parent9b64f3e3d0e46bfeb6b2a1a4604c82ba5ad20535 (diff)
downloadlibgsystem-681eef7fbb5b13fd747ad074eea216c72e673940.tar.gz
fileutils: Add gs_file_open_dir_fd_at()
This will be used in the OSTree checkout code, where we want to mkdir() and then open it.
-rw-r--r--src/gsystem-file-utils.c28
-rw-r--r--src/gsystem-file-utils.h6
2 files changed, 34 insertions, 0 deletions
diff --git a/src/gsystem-file-utils.c b/src/gsystem-file-utils.c
index 27e0e2d..545fb30 100644
--- a/src/gsystem-file-utils.c
+++ b/src/gsystem-file-utils.c
@@ -464,6 +464,34 @@ gs_file_open_dir_fd (GFile *path,
}
/**
+ * gs_file_open_dir_fd_at:
+ * @parent_dfd: Parent directory file descriptor
+ * @name: Directory name
+ * @out_fd: (out): File descriptor for directory
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * On success, sets @out_fd to a file descriptor for the directory
+ * that can be used with UNIX functions such as openat().
+ */
+gboolean
+gs_file_open_dir_fd_at (int parent_dfd,
+ const char *name,
+ int *out_fd,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* Linux specific probably */
+ *out_fd = openat (parent_dfd, name, O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC);
+ if (*out_fd == -1)
+ {
+ _set_error_from_errno (error);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
* gs_file_open_in_tmpdir_at:
* @tmpdir_fd: Directory to place temporary file
* @mode: Default mode (will be affected by umask)
diff --git a/src/gsystem-file-utils.h b/src/gsystem-file-utils.h
index 2da6646..85ef9ad 100644
--- a/src/gsystem-file-utils.h
+++ b/src/gsystem-file-utils.h
@@ -75,6 +75,12 @@ gboolean gs_file_open_dir_fd (GFile *path,
GCancellable *cancellable,
GError **error);
+gboolean gs_file_open_dir_fd_at (int parent_dfd,
+ const char *name,
+ int *out_fd,
+ GCancellable *cancellable,
+ GError **error);
+
gboolean gs_file_open_in_tmpdir_at (int tmpdir_fd,
int mode,
char **out_name,