From 142e693368ab09c7d10305fbff1550692d803630 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 11 Jan 2015 17:52:46 +0100 Subject: [PATCH 1/1] jffs2reset: fix recursive file/directory removal Signed-off-by: Felix Fietkau --- jffs2reset.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/jffs2reset.c b/jffs2reset.c index 5684872..13edf1e 100644 --- a/jffs2reset.c +++ b/jffs2reset.c @@ -28,25 +28,25 @@ static int handle_rmdir(const char *dir) { - struct stat s; - struct dirent **namelist; - int n; - - n = scandir(dir, &namelist, NULL, NULL); + struct dirent *dt; + struct stat st; + DIR *d; + int fd; - if (n < 1) + d = opendir(dir); + if (!d) return -1; - while (n--) { - char file[256]; + fd = dirfd(d); + + while ((dt = readdir(d)) != NULL) { + if (fstatat(fd, dt->d_name, &st, AT_SYMLINK_NOFOLLOW) || S_ISDIR(st.st_mode)) + continue; - snprintf(file, sizeof(file), "%s%s", dir, namelist[n]->d_name); - if (!lstat(file, &s) && !S_ISDIR(s.st_mode)) - unlink(file); - free(namelist[n]); + unlinkat(fd, dt->d_name, 0); } - free(namelist); + closedir(d); rmdir(dir); return 0; -- 2.11.0