From: Daan De Meyer Date: Mon, 26 Sep 2022 20:31:52 +0000 (+0200) Subject: rm-rf: Add rm_rf_physical_and_close() X-Git-Tag: v253-rc1~561^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=56e2bceddc7383c4abe1ef0110192e491c729de4;p=thirdparty%2Fsystemd.git rm-rf: Add rm_rf_physical_and_close() In tests it's useful to be able to delete temporary directories via a file descriptor to them, so let's add rm_rf_physical_and_close() which gets the file descriptor path via /proc and tries to remove it that way. --- diff --git a/src/shared/rm-rf.h b/src/shared/rm-rf.h index 24fd9a2aa2d..86d3e57b0e5 100644 --- a/src/shared/rm-rf.h +++ b/src/shared/rm-rf.h @@ -5,6 +5,7 @@ #include "alloc-util.h" #include "errno-util.h" +#include "fd-util.h" typedef enum RemoveFlags { REMOVE_ONLY_DIRECTORIES = 1 << 0, /* Only remove empty directories, no files */ @@ -51,3 +52,19 @@ static inline char *rm_rf_subvolume_and_free(char *p) { return mfree(p); } DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rm_rf_subvolume_and_free); + +static inline int rm_rf_physical_and_close(int fd) { + _cleanup_free_ char *p = NULL; + + if (fd < 0) + return -1; + + if (fd_get_path(fd, &p) < 0) + return safe_close(fd); + + safe_close(fd); + (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_MISSING_OK|REMOVE_CHMOD); + + return -1; +} +DEFINE_TRIVIAL_CLEANUP_FUNC(int, rm_rf_physical_and_close);