summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/cdrom.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/cdrom.c')
-rw-r--r--mdk-stage1/cdrom.c69
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();