block: rework config loading
[project/fstools.git] / jffs2reset.c
index 0673982..13edf1e 100644 (file)
 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;
@@ -84,7 +84,7 @@ jffs2_reset(int argc, char **argv)
                return -1;
        }
 
-       mp = find_mount_point(v->blk, "jffs2");
+       mp = find_mount_point(v->blk, 1);
        if (mp) {
                fprintf(stderr, "%s is mounted as %s, only erasing files\n", v->blk, mp);
                foreachdir(mp, handle_rmdir);
@@ -124,7 +124,7 @@ jffs2_mark(int argc, char **argv)
        sz = write(fd, &deadc0de, sizeof(deadc0de));
        close(fd);
 
-       if (sz != 1) {
+       if (sz != 4) {
                fprintf(stderr, "writing %s failed: %s\n", v->blk, strerror(errno));
                return -1;
        }