X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=jffs2reset.c;h=97fd0ab51b5fd9d97a84f6729b6804b35a99da7b;hp=c9d4f5fb182cfe1027a78dee77d4dc2f1eeffa52;hb=5b61e27d36e5bbf40825a4ae14920efe47d36f02;hpb=2d6bccbb70ce2f8195aad348c653c4c13f21c90c diff --git a/jffs2reset.c b/jffs2reset.c index c9d4f5f..97fd0ab 100644 --- a/jffs2reset.c +++ b/jffs2reset.c @@ -14,7 +14,7 @@ #include #include #include - +#include #include #include @@ -23,74 +23,57 @@ #include #include #include +#include + #include "libfstools/libfstools.h" #include "libfstools/volume.h" +static int jffs2_mark(struct volume *v); + static int -ask_user(int argc, char **argv) +ask_user(void) { - if ((argc < 2) || strcmp(argv[1], "-y")) { - ULOG_WARN("This will erase all settings and remove any installed packages. Are you sure? [N/y]\n"); - if (getchar() != 'y') - return -1; - } + ULOG_WARN("This will erase all settings and remove any installed packages. Are you sure? [N/y]\n"); + if (getchar() != 'y') + return -1; return 0; - } -static int -jffs2_reset(int argc, char **argv) +static int jffs2_reset(struct volume *v, int reset) { - struct volume *v; char *mp; - if (ask_user(argc, argv)) - return -1; - - if (find_filesystem("overlay")) { - ULOG_ERR("overlayfs not supported by kernel\n"); - return -1; - } - - v = volume_find("rootfs_data"); - if (!v) { - ULOG_ERR("MTD partition 'rootfs_data' not found\n"); - return -1; - } - mp = find_mount_point(v->blk, 1); if (mp) { ULOG_INFO("%s is mounted as %s, only erasing files\n", v->blk, mp); + fs_state_set("/overlay", FS_STATE_PENDING); overlay_delete(mp, false); mount(mp, "/", NULL, MS_REMOUNT, 0); } else { - ULOG_INFO("%s is not mounted, erasing it\n", v->blk); - volume_erase_all(v); + ULOG_INFO("%s is not mounted\n", v->blk); + return jffs2_mark(v); + } + + if (reset) { + sync(); + sleep(2); + reboot(RB_AUTOBOOT); + while (1) + ; } return 0; } -static int -jffs2_mark(int argc, char **argv) +static int jffs2_mark(struct volume *v) { __u32 deadc0de = __cpu_to_be32(0xdeadc0de); - struct volume *v; size_t sz; int fd; - if (ask_user(argc, argv)) - return -1; - - v = volume_find("rootfs_data"); - if (!v) { - ULOG_ERR("MTD partition 'rootfs_data' not found\n"); - return -1; - } - fd = open(v->blk, O_WRONLY); - ULOG_INFO("%s - marking with deadc0de\n", v->blk); + ULOG_INFO("%s will be erased on next mount\n", v->blk); if (!fd) { ULOG_ERR("opening %s failed\n", v->blk); return -1; @@ -109,7 +92,40 @@ jffs2_mark(int argc, char **argv) int main(int argc, char **argv) { + struct volume *v; + int ch, yes = 0, reset = 0; + while ((ch = getopt(argc, argv, "yr")) != -1) { + switch(ch) { + case 'y': + yes = 1; + break; + case 'r': + reset = 1; + break; + } + + } + + if (!yes && ask_user()) + return -1; + + /* + * TODO: Currently this only checks if kernel supports OverlayFS. We + * should check if there is a mount point using it with rootfs_data + * as upperdir. + */ + if (find_filesystem("overlay")) { + ULOG_ERR("overlayfs not supported by kernel\n"); + return -1; + } + + v = volume_find("rootfs_data"); + if (!v) { + ULOG_ERR("MTD partition 'rootfs_data' not found\n"); + return -1; + } + if (!strcmp(*argv, "jffs2mark")) - return jffs2_mark(argc, argv); - return jffs2_reset(argc, argv); + return jffs2_mark(v); + return jffs2_reset(v, reset); }