From: Ryan Gonzalez Date: Mon, 7 Jan 2019 18:27:38 +0000 (-0600) Subject: stat-util: Add dir_is_empty_at X-Git-Tag: v241-rc1~67^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d7c1a15edf3dac93222ed2a0116a03e7fe022920;p=thirdparty%2Fsystemd.git stat-util: Add dir_is_empty_at --- diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 57700e2388a..fdc82c61bcd 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -67,13 +67,22 @@ int is_device_node(const char *path) { return !!(S_ISBLK(info.st_mode) || S_ISCHR(info.st_mode)); } -int dir_is_empty(const char *path) { - _cleanup_closedir_ DIR *d; +int dir_is_empty_at(int dir_fd, const char *path) { + _cleanup_close_ int fd = -1; + _cleanup_closedir_ DIR *d = NULL; struct dirent *de; - d = opendir(path); + if (path) + fd = openat(dir_fd, path, O_RDONLY|O_DIRECTORY|O_CLOEXEC); + else + fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); + if (fd < 0) + return -errno; + + d = fdopendir(fd); if (!d) return -errno; + fd = -1; FOREACH_DIRENT(de, d, return -errno) return 0; diff --git a/src/basic/stat-util.h b/src/basic/stat-util.h index 0a08e642b54..74fb7251b38 100644 --- a/src/basic/stat-util.h +++ b/src/basic/stat-util.h @@ -15,7 +15,10 @@ int is_dir(const char *path, bool follow); int is_dir_fd(int fd); int is_device_node(const char *path); -int dir_is_empty(const char *path); +int dir_is_empty_at(int dir_fd, const char *path); +static inline int dir_is_empty(const char *path) { + return dir_is_empty_at(AT_FDCWD, path); +} static inline int dir_is_populated(const char *path) { int r;