[libglnx: 1/2] shutil: Prefix error with path in rm_rf()
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libglnx: 1/2] shutil: Prefix error with path in rm_rf()
- Date: Fri, 7 Dec 2018 15:08:00 +0000 (UTC)
commit b1cb19b6b2d712b492e6376248f3010d18e59daa
Author: Colin Walters <walters verbum org>
Date: Thu Dec 6 22:02:35 2018 +0000
shutil: Prefix error with path in rm_rf()
First, let's ensure the filename is prefixed consistently.
Second, add the entrypoint as a prefix when recursing.
This is best practice to help debugging. Motivated by
https://discussion.fedoraproject.org/t/boot-partition-of-silverblue-is-without-space/771/9
glnx-shutil.c | 40 ++++++++++++++++++++++++----------------
1 file changed, 24 insertions(+), 16 deletions(-)
---
diff --git a/glnx-shutil.c b/glnx-shutil.c
index 75d0593..78042fe 100644
--- a/glnx-shutil.c
+++ b/glnx-shutil.c
@@ -24,8 +24,23 @@
#include <glnx-shutil.h>
#include <glnx-errors.h>
+#include <glnx-fdio.h>
#include <glnx-local-alloc.h>
+static gboolean
+unlinkat_allow_noent (int dfd,
+ const char *path,
+ int flags,
+ GError **error)
+{
+ if (unlinkat (dfd, path, flags) == -1)
+ {
+ if (errno != ENOENT)
+ return glnx_throw_errno_prefix (error, "unlinkat(%s)", path);
+ }
+ return TRUE;
+}
+
static gboolean
glnx_shutil_rm_rf_children (GLnxDirFdIterator *dfd_iter,
GCancellable *cancellable,
@@ -51,16 +66,13 @@ glnx_shutil_rm_rf_children (GLnxDirFdIterator *dfd_iter,
if (!glnx_shutil_rm_rf_children (&child_dfd_iter, cancellable, error))
return FALSE;
- if (unlinkat (dfd_iter->fd, dent->d_name, AT_REMOVEDIR) == -1)
- return glnx_throw_errno_prefix (error, "unlinkat");
+ if (!glnx_unlinkat (dfd_iter->fd, dent->d_name, AT_REMOVEDIR, error))
+ return FALSE;
}
else
{
- if (unlinkat (dfd_iter->fd, dent->d_name, 0) == -1)
- {
- if (errno != ENOENT)
- return glnx_throw_errno_prefix (error, "unlinkat");
- }
+ if (!unlinkat_allow_noent (dfd_iter->fd, dent->d_name, 0, error))
+ return FALSE;
}
}
@@ -86,7 +98,6 @@ glnx_shutil_rm_rf_at (int dfd,
{
dfd = glnx_dirfd_canonicalize (dfd);
-
/* With O_NOFOLLOW first */
glnx_autofd int target_dfd =
openat (dfd, path, O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC | O_NOFOLLOW);
@@ -100,8 +111,8 @@ glnx_shutil_rm_rf_at (int dfd,
}
else if (errsv == ENOTDIR || errsv == ELOOP)
{
- if (unlinkat (dfd, path, 0) != 0)
- return glnx_throw_errno_prefix (error, "unlinkat");
+ if (!glnx_unlinkat (dfd, path, 0, error))
+ return FALSE;
}
else
return glnx_throw_errno_prefix (error, "open(%s)", path);
@@ -113,13 +124,10 @@ glnx_shutil_rm_rf_at (int dfd,
return FALSE;
if (!glnx_shutil_rm_rf_children (&dfd_iter, cancellable, error))
- return FALSE;
+ return glnx_prefix_error (error, "Removing %s", path);
- if (unlinkat (dfd, path, AT_REMOVEDIR) == -1)
- {
- if (errno != ENOENT)
- return glnx_throw_errno_prefix (error, "unlinkat");
- }
+ if (!unlinkat_allow_noent (dfd, path, AT_REMOVEDIR, error))
+ return FALSE;
}
return TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]