diff options
Diffstat (limited to 'mdk-stage1')
-rw-r--r-- | mdk-stage1/NEWS | 2 | ||||
-rw-r--r-- | mdk-stage1/disk.c | 63 |
2 files changed, 65 insertions, 0 deletions
diff --git a/mdk-stage1/NEWS b/mdk-stage1/NEWS index 05fd79458..24a188c10 100644 --- a/mdk-stage1/NEWS +++ b/mdk-stage1/NEWS @@ -1,3 +1,5 @@ +- automatically find compressed stage2 with automatic=method:disk + 1.31: - usbkbd is dead, using usbhid instead diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index b682872e1..acdc1efaf 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.c @@ -42,6 +42,62 @@ #include "disk.h" +static enum return_type try_automatic_with_partition(char *dev) { + enum return_type results; + int mounted; + wait_message("Trying to access " DISTRIB_NAME " disk (partition %s)", dev); + mounted = !try_mount(dev, MEDIA_LOCATION); + remove_wait_message(); + if (mounted && !access(MEDIA_LOCATION "/" COMPRESSED_LOCATION_REL, R_OK)) { + results = try_with_directory(MEDIA_LOCATION, "disk", "disk-iso"); + if (results == RETURN_OK) { + if (!KEEP_MOUNTED) + umount(MEDIA_LOCATION); + return RETURN_OK; + } + } + if (mounted) + umount(MEDIA_LOCATION); + return RETURN_ERROR; +} + +static enum return_type try_automatic_with_disk(char *disk, char *model) { + char * parts[50]; + char * parts_comments[50]; + enum return_type results; + char **dev; + wait_message("Trying to access " DISTRIB_NAME " disk (drive %s)", model); + if (list_partitions(disk, parts, parts_comments)) { + stg1_error_message("Could not read partitions information."); + return RETURN_ERROR; + } + remove_wait_message(); + dev = parts; + while (dev && *dev) { + results = try_automatic_with_partition(*dev); + if (results == RETURN_OK) { + return RETURN_OK; + } + dev++; + } + return RETURN_ERROR; +} + +static enum return_type try_automatic(char ** medias, char ** medias_models) +{ + char ** model = medias_models; + char ** ptr = medias; + while (ptr && *ptr) { + enum return_type results; + results = try_automatic_with_disk(*ptr, *model); + if (results == RETURN_OK) + return RETURN_OK; + ptr++; + model++; + } + return RETURN_ERROR; +} + static enum return_type try_with_device(char *dev_name) { char * questions_location[] = { "Directory or ISO images directory or ISO image", NULL }; @@ -122,6 +178,13 @@ enum return_type disk_prepare(void) int count = get_disks(&medias, &medias_models); + if (IS_AUTOMATIC) { + results = try_automatic(medias, medias_models); + if (results != RETURN_ERROR) + return results; + unset_automatic(); + } + if (count == 0) { if (!already_probed_ide_generic) { already_probed_ide_generic = 1; |