From: Felix Fietkau Date: Sun, 11 Jan 2015 16:52:46 +0000 (+0100) Subject: jffs2reset: fix recursive file/directory removal X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=142e693368ab09c7d10305fbff1550692d803630;p=oweals%2Ffstools.git jffs2reset: fix recursive file/directory removal Signed-off-by: Felix Fietkau --- 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;