diff options
-rw-r--r-- | mdk-stage1/cdrom.c | 72 |
1 files changed, 52 insertions, 20 deletions
diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c index 015151c4d..f05bc0341 100644 --- a/mdk-stage1/cdrom.c +++ b/mdk-stage1/cdrom.c @@ -34,31 +34,28 @@ #include "cdrom.h" - -static enum return_type try_with_device(char *dev_name, char * dev_model) +static int mount_that_cd_device(char * dev_name) { char device_fullname[50]; strcpy(device_fullname, "/dev/"); strcat(device_fullname, dev_name); - wait_message("Trying to access a CDROM disc (drive %s)", dev_model); + return my_mount(device_fullname, IMAGE_LOCATION, "iso9660"); +} - if (my_mount(device_fullname, IMAGE_LOCATION, "iso9660") == -1) { - enum return_type results; - char msg[500]; - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ - remove_wait_message(); - snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model); - results = ask_yes_no(msg); - if (results == RETURN_OK) - return try_with_device(dev_name, dev_model); - return results; - } - remove_wait_message(); +static int test_that_cd() +{ + return access(IMAGE_LOCATION LIVE_LOCATION, R_OK); +} + + +static enum return_type try_with_device(char * dev_name, char * dev_model); - if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) { +static enum return_type do_with_device(char * dev_name, char * dev_model) +{ + if (test_that_cd()) { enum return_type results; umount(IMAGE_LOCATION); results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?"); @@ -77,6 +74,27 @@ static enum return_type try_with_device(char *dev_name, char * dev_model) method_name = strdup("cdrom"); return RETURN_OK; +} + +static enum return_type try_with_device(char * dev_name, char * dev_model) +{ + wait_message("Trying to access a CDROM disc (drive %s)", dev_model); + + if (mount_that_cd_device(dev_name) == -1) { + enum return_type results; + char msg[500]; + unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ + remove_wait_message(); + + snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model); + results = ask_yes_no(msg); + if (results == RETURN_OK) + return try_with_device(dev_name, dev_model); + return results; + } + remove_wait_message(); + + return do_with_device(dev_name, dev_model); } enum return_type cdrom_prepare(void) @@ -116,10 +134,24 @@ enum return_type cdrom_prepare(void) } if (IS_AUTOMATIC) { - results = try_with_device(*medias, *medias_models); - if (results != RETURN_OK) - unset_param(MODE_AUTOMATIC); - return results; + char ** model = medias_models; + ptr = medias; + while (ptr && *ptr) { + wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); + if (mount_that_cd_device(*ptr) != -1) { + if (!test_that_cd()) { + remove_wait_message(); + return do_with_device(*ptr, *model); + } + else + umount(IMAGE_LOCATION); + } + remove_wait_message(); + ptr++; + model++; + } + unset_param(MODE_AUTOMATIC); + return cdrom_prepare(); } else { results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); |