aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-11-26 23:51:11 +0100
committerLudovic Courtès <ludo@gnu.org>2019-11-27 00:03:03 +0100
commitfbecb5cddb2d36cc1a29dac3751b017fa531383c (patch)
treec850aa7e387e878f0c98b6849b03934fbcf78be2
parent7738a72186583afb3bb2e0a866c8aba130372400 (diff)
downloadguix-fbecb5cddb2d36cc1a29dac3751b017fa531383c.tar.gz
guix-fbecb5cddb2d36cc1a29dac3751b017fa531383c.zip
daemon: 'deletePath' uses 'statx' when available.
* nix/libutil/util.cc (_deletePath) [HAVE_STATX]: Use 'statx'.
-rw-r--r--nix/libutil/util.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc
index 9a83876013..8093b4c8b4 100644
--- a/nix/libutil/util.cc
+++ b/nix/libutil/util.cc
@@ -306,7 +306,18 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed)
printMsg(lvlVomit, format("%1%") % path);
+#ifdef HAVE_STATX
+# define st_mode stx_mode
+# define st_size stx_size
+# define st_nlink stx_nlink
+ struct statx st;
+ if (statx(AT_FDCWD, path.c_str(),
+ AT_SYMLINK_NOFOLLOW,
+ STATX_SIZE | STATX_NLINK | STATX_MODE, &st) == -1)
+ throw SysError(format("getting status of `%1%'") % path);
+#else
struct stat st = lstat(path);
+#endif
if (!S_ISDIR(st.st_mode) && st.st_nlink == 1)
bytesFreed += st.st_size;
@@ -321,6 +332,9 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed)
for (auto & i : readDirectory(path))
_deletePath(path + "/" + i.name, bytesFreed);
}
+#undef st_mode
+#undef st_size
+#undef st_nlink
if (remove(path.c_str()) == -1)
throw SysError(format("cannot unlink `%1%'") % path);