wip
diff --git a/roots.c b/roots.c
index ba1786b..e28eedc 100644
--- a/roots.c
+++ b/roots.c
@@ -56,6 +56,28 @@
return strdup(sz);
}
+static int parse_options(char* options, Volume* volume) {
+ char* option;
+ while (option = strtok(options, ",")) {
+ options = NULL;
+
+ if (strncmp(option, "length=", 7) == 0) {
+ volume->length = strtoll(option+7, NULL, 10);
+ } else if (strncmp(option, "fstype2=", 8) == 0) {
+ volume->fs_type2 = volume->fs_type;
+ volume->fs_type = strdup(option);
+ } else if (strncmp(option, "fs_options=", 11) == 0) {
+ volume->fs_options = strdup(option);
+ } else if (strncmp(option, "fs_options2=", 12) == 0) {
+ volume->fs_options2 = strdup(option);
+ } else {
+ LOGE("bad option \"%s\"\n", option);
+ return -1;
+ }
+ }
+ return 0;
+}
+
void load_volume_table() {
int alloc = 2;
device_volumes = malloc(alloc * sizeof(Volume));
@@ -65,8 +87,10 @@
device_volumes[0].fs_type = "ramdisk";
device_volumes[0].device = NULL;
device_volumes[0].device2 = NULL;
+ device_volumes[0].fs_type2 = NULL;
device_volumes[0].fs_options = NULL;
device_volumes[0].fs_options2 = NULL;
+ device_volumes[0].length = 0;
num_volumes = 1;
FILE* fstab = fopen("/etc/recovery.fstab", "r");
@@ -88,10 +112,16 @@
char* device = strtok(NULL, " \t\n");
// lines may optionally have a second device, to use if
// mounting the first one fails.
+ char* options = NULL;
char* device2 = strtok(NULL, " \t\n");
- char* fs_type2 = strtok(NULL, " \t\n");
- char* fs_options = strtok(NULL, " \t\n");
- char* fs_options2 = strtok(NULL, " \t\n");
+ if (device2) {
+ if (device2[0] == '/') {
+ options = strtok(NULL, " \t\n");
+ } else {
+ options = device2;
+ device2 = NULL;
+ }
+ }
if (mount_point && fs_type && device) {
while (num_volumes >= alloc) {
@@ -99,21 +129,17 @@
device_volumes = realloc(device_volumes, alloc*sizeof(Volume));
}
device_volumes[num_volumes].mount_point = strdup(mount_point);
- device_volumes[num_volumes].fs_type = !is_null(fs_type2) ? strdup(fs_type2) : strdup(fs_type);
+ device_volumes[num_volumes].fs_type = strdup(fs_type);
device_volumes[num_volumes].device = strdup(device);
device_volumes[num_volumes].device2 =
- !is_null(device2) ? strdup(device2) : NULL;
- device_volumes[num_volumes].fs_type2 = !is_null(fs_type2) ? strdup(fs_type) : NULL;
+ device2 ? strdup(device2) : NULL;
- if (!is_null(fs_type2)) {
- device_volumes[num_volumes].fs_options2 = dupe_string(fs_options);
- device_volumes[num_volumes].fs_options = dupe_string(fs_options2);
+ device_volumes[num_volumes].length = 0;
+ if (parse_options(options, device_volumes + num_volumes) != 0) {
+ LOGE("skipping malformed recovery.fstab line: %s\n", original);
+ } else {
+ ++num_volumes;
}
- else {
- device_volumes[num_volumes].fs_options2 = NULL;
- device_volumes[num_volumes].fs_options = dupe_string(fs_options);
- }
- ++num_volumes;
} else {
LOGE("skipping malformed recovery.fstab line: %s\n", original);
}
@@ -126,8 +152,8 @@
printf("=========================\n");
for (i = 0; i < num_volumes; ++i) {
Volume* v = &device_volumes[i];
- printf(" %d %s %s %s %s\n", i, v->mount_point, v->fs_type,
- v->device, v->device2);
+ printf(" %d %s %s %s %s %lld\n", i, v->mount_point, v->fs_type,
+ v->device, v->device2, v->length);
}
printf("\n");
}
@@ -345,8 +371,7 @@
}
if (strcmp(v->fs_type, "ext4") == 0) {
- reset_ext4fs_info();
- int result = make_ext4fs(v->device, NULL, NULL, 0, 0, 0);
+ int result = make_ext4fs(v->device, v->length);
if (result != 0) {
LOGE("format_volume: make_extf4fs failed on %s\n", v->device);
return -1;