diff options
Diffstat (limited to 'mdk-stage1/cdrom.c')
-rw-r--r-- | mdk-stage1/cdrom.c | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c index ba0341b30..71db1da16 100644 --- a/mdk-stage1/cdrom.c +++ b/mdk-stage1/cdrom.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -30,6 +30,8 @@ #include "probing.h" #include "log.h" #include "mount.h" +#include "tools.h" +#include "utils.h" #include "cdrom.h" @@ -37,17 +39,15 @@ static int mount_that_cd_device(char * dev_name) { char device_fullname[50]; + int mount_result; - strcpy(device_fullname, "/dev/"); - strcat(device_fullname, dev_name); + snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev_name); - return my_mount(device_fullname, IMAGE_LOCATION, "iso9660", 0); -} + mount_result = my_mount(device_fullname, MEDIA_LOCATION, "iso9660", 0); + create_IMAGE_LOCATION(MEDIA_LOCATION); -static int test_that_cd() -{ - return access(IMAGE_LOCATION LIVE_LOCATION, R_OK); + return mount_result; } @@ -55,9 +55,9 @@ static enum return_type try_with_device(char * dev_name, char * dev_model); static enum return_type do_with_device(char * dev_name, char * dev_model) { - if (test_that_cd()) { + if (!image_has_stage2()) { enum return_type results; - umount(IMAGE_LOCATION); + umount(MEDIA_LOCATION); results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?"); if (results == RETURN_OK) return try_with_device(dev_name, dev_model); @@ -66,13 +66,13 @@ static enum return_type do_with_device(char * dev_name, char * dev_model) log_message("found a " DISTRIB_NAME " CDROM, good news!"); - if (IS_SPECIAL_STAGE2 || ramdisk_possible()) - load_ramdisk(); /* we don't care about return code, we'll do it live if we failed */ + may_load_compressed_image(); - if (IS_RESCUE) - umount(IMAGE_LOCATION); + if (!KEEP_MOUNTED) + /* in rescue mode, we don't need the media anymore */ + umount(MEDIA_LOCATION); - method_name = strdup("cdrom"); + add_to_env("METHOD", "cdrom"); return RETURN_OK; } @@ -83,7 +83,7 @@ static enum return_type try_with_device(char * dev_name, char * 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 */ + unset_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); @@ -113,12 +113,12 @@ int try_automatic(char ** medias, char ** medias_models) wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); if (mount_that_cd_device(*ptr) != -1) { - if (!test_that_cd()) { + if (image_has_stage2()) { remove_wait_message(); return i; } else - umount(IMAGE_LOCATION); + umount(MEDIA_LOCATION); } remove_wait_message(); @@ -136,15 +136,20 @@ enum return_type cdrom_prepare(void) char * choice; int i, count = 0; enum return_type results; + static int already_probed_ide_generic = 0; - my_insmod("ide-cd", ANY_DRIVER_TYPE, NULL); + my_modprobe("ide_cd_mod", ANY_DRIVER_TYPE, NULL); if (IS_AUTOMATIC) { get_medias(CDROM, &medias, &medias_models, BUS_IDE); if ((i = try_automatic(medias, medias_models)) != -1) return do_with_device(medias[i], medias_models[i]); - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL); + get_medias(CDROM, &medias, &medias_models, BUS_PCMCIA); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL); get_medias(CDROM, &medias, &medias_models, BUS_SCSI); if ((i = try_automatic(medias, medias_models)) != -1) return do_with_device(medias[i], medias_models[i]); @@ -153,9 +158,16 @@ enum return_type cdrom_prepare(void) if ((i = try_automatic(medias, medias_models)) != -1) return do_with_device(medias[i], medias_models[i]); - unset_param(MODE_AUTOMATIC); + /* detect hybrid isos (isos dumped to an USB stick) */ + my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL); + get_medias(DISK, &medias, &medias_models, BUS_USB); + if ((i = try_automatic(medias, medias_models)) != -1) { + return do_with_device(medias[i], medias_models[i]); + } + + unset_automatic(); } else - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL); + my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL); get_medias(CDROM, &medias, &medias_models, BUS_ANY); @@ -166,8 +178,13 @@ enum return_type cdrom_prepare(void) } if (count == 0) { + if (!already_probed_ide_generic) { + already_probed_ide_generic = 1; + my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL); + return cdrom_prepare(); + } stg1_error_message("No CDROM device found."); - i = ask_insmod(SCSI_ADAPTERS); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return cdrom_prepare(); @@ -177,7 +194,7 @@ enum return_type cdrom_prepare(void) results = try_with_device(*medias, *medias_models); if (results == RETURN_OK) return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return cdrom_prepare(); @@ -202,7 +219,7 @@ enum return_type cdrom_prepare(void) if (results == RETURN_BACK) return cdrom_prepare(); - i = ask_insmod(SCSI_ADAPTERS); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return cdrom_prepare(); |