Loading adb/remount_service.c +27 −19 Original line number Diff line number Diff line Loading @@ -30,19 +30,19 @@ static int system_ro = 1; /* Returns the mount number of the requested partition from /proc/mtd */ static int find_mount(const char *findme) /* Returns the device used to mount a directory in /proc/mounts */ static char *find_mount(const char *dir) { int fd; int res; int size; char *token = NULL; const char delims[] = "\n"; char buf[1024]; char buf[4096]; fd = unix_open("/proc/mtd", O_RDONLY); fd = unix_open("/proc/mounts", O_RDONLY); if (fd < 0) return -errno; return NULL; buf[sizeof(buf) - 1] = '\0'; size = adb_read(fd, buf, sizeof(buf) - 1); Loading @@ -51,33 +51,41 @@ static int find_mount(const char *findme) token = strtok(buf, delims); while (token) { char mtdname[16]; int mtdnum, mtdsize, mtderasesize; res = sscanf(token, "mtd%d: %x %x %15s", &mtdnum, &mtdsize, &mtderasesize, mtdname); if (res == 4 && !strcmp(mtdname, findme)) return mtdnum; char mount_dev[256]; char mount_dir[256]; int mount_freq; int mount_passno; res = sscanf(token, "%255s %255s %*s %*s %d %d\n", mount_dev, mount_dir, &mount_freq, &mount_passno); mount_dev[255] = 0; mount_dir[255] = 0; if (res == 4 && (strcmp(dir, mount_dir) == 0)) return strdup(mount_dev); token = strtok(NULL, delims); } return -1; return NULL; } /* Init mounts /system as read only, remount to enable writes. */ static int remount_system() { int num; char source[64]; char *dev; if (system_ro == 0) { return 0; } if ((num = find_mount("\"system\"")) < 0) dev = find_mount("/system"); if (!dev) return -1; snprintf(source, sizeof source, "/dev/block/mtdblock%d", num); system_ro = mount(source, "/system", "yaffs2", MS_REMOUNT, NULL); system_ro = mount(dev, "/system", "none", MS_REMOUNT, NULL); free(dev); return system_ro; } Loading toolbox/mount.c +51 −3 Original line number Diff line number Diff line Loading @@ -222,9 +222,50 @@ static int print_mounts() return 0; } static int get_mounts_dev_dir(const char *arg, char **dev, char **dir) { FILE *f; char mount_dev[256]; char mount_dir[256]; char mount_type[256]; char mount_opts[256]; int mount_freq; int mount_passno; int match; f = fopen("/proc/mounts", "r"); if (!f) { fprintf(stdout, "could not open /proc/mounts\n"); return -1; } do { match = fscanf(f, "%255s %255s %255s %255s %d %d\n", mount_dev, mount_dir, mount_type, mount_opts, &mount_freq, &mount_passno); mount_dev[255] = 0; mount_dir[255] = 0; mount_type[255] = 0; mount_opts[255] = 0; if (match == 6 && (strcmp(arg, mount_dev) == 0 || strcmp(arg, mount_dir) == 0)) { *dev = strdup(mount_dev); *dir = strdup(mount_dir); fclose(f); return 0; } } while (match != EOF); fclose(f); return -1; } int mount_main(int argc, char *argv[]) { char *type = NULL; char *dev = NULL; char *dir = NULL; int c; int loop = 0; Loading Loading @@ -265,12 +306,19 @@ int mount_main(int argc, char *argv[]) if (rwflag & MS_TYPE) type = "none"; if (optind + 2 != argc || type == NULL) { if (optind + 2 == argc) { dev = argv[optind]; dir = argv[optind + 1]; } else if (optind + 1 == argc && rwflag & MS_REMOUNT) { get_mounts_dev_dir(argv[optind], &dev, &dir); } if (dev == NULL || dir == NULL || type == NULL) { fprintf(stderr, "Usage: %s [-r] [-w] [-o options] [-t type] " "device directory\n", progname); exit(1); } return do_mount(argv[optind], argv[optind + 1], type, rwflag, extra.str, loop); return do_mount(dev, dir, type, rwflag, extra.str, loop); /* We leak dev and dir in some cases, but we're about to exit */ } Loading
adb/remount_service.c +27 −19 Original line number Diff line number Diff line Loading @@ -30,19 +30,19 @@ static int system_ro = 1; /* Returns the mount number of the requested partition from /proc/mtd */ static int find_mount(const char *findme) /* Returns the device used to mount a directory in /proc/mounts */ static char *find_mount(const char *dir) { int fd; int res; int size; char *token = NULL; const char delims[] = "\n"; char buf[1024]; char buf[4096]; fd = unix_open("/proc/mtd", O_RDONLY); fd = unix_open("/proc/mounts", O_RDONLY); if (fd < 0) return -errno; return NULL; buf[sizeof(buf) - 1] = '\0'; size = adb_read(fd, buf, sizeof(buf) - 1); Loading @@ -51,33 +51,41 @@ static int find_mount(const char *findme) token = strtok(buf, delims); while (token) { char mtdname[16]; int mtdnum, mtdsize, mtderasesize; res = sscanf(token, "mtd%d: %x %x %15s", &mtdnum, &mtdsize, &mtderasesize, mtdname); if (res == 4 && !strcmp(mtdname, findme)) return mtdnum; char mount_dev[256]; char mount_dir[256]; int mount_freq; int mount_passno; res = sscanf(token, "%255s %255s %*s %*s %d %d\n", mount_dev, mount_dir, &mount_freq, &mount_passno); mount_dev[255] = 0; mount_dir[255] = 0; if (res == 4 && (strcmp(dir, mount_dir) == 0)) return strdup(mount_dev); token = strtok(NULL, delims); } return -1; return NULL; } /* Init mounts /system as read only, remount to enable writes. */ static int remount_system() { int num; char source[64]; char *dev; if (system_ro == 0) { return 0; } if ((num = find_mount("\"system\"")) < 0) dev = find_mount("/system"); if (!dev) return -1; snprintf(source, sizeof source, "/dev/block/mtdblock%d", num); system_ro = mount(source, "/system", "yaffs2", MS_REMOUNT, NULL); system_ro = mount(dev, "/system", "none", MS_REMOUNT, NULL); free(dev); return system_ro; } Loading
toolbox/mount.c +51 −3 Original line number Diff line number Diff line Loading @@ -222,9 +222,50 @@ static int print_mounts() return 0; } static int get_mounts_dev_dir(const char *arg, char **dev, char **dir) { FILE *f; char mount_dev[256]; char mount_dir[256]; char mount_type[256]; char mount_opts[256]; int mount_freq; int mount_passno; int match; f = fopen("/proc/mounts", "r"); if (!f) { fprintf(stdout, "could not open /proc/mounts\n"); return -1; } do { match = fscanf(f, "%255s %255s %255s %255s %d %d\n", mount_dev, mount_dir, mount_type, mount_opts, &mount_freq, &mount_passno); mount_dev[255] = 0; mount_dir[255] = 0; mount_type[255] = 0; mount_opts[255] = 0; if (match == 6 && (strcmp(arg, mount_dev) == 0 || strcmp(arg, mount_dir) == 0)) { *dev = strdup(mount_dev); *dir = strdup(mount_dir); fclose(f); return 0; } } while (match != EOF); fclose(f); return -1; } int mount_main(int argc, char *argv[]) { char *type = NULL; char *dev = NULL; char *dir = NULL; int c; int loop = 0; Loading Loading @@ -265,12 +306,19 @@ int mount_main(int argc, char *argv[]) if (rwflag & MS_TYPE) type = "none"; if (optind + 2 != argc || type == NULL) { if (optind + 2 == argc) { dev = argv[optind]; dir = argv[optind + 1]; } else if (optind + 1 == argc && rwflag & MS_REMOUNT) { get_mounts_dev_dir(argv[optind], &dev, &dir); } if (dev == NULL || dir == NULL || type == NULL) { fprintf(stderr, "Usage: %s [-r] [-w] [-o options] [-t type] " "device directory\n", progname); exit(1); } return do_mount(argv[optind], argv[optind + 1], type, rwflag, extra.str, loop); return do_mount(dev, dir, type, rwflag, extra.str, loop); /* We leak dev and dir in some cases, but we're about to exit */ }