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(); | 
