Skip to content
Snippets Groups Projects
Commit f5ba01cf authored by Colin Walters's avatar Colin Walters
Browse files

dirfd: Have dfd iter _take_fd() take a pointer and do a steal

This avoids callers having to use `glnx_steal_fd()` on their own; in general, I
think we should implement move semantics like this at the callee level.

Another reason to do this is there's a subtle problem with doing:

```
somefunction (steal_value (&v), ..., error);
```

in that if `somefunction` throws, it may not have taken ownership of the value.
At least `glnx_dirfd_iterator_init_take_fd()` didn't.
parent 66d16287
No related branches found
No related tags found
No related merge requests found
...@@ -103,7 +103,7 @@ glnx_dirfd_iterator_init_at (int dfd, ...@@ -103,7 +103,7 @@ glnx_dirfd_iterator_init_at (int dfd,
if (!glnx_opendirat (dfd, path, follow, &fd, error)) if (!glnx_opendirat (dfd, path, follow, &fd, error))
return FALSE; return FALSE;
if (!glnx_dirfd_iterator_init_take_fd (glnx_steal_fd (&fd), out_dfd_iter, error)) if (!glnx_dirfd_iterator_init_take_fd (&fd, out_dfd_iter, error))
return FALSE; return FALSE;
return TRUE; return TRUE;
...@@ -111,7 +111,7 @@ glnx_dirfd_iterator_init_at (int dfd, ...@@ -111,7 +111,7 @@ glnx_dirfd_iterator_init_at (int dfd,
/** /**
* glnx_dirfd_iterator_init_take_fd: * glnx_dirfd_iterator_init_take_fd:
* @dfd: File descriptor - ownership is taken * @dfd: File descriptor - ownership is taken, and the value is set to -1
* @dfd_iter: A directory iterator * @dfd_iter: A directory iterator
* @error: Error * @error: Error
* *
...@@ -119,16 +119,16 @@ glnx_dirfd_iterator_init_at (int dfd, ...@@ -119,16 +119,16 @@ glnx_dirfd_iterator_init_at (int dfd,
* iteration. * iteration.
*/ */
gboolean gboolean
glnx_dirfd_iterator_init_take_fd (int dfd, glnx_dirfd_iterator_init_take_fd (int *dfd,
GLnxDirFdIterator *dfd_iter, GLnxDirFdIterator *dfd_iter,
GError **error) GError **error)
{ {
GLnxRealDirfdIterator *real_dfd_iter = (GLnxRealDirfdIterator*) dfd_iter; GLnxRealDirfdIterator *real_dfd_iter = (GLnxRealDirfdIterator*) dfd_iter;
DIR *d = fdopendir (dfd); DIR *d = fdopendir (*dfd);
if (!d) if (!d)
return glnx_throw_errno_prefix (error, "fdopendir"); return glnx_throw_errno_prefix (error, "fdopendir");
real_dfd_iter->fd = dfd; real_dfd_iter->fd = glnx_steal_fd (dfd);
real_dfd_iter->d = d; real_dfd_iter->d = d;
real_dfd_iter->initialized = TRUE; real_dfd_iter->initialized = TRUE;
......
...@@ -55,7 +55,7 @@ typedef struct GLnxDirFdIterator GLnxDirFdIterator; ...@@ -55,7 +55,7 @@ typedef struct GLnxDirFdIterator GLnxDirFdIterator;
gboolean glnx_dirfd_iterator_init_at (int dfd, const char *path, gboolean glnx_dirfd_iterator_init_at (int dfd, const char *path,
gboolean follow, gboolean follow,
GLnxDirFdIterator *dfd_iter, GError **error); GLnxDirFdIterator *dfd_iter, GError **error);
gboolean glnx_dirfd_iterator_init_take_fd (int dfd, GLnxDirFdIterator *dfd_iter, GError **error); gboolean glnx_dirfd_iterator_init_take_fd (int *dfd, GLnxDirFdIterator *dfd_iter, GError **error);
gboolean glnx_dirfd_iterator_next_dent (GLnxDirFdIterator *dfd_iter, gboolean glnx_dirfd_iterator_next_dent (GLnxDirFdIterator *dfd_iter,
struct dirent **out_dent, struct dirent **out_dent,
GCancellable *cancellable, GCancellable *cancellable,
......
...@@ -110,9 +110,8 @@ glnx_shutil_rm_rf_at (int dfd, ...@@ -110,9 +110,8 @@ glnx_shutil_rm_rf_at (int dfd,
} }
else else
{ {
if (!glnx_dirfd_iterator_init_take_fd (target_dfd, &dfd_iter, error)) if (!glnx_dirfd_iterator_init_take_fd (&target_dfd, &dfd_iter, error))
return FALSE; return FALSE;
target_dfd = -1;
if (!glnx_shutil_rm_rf_children (&dfd_iter, cancellable, error)) if (!glnx_shutil_rm_rf_children (&dfd_iter, cancellable, error))
return FALSE; return FALSE;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment