101 lines
3.7 KiB
Diff
101 lines
3.7 KiB
Diff
From 811b137d6137cc3e8932599e6ef9254ba43ff5eb Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Date: Tue, 23 Nov 2021 16:56:42 +0100
|
|
Subject: [PATCH 5/6] shared/rm_rf: refactor rm_rf() to shorten code a bit
|
|
|
|
(cherry picked from commit 84ced330020c0bae57bd4628f1f44eec91304e69)
|
|
(cherry picked from commit 664529efa9431edc043126013ea54e6c399ae2d3)
|
|
---
|
|
src/shared/rm-rf.c | 54 +++++++++++++++++++++-------------------------
|
|
1 file changed, 24 insertions(+), 30 deletions(-)
|
|
|
|
diff --git a/src/shared/rm-rf.c b/src/shared/rm-rf.c
|
|
index 7362954116..1bd2431d8a 100644
|
|
--- a/src/shared/rm-rf.c
|
|
+++ b/src/shared/rm-rf.c
|
|
@@ -250,7 +250,7 @@ int rm_rf_children(
|
|
}
|
|
|
|
int rm_rf(const char *path, RemoveFlags flags) {
|
|
- int fd, r;
|
|
+ int fd, r, q = 0;
|
|
|
|
assert(path);
|
|
|
|
@@ -282,49 +282,43 @@ int rm_rf(const char *path, RemoveFlags flags) {
|
|
}
|
|
|
|
fd = open(path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW|O_NOATIME);
|
|
- if (fd < 0) {
|
|
+ if (fd >= 0) {
|
|
+ /* We have a dir */
|
|
+ r = rm_rf_children(fd, flags, NULL);
|
|
+
|
|
+ if (FLAGS_SET(flags, REMOVE_ROOT) && rmdir(path) < 0)
|
|
+ q = -errno;
|
|
+ } else {
|
|
if (FLAGS_SET(flags, REMOVE_MISSING_OK) && errno == ENOENT)
|
|
return 0;
|
|
|
|
if (!IN_SET(errno, ENOTDIR, ELOOP))
|
|
return -errno;
|
|
|
|
- if (FLAGS_SET(flags, REMOVE_ONLY_DIRECTORIES))
|
|
+ if (FLAGS_SET(flags, REMOVE_ONLY_DIRECTORIES) || !FLAGS_SET(flags, REMOVE_ROOT))
|
|
return 0;
|
|
|
|
- if (FLAGS_SET(flags, REMOVE_ROOT)) {
|
|
-
|
|
- if (!FLAGS_SET(flags, REMOVE_PHYSICAL)) {
|
|
- struct statfs s;
|
|
-
|
|
- if (statfs(path, &s) < 0)
|
|
- return -errno;
|
|
- if (is_physical_fs(&s))
|
|
- return log_error_errno(SYNTHETIC_ERRNO(EPERM),
|
|
- "Attempted to remove files from a disk file system under \"%s\", refusing.",
|
|
- path);
|
|
- }
|
|
-
|
|
- if (unlink(path) < 0) {
|
|
- if (FLAGS_SET(flags, REMOVE_MISSING_OK) && errno == ENOENT)
|
|
- return 0;
|
|
+ if (!FLAGS_SET(flags, REMOVE_PHYSICAL)) {
|
|
+ struct statfs s;
|
|
|
|
+ if (statfs(path, &s) < 0)
|
|
return -errno;
|
|
- }
|
|
+ if (is_physical_fs(&s))
|
|
+ return log_error_errno(SYNTHETIC_ERRNO(EPERM),
|
|
+ "Attempted to remove files from a disk file system under \"%s\", refusing.",
|
|
+ path);
|
|
}
|
|
|
|
- return 0;
|
|
+ r = 0;
|
|
+ if (unlink(path) < 0)
|
|
+ q = -errno;
|
|
}
|
|
|
|
- r = rm_rf_children(fd, flags, NULL);
|
|
-
|
|
- if (FLAGS_SET(flags, REMOVE_ROOT) &&
|
|
- rmdir(path) < 0 &&
|
|
- r >= 0 &&
|
|
- (!FLAGS_SET(flags, REMOVE_MISSING_OK) || errno != ENOENT))
|
|
- r = -errno;
|
|
-
|
|
- return r;
|
|
+ if (r < 0)
|
|
+ return r;
|
|
+ if (q < 0 && (q != -ENOENT || !FLAGS_SET(flags, REMOVE_MISSING_OK)))
|
|
+ return q;
|
|
+ return 0;
|
|
}
|
|
|
|
int rm_rf_child(int fd, const char *name, RemoveFlags flags) {
|
|
--
|
|
2.27.0
|
|
|