static int process_config(VolumeManager *vm) { FILE *fp; int n = 0; char line[255]; Volume *vol = 0; if ((fp = fopen("/proc/cmdline", "r"))) { while (fscanf(fp, "%s", line) > 0) { if (!strncmp(line, "SDCARD=", 7)) { const char *sdcard = line + 7; if (*sdcard) { // FIXME: should not hardcode the label and mount_point if ((vol = new AutoVolume(vm, "sdcard", "/mnt/sdcard", sdcard))) { vm->addVolume(vol); break; } } } } fclose(fp); } if (!(fp = fopen("/etc/vold.fstab", "r"))) { // no volume added yet, create a AutoVolume object // to mount USB/MMC/SD automatically if (!vol) { // FIXME: should not hardcode the label and mount_point vol = new AutoVolume(vm, "sdcard", "/mnt/sdcard"); if (vol) vm->addVolume(vol); } return vol ? 0 : -ENOMEM; } while(fgets(line, sizeof(line), fp)) { const char *delim = " \t"; char *save_ptr; char *type, *label, *mount_point, *mount_flags, *sysfs_path; int flags; n++; line[strlen(line)-1] = '\0'; if (line[0] == '#' || line[0] == '\0') continue; if (!(type = strtok_r(line, delim, &save_ptr))) { SLOGE("Error parsing type"); goto out_syntax; } if (!(label = strtok_r(NULL, delim, &save_ptr))) { SLOGE("Error parsing label"); goto out_syntax; } if (!(mount_point = strtok_r(NULL, delim, &save_ptr))) { SLOGE("Error parsing mount point"); goto out_syntax; } if (!strcmp(type, "dev_mount")) { DirectVolume *dv = NULL; char *part; if (!(part = strtok_r(NULL, delim, &save_ptr))) { SLOGE("Error parsing partition"); goto out_syntax; } if (strcmp(part, "auto") && atoi(part) == 0) { SLOGE("Partition must either be 'auto' or 1 based index instead of '%s'", part); goto out_syntax; } const char *sdcard = 0; while ((sysfs_path = strtok_r(NULL, delim, &save_ptr))) { if ((sdcard = strncmp(sysfs_path, "SDCARD=", 7) ? 0 : sysfs_path + 7)) break; if (!dv) { if (!strcmp(part, "auto")) { dv = new DirectVolume(vm, label, mount_point, -1); } else { dv = new DirectVolume(vm, label, mount_point, atoi(part)); } } if (*sysfs_path != '/') { /* If the first character is not a '/', it must be flags */ break; } if (dv->addPath(sysfs_path)) { SLOGE("Failed to add devpath %s to volume %s", sysfs_path, label); goto out_fail; } } if (!dv) { dv = new AutoVolume(vm, label, mount_point, sdcard); } /* If sysfs_path is non-null at this point, then it contains * the optional flags for this volume */ if (sysfs_path) flags = parse_mount_flags(sysfs_path); else flags = 0; dv->setFlags(flags); vm->addVolume(dv); } else if (!strcmp(type, "map_mount")) { } else { SLOGE("Unknown type '%s'", type); goto out_syntax; } } fclose(fp); return 0; out_syntax: SLOGE("Syntax error on config line %d", n); errno = -EINVAL; out_fail: fclose(fp); return -1; }
static int process_config(VolumeManager *vm) { FILE *fp; int n = 0; char line[255]; if (!(fp = fopen("/etc/vold.fstab", "r"))) { return -1; } while(fgets(line, sizeof(line), fp)) { const char *delim = " \t"; char *save_ptr; char *type, *label, *mount_point, *mount_flags, *sysfs_path; int flags; n++; line[strlen(line)-1] = '\0'; if (line[0] == '#' || line[0] == '\0') continue; if (!(type = strtok_r(line, delim, &save_ptr))) { SLOGE("Error parsing type"); goto out_syntax; } if (!(label = strtok_r(NULL, delim, &save_ptr))) { SLOGE("Error parsing label"); goto out_syntax; } if (!(mount_point = strtok_r(NULL, delim, &save_ptr))) { SLOGE("Error parsing mount point"); goto out_syntax; } if (!strcmp(type, "dev_mount")) { DirectVolume *dv = NULL; char *part; if (!(part = strtok_r(NULL, delim, &save_ptr))) { SLOGE("Error parsing partition"); goto out_syntax; } if (strcmp(part, "auto") && atoi(part) == 0) { SLOGE("Partition must either be 'auto' or 1 based index instead of '%s'", part); goto out_syntax; } if (!strcmp(part, "auto")) { dv = new DirectVolume(vm, label, mount_point, -1); } else { dv = new DirectVolume(vm, label, mount_point, atoi(part)); } while ((sysfs_path = strtok_r(NULL, delim, &save_ptr))) { if (*sysfs_path != '/') { /* If the first character is not a '/', it must be flags */ break; } if (dv->addPath(sysfs_path)) { SLOGE("Failed to add devpath %s to volume %s", sysfs_path, label); goto out_fail; } } /* If sysfs_path is non-null at this point, then it contains * the optional flags for this volume */ if (sysfs_path) flags = parse_mount_flags(sysfs_path); else flags = 0; dv->setFlags(flags); vm->addVolume(dv); } else if (!strcmp(type, "map_mount")) { } else { SLOGE("Unknown type '%s'", type); goto out_syntax; } } fclose(fp); return 0; out_syntax: SLOGE("Syntax error on config line %d", n); errno = -EINVAL; out_fail: fclose(fp); return -1; }