void asp_nvstat(int argc, char **argv) { FILE *fp; struct nvram_header header; int part, size, used = 0; char s[20]; if (mtd_getinfo("nvram", &part, &size)) { sprintf(s, MTD_DEV(%dro), part); if ((fp = fopen(s, "r"))) { if (nvram_match("boardtype", "0x052b") && nvram_match("boardrev", "02")) { //krisan-to-Shibby: Netgear 3500L v2 if ((fread(&header, sizeof(header), 1, fp) == 1) && (header.magic == NVRAM_MAGIC)) { used = header.len; } } else { if (fseek(fp, size >= NVRAM_SPACE ? size - NVRAM_SPACE : 0, SEEK_SET) == 0) { if ((fread(&header, sizeof(header), 1, fp) == 1) && (header.magic == NVRAM_MAGIC)) { used = header.len; } } } fclose(fp); } }
void format_mount_2nd_jffs2(void) { int format = 0; char s[256]; int size; int part; const char *p; if (!wait_action_idle(10)) return; if (!mtd_getinfo(SECOND_JFFS2_PARTITION, &part, &size)) return; _dprintf("Format 2nd jffs2: %d, %d\n", part, size); if(!check_in_rootfs(SECOND_JFFS2_PATH, "2nd_jffs", format)) return; if (!mtd_unlock(SECOND_JFFS2_PARTITION)) { error("unlocking"); return; } modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); if (mount(s, SECOND_JFFS2_PATH, JFFS_NAME, MS_NOATIME, "") != 0) { if( (get_model()==MODEL_RTAC56U || get_model()==MODEL_RTAC56S || get_model()==MODEL_RTAC3200 || get_model()==MODEL_RTAC68U || get_model()==MODEL_RPAC68U || get_model()==MODEL_DSLAC68U || get_model()==MODEL_RTAC87U || get_model()==MODEL_RTAC88U || get_model()==MODEL_RTAC3100 || get_model()==MODEL_RTAC5300 || get_model==MODEL_RTAC5300R || get_model()==MODEL_RTN18U || get_model()==MODEL_RTAC1200G || get_model()==MODEL_RTAC1200GP) ^ (mtd_erase(SECOND_JFFS2_PARTITION)) ){ error("formatting"); return; } format = 1; if (mount(s, SECOND_JFFS2_PATH, JFFS_NAME, MS_NOATIME, "") != 0) { _dprintf("*** jffs2 2-nd mount error\n"); //modprobe_r(JFFS_NAME); error("mounting"); return; } } sprintf(s, "rm -rf %s/*", SECOND_JFFS2_PATH); system(s); notice_set("2nd_jffs", format ? "Formatted" : "Loaded"); if (((p = nvram_get("jffs2_exec")) != NULL) && (*p != 0)) { chdir(SECOND_JFFS2_PATH); system(p); chdir("/"); } run_userfile(SECOND_JFFS2_PATH, ".asusrouter", SECOND_JFFS2_PATH, 3); }
static int mtd_open(const char *mtdname, mtd_info_t *mi) { char path[256]; int part; int size; int f; if (mtd_getinfo(mtdname, &part, &size)) { sprintf(path, MTD_DEV(%d), part); if ((f = open(path, O_RDWR|O_SYNC)) >= 0) { if ((mi) && ioctl(f, MEMGETINFO, mi) != 0) { close(f); return -1; } return f; } }
void mount_2nd_jffs2(void) { int format = 0; char s[256]; int size; int part; int i = 0; _dprintf("Mount 2nd jffs2...\n"); while(1) { if (wait_action_idle(10)) break; else i++; if(i>=10) { _dprintf("Mount 2nd jffs2 failed!"); return; } } if (!mtd_getinfo(SECOND_JFFS2_PARTITION, &part, &size)) { _dprintf("Can not get 2nd jffs2 information!"); return; } _dprintf("2nd jffs2: %d, %d\n", part, size); if(!check_in_rootfs(SECOND_JFFS2_PATH, "2nd_jffs", format)) return; modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); i = 0; while(mount(s, SECOND_JFFS2_PATH, JFFS_NAME, MS_RDONLY, "") != 0) { _dprintf("Mount 2nd jffs failed! Try again...\n"); if(i >= 10) { _dprintf("Mount 2nd jffs 10 times failed, stop mount!"); break; } i++; } return; }
void asp_nvstat(int argc, char **argv) { FILE *fp; struct nvram_header header; int part, size, used = 0; char s[20]; if (mtd_getinfo("nvram", &part, &size)) { sprintf(s, MTD_DEV(%dro), part); if ((fp = fopen(s, "r"))) { if (fseek(fp, size >= NVRAM_SPACE ? size - NVRAM_SPACE : 0, SEEK_SET) == 0) { if ((fread(&header, sizeof(header), 1, fp) == 1) && (header.magic == NVRAM_MAGIC)) { used = header.len; } } fclose(fp); } }
void check_2nd_jffs(void) { char s[256]; int size; int part; struct statfs sf; _dprintf("2nd jffs2: %s\n", SECOND_JFFS2_PARTITION); if (!mtd_getinfo(SECOND_JFFS2_PARTITION, &part, &size)) { _dprintf("Can not get 2nd jffs2 information!"); return; } mount_2nd_jffs2(); if(access("/asus_jffs/bootcfg.tgz", R_OK ) != -1 ) { logmessage("qtn", "bootcfg.tgz exists"); system("rm -f /tmp/bootcfg.tgz"); } else { logmessage("qtn", "bootcfg.tgz does not exist"); sprintf(s, MTD_BLKDEV(%d), part); umount("/asus_jffs"); if (mount(s, SECOND_JFFS2_PATH , JFFS_NAME, MS_NOATIME, "") != 0) { logmessage("qtn", "cannot store bootcfg.tgz"); }else{ system("cp /tmp/bootcfg.tgz /asus_jffs"); system("rm -f /tmp/bootcfg.tgz"); logmessage("qtn", "backup bootcfg.tgz ok"); } } if (umount(SECOND_JFFS2_PATH)){ dbG("umount asus_jffs failed\n"); }else{ dbG("umount asus_jffs ok\n"); } // format_mount_2nd_jffs2(); }
void mount_2nd_jffs2(void) { int format = 0; char s[256]; int size; int part; struct statfs sf; int model = 0; int i = 0; _dprintf("Mount 2nd jffs2...\n"); while(1) { if (wait_action_idle(10)) break; else i++; if(i>=10) { _dprintf("Mount 2nd jffs2 failed!"); return; } } if (!mtd_getinfo(SECOND_JFFS2_PARTITION, &part, &size)) { _dprintf("Can not get 2nd jffs2 information!"); return; } _dprintf("2nd jffs2: %d, %d\n", part, size); model = get_model(); if (statfs(SECOND_JFFS2_PATH, &sf) == 0) { switch(model) { case MODEL_RTAC56S: case MODEL_RTAC56U: case MODEL_RTAC3200: case MODEL_DSLAC68U: case MODEL_RPAC68U: case MODEL_RTAC68U: case MODEL_RTAC87U: case MODEL_RTN18U: case MODEL_RTN65U: case MODEL_RTN14U: // it should be better to use LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,6,36) { if (sf.f_type != 0x73717368 /* squashfs */) { // already mounted notice_set("2nd_jffs", format ? "Formatted" : "Loaded"); return; } break; } default: { if (sf.f_type != 0x71736873 /* squashfs */) { // already mounted notice_set("2nd_jffs", format ? "Formatted" : "Loaded"); return; } break; } } } modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); i = 0; while(mount(s, SECOND_JFFS2_PATH, JFFS_NAME, MS_RDONLY, "") != 0) { _dprintf("Mount 2nd jffs failed! Try again...\n"); if(i >= 10) { _dprintf("Mount 2nd jffs 10 times failed, stop mount!"); break; } i++; } return; }
void start_jffs2(void) { if (!nvram_match("jffs2_on", "1")) { notice_set("jffs", ""); return; } int format = 0; char s[256]; int size; int part; const char *p; struct statfs sf; int model = 0; int i = 0; while(1) { if (wait_action_idle(10)) break; else i++; if(i>=10) { _dprintf("Mount jffs2 failed!"); return; } } if (!mtd_getinfo(JFFS2_PARTITION, &part, &size)) return; model = get_model(); _dprintf("start jffs2: %d, %d\n", part, size); if (nvram_match("jffs2_format", "1")) { nvram_set("jffs2_format", "0"); nvram_commit_x(); if (!mtd_erase(JFFS_NAME)) { error("formatting"); return; } format = 1; } sprintf(s, "%d", size); p = nvram_get("jffs2_size"); if ((p == NULL) || (strcmp(p, s) != 0)) { if (format) { nvram_set("jffs2_size", s); nvram_commit_x(); } else if ((p != NULL) && (*p != 0)) { error("verifying known size of"); return; } } if (statfs("/jffs", &sf) == 0) { switch(model) { case MODEL_RTAC56S: case MODEL_RTAC56U: case MODEL_RTAC3200: case MODEL_DSLAC68U: case MODEL_RPAC68U: case MODEL_RTAC68U: case MODEL_RTAC87U: case MODEL_RTN18U: case MODEL_RTN65U: case MODEL_RTN14U: // it should be better to use LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,6,36) { if (sf.f_type != 0x73717368 /* squashfs */) { // already mounted notice_set("jffs", format ? "Formatted" : "Loaded"); return; } break; } default: { if (sf.f_type != 0x71736873 /* squashfs */) { // already mounted notice_set("jffs", format ? "Formatted" : "Loaded"); return; } break; } } } if (nvram_get_int("jffs2_clean_fs")) { if (!mtd_unlock(JFFS2_PARTITION)) { error("unlocking"); return; } } modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); if (mount(s, "/jffs", JFFS_NAME, MS_NOATIME, "") != 0) { if (!mtd_erase(JFFS_NAME)) { error("formatting"); return; } format = 1; if (mount(s, "/jffs", JFFS_NAME, MS_NOATIME, "") != 0) { _dprintf("*** jffs2 2-nd mount error\n"); //modprobe_r(JFFS_NAME); error("mounting"); return; } } #ifdef TEST_INTEGRITY int test; if (format) { if (f_write("/jffs/.tomato_do_not_erase", &size, sizeof(size), 0, 0) != sizeof(size)) { stop_jffs2(0); error("setting integrity test for"); return; } } if ((f_read("/jffs/.tomato_do_not_erase", &test, sizeof(test)) != sizeof(test)) || (test != size)) { stop_jffs2(0); error("testing integrity of"); return; } #endif if (nvram_get_int("jffs2_clean_fs")) { _dprintf("Clean /jffs/*\n"); system("rm -fr /jffs/*"); nvram_unset("jffs2_clean_fs"); nvram_commit_x(); } notice_set("jffs", format ? "Formatted" : "Loaded"); if (((p = nvram_get("jffs2_exec")) != NULL) && (*p != 0)) { chdir("/jffs"); system(p); chdir("/"); } run_userfile("/jffs", ".asusrouter", "/jffs", 3); if (!check_if_dir_exist("/jffs/scripts/")) mkdir("/jffs/scripts/", 0755); if (!check_if_dir_exist("/jffs/configs/")) mkdir("/jffs/configs/", 0755); }
void format_mount_2nd_jffs2(void) { int format = 0; char s[256]; int size; int part; const char *p; struct statfs sf; int model = 0; if (!wait_action_idle(10)) return; if (!mtd_getinfo(SECOND_JFFS2_PARTITION, &part, &size)) return; _dprintf("Format 2nd jffs2: %d, %d\n", part, size); model = get_model(); sprintf(s, "%d", size); if (statfs(SECOND_JFFS2_PATH, &sf) == 0) { switch(model) { case MODEL_RTAC56S: case MODEL_RTAC56U: case MODEL_RTAC3200: case MODEL_DSLAC68U: case MODEL_RPAC68U: case MODEL_RTAC68U: case MODEL_RTAC87U: case MODEL_RTN18U: case MODEL_RTN65U: case MODEL_RTN14U: // it should be better to use LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,6,36) { if (sf.f_type != 0x73717368 /* squashfs */) { // already mounted notice_set("2nd_jffs", format ? "Formatted" : "Loaded"); return; } break; } default: { if (sf.f_type != 0x71736873 /* squashfs */) { // already mounted notice_set("2nd_jffs", format ? "Formatted" : "Loaded"); return; } break; } } } if (!mtd_unlock(SECOND_JFFS2_PARTITION)) { error("unlocking"); return; } modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); if (mount(s, SECOND_JFFS2_PATH, JFFS_NAME, MS_NOATIME, "") != 0) { if( (get_model()==MODEL_RTAC56U || get_model()==MODEL_RTAC56S || get_model()==MODEL_RTAC3200 || get_model()==MODEL_RTAC68U || get_model()==MODEL_RPAC68U || get_model()==MODEL_DSLAC68U || get_model()==MODEL_RTAC87U || get_model()==MODEL_RTN18U) ^ (!mtd_erase(JFFS_NAME)) ){ error("formatting"); return; } format = 1; if (mount(s, SECOND_JFFS2_PATH, JFFS_NAME, MS_NOATIME, "") != 0) { _dprintf("*** jffs2 2-nd mount error\n"); //modprobe_r(JFFS_NAME); error("mounting"); return; } } sprintf(s, "rm -rf %s/*", SECOND_JFFS2_PATH); system(s); notice_set("2nd_jffs", format ? "Formatted" : "Loaded"); if (((p = nvram_get("jffs2_exec")) != NULL) && (*p != 0)) { chdir(SECOND_JFFS2_PATH); system(p); chdir("/"); } run_userfile(SECOND_JFFS2_PATH, ".asusrouter", SECOND_JFFS2_PATH, 3); }
void start_jffs2(void) { if (!nvram_match("jffs2_on", "1")) { notice_set("jffs", ""); return; } int format = 0; char s[256]; int size; int part; const char *p; struct statfs sf; if (!wait_action_idle(10)) return; if (!mtd_getinfo("jffs2", &part, &size)) return; _dprintf("*** jffs2: %d, %d\n", part, size); if (nvram_match("jffs2_format", "1")) { nvram_set("jffs2_format", "0"); if (!mtd_erase("jffs2")) { error("formatting"); return; } format = 1; } sprintf(s, "%d", size); p = nvram_get("jffs2_size"); if ((p == NULL) || (strcmp(p, s) != 0)) { if (format) { nvram_set("jffs2_size", s); nvram_commit_x(); } else if ((p != NULL) && (*p != 0)) { error("verifying known size of"); return; } } if ((statfs("/jffs", &sf) == 0) && (sf.f_type != 0x71736873 /* squashfs */)) { // already mounted notice_set("jffs", format ? "Formatted" : "Loaded"); return; } if (!mtd_unlock("jffs2")) { error("unlocking"); return; } modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); if (mount(s, "/jffs", JFFS_NAME, MS_NOATIME, "") != 0) { _dprintf("*** jffs2 mount error\n"); //modprobe_r(JFFS_NAME); error("mounting"); return; } #ifdef TEST_INTEGRITY int test; if (format) { if (f_write("/jffs/.tomato_do_not_erase", &size, sizeof(size), 0, 0) != sizeof(size)) { stop_jffs2(); error("setting integrity test for"); return; } } if ((f_read("/jffs/.tomato_do_not_erase", &test, sizeof(test)) != sizeof(test)) || (test != size)) { stop_jffs2(); error("testing integrity of"); return; } #endif notice_set("jffs", format ? "Formatted" : "Loaded"); if (((p = nvram_get("jffs2_exec")) != NULL) && (*p != 0)) { chdir("/jffs"); system(p); chdir("/"); } run_userfile("/jffs", ".asusrouter", "/jffs", 3); if (!check_if_dir_exist("/jffs/scripts/")) mkdir("/jffs/scripts/", 0755); if (!check_if_dir_exist("/jffs/configs/")) mkdir("/jffs/configs/", 0755); }
void start_jffs2(void) { if (!nvram_match("jffs2_enable", "1")) { notice_set("jffs", ""); return; } int format = 0; char s[256]; int size; int part; const char *p; int model = 0; int i = 0; while(1) { if (wait_action_idle(10)) break; else i++; if(i>=10) { _dprintf("Mount jffs2 failed!"); return; } } if (!mtd_getinfo(JFFS2_PARTITION, &part, &size)) return; model = get_model(); _dprintf("start jffs2: %d, %d\n", part, size); if (nvram_match("jffs2_format", "1")) { nvram_set("jffs2_format", "0"); nvram_commit_x(); if (mtd_erase(JFFS2_MTD_NAME)) { error("formatting"); return; } format = 1; } sprintf(s, "%d", size); p = nvram_get("jffs2_size"); if ((p == NULL) || (strcmp(p, s) != 0)) { if (format) { nvram_set("jffs2_size", s); nvram_commit_x(); } else if ((p != NULL) && (*p != 0)) { error("verifying known size of"); return; } } if(!check_in_rootfs("/jffs", "jffs", format)) return; if (nvram_get_int("jffs2_clean_fs")) { if (!mtd_unlock(JFFS2_PARTITION)) { error("unlocking"); return; } } modprobe(JFFS_NAME); sprintf(s, MTD_BLKDEV(%d), part); if (mount(s, "/jffs", JFFS_NAME, MS_NOATIME, "") != 0) { if (mtd_erase(JFFS2_MTD_NAME)) { jffs2_fail = 1; error("formatting"); return; } format = 1; if (mount(s, "/jffs", JFFS_NAME, MS_NOATIME, "") != 0) { _dprintf("*** jffs2 2-nd mount error\n"); //modprobe_r(JFFS_NAME); error("mounting"); jffs2_fail = 1; return; } } if(nvram_match("force_erase_jffs2", "1")) { _dprintf("\n*** force erase jffs2 ***\n"); mtd_erase(JFFS2_MTD_NAME); nvram_set("jffs2_clean_fs", "1"); nvram_commit(); reboot(RB_AUTOBOOT); } #ifdef TEST_INTEGRITY int test; if (format) { if (f_write("/jffs/.tomato_do_not_erase", &size, sizeof(size), 0, 0) != sizeof(size)) { stop_jffs2(0); error("setting integrity test for"); return; } } if ((f_read("/jffs/.tomato_do_not_erase", &test, sizeof(test)) != sizeof(test)) || (test != size)) { stop_jffs2(0); error("testing integrity of"); return; } #endif if (nvram_get_int("jffs2_clean_fs")) { _dprintf("Clean /jffs/*\n"); system("rm -fr /jffs/*"); nvram_unset("jffs2_clean_fs"); nvram_commit_x(); } notice_set("jffs", format ? "Formatted" : "Loaded"); jffs2_fail = 0; if (((p = nvram_get("jffs2_exec")) != NULL) && (*p != 0)) { chdir("/jffs"); system(p); chdir("/"); } run_userfile("/jffs", ".asusrouter", "/jffs", 3); if (!check_if_dir_exist("/jffs/scripts/")) mkdir("/jffs/scripts/", 0755); if (!check_if_dir_exist("/jffs/configs/")) mkdir("/jffs/configs/", 0755); }