2004-01-20 21:32:43 +03:00
/*
* Guillaume Cottenceau ( gc @ mandrakesoft . com )
*
* Copyright 2000 MandrakeSoft
*
* This software may be freely redistributed under the terms of the GNU
* public license .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
*/
/*
* Portions from Erik Troan ( ewt @ redhat . com )
*
* Copyright 1996 Red Hat Software
*
*/
2008-04-10 14:35:23 +04:00
# include <sys/types.h>
# include <sys/stat.h>
2004-01-20 21:32:43 +03:00
# include <stdlib.h>
# include <unistd.h>
# include <string.h>
# include <stdio.h>
# include <sys/mount.h>
# include "stage1.h"
# include "frontend.h"
# include "modules.h"
# include "probing.h"
# include "log.h"
# include "mount.h"
# include "cdrom.h"
2007-08-02 20:45:59 +04:00
extern char version [ ] ;
2004-01-20 21:32:43 +03:00
static int mount_that_cd_device ( char * dev_name )
{
char device_fullname [ 50 ] ;
strcpy ( device_fullname , " /dev/ " ) ;
strcat ( device_fullname , dev_name ) ;
return my_mount ( device_fullname , IMAGE_LOCATION , " iso9660 " , 0 ) ;
}
static int test_that_cd ( )
{
2007-08-02 20:45:59 +04:00
log_message ( " test file on cd: %s \n " , get_ramdisk_path ( NULL ) ) ;
2004-12-13 01:22:50 +03:00
return access ( get_ramdisk_path ( NULL ) , R_OK ) ;
2004-01-20 21:32:43 +03:00
}
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 )
{
2008-04-10 14:35:23 +04:00
struct stat st ;
2007-08-02 20:45:59 +04:00
char msg [ 256 ] ;
2008-04-10 14:35:23 +04:00
char * ramdisk_path ;
2004-01-20 21:32:43 +03:00
if ( test_that_cd ( ) ) {
enum return_type results ;
umount ( IMAGE_LOCATION ) ;
2007-08-02 20:45:59 +04:00
snprintf ( msg , sizeof ( msg ) , " That CDROM disc does not seem to be a %s "
" Installation CDROM. \n Retry with another disc? " , version ) ;
results = ask_yes_no ( msg ) ;
2004-01-20 21:32:43 +03:00
if ( results = = RETURN_OK )
return try_with_device ( dev_name , dev_model ) ;
return results ;
}
2007-08-02 20:45:59 +04:00
log_message ( " found a %s CDROM, good news! " , version ) ;
2004-01-20 21:32:43 +03:00
if ( IS_RESCUE ) {
2005-03-05 18:26:22 +03:00
load_ramdisk ( NULL ) ;
2004-01-20 21:32:43 +03:00
umount ( IMAGE_LOCATION ) ;
}
2005-01-26 16:43:53 +03:00
2008-04-10 14:35:23 +04:00
ramdisk_path = get_ramdisk_path ( NULL ) ;
stat ( ramdisk_path , & st ) ;
if ( S_ISDIR ( st . st_mode ) ) {
mount ( ramdisk_path , STAGE2_LOCATION , NULL , MS_BIND , NULL ) ;
} else {
do_losetup ( LIVE_DEVICE , ramdisk_path ) ;
my_mount ( LIVE_DEVICE , STAGE2_LOCATION , ( IS_LIVE ) ? LIVEFS : STAGE2FS , 0 ) ;
}
2005-02-03 18:38:15 +03:00
2004-01-20 21:32:43 +03:00
method_name = strdup ( " cdrom " ) ;
2005-01-26 16:43:53 +03:00
add_to_env ( " METHOD " , method_name ) ;
add_to_env ( " PREFIX " , " / " ) ;
2004-01-20 21:32:43 +03:00
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 ( ) ;
2007-08-02 20:45:59 +04:00
snprintf ( msg , sizeof ( msg ) , " I can't access a %s Installation disc in your CDROM drive (%s). \n Retry? " , version , dev_model ) ;
2004-01-20 21:32:43 +03:00
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 )
{
char * * medias , * * ptr , * * medias_models ;
char * choice ;
int i , count = 0 ;
enum return_type results ;
2005-04-21 15:06:44 +04:00
update_splash ( ) ;
2004-01-20 21:32:43 +03:00
get_medias ( CDROM , & medias , & medias_models ) ;
ptr = medias ;
while ( ptr & & * ptr ) {
count + + ;
ptr + + ;
}
if ( count = = 0 ) {
stg1_error_message ( " No CDROM device found. " ) ;
2008-02-29 20:05:35 +03:00
i = ask_insmod ( ) ;
2004-01-20 21:32:43 +03:00
if ( i = = RETURN_BACK )
return RETURN_BACK ;
return cdrom_prepare ( ) ;
}
if ( count = = 1 ) {
results = try_with_device ( * medias , * medias_models ) ;
if ( results = = RETURN_OK )
return RETURN_OK ;
2008-02-29 20:05:35 +03:00
i = ask_insmod ( ) ;
2004-01-20 21:32:43 +03:00
if ( i = = RETURN_BACK )
return RETURN_BACK ;
return cdrom_prepare ( ) ;
}
if ( IS_AUTOMATIC ) {
char * * model = medias_models ;
ptr = medias ;
while ( ptr & & * ptr ) {
2007-08-02 20:45:59 +04:00
wait_message ( " Trying to access %s CDROM disc (drive %s) " , version , * model ) ;
2004-01-20 21:32:43 +03:00
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 ) ;
if ( results = = RETURN_OK ) {
char * * model = medias_models ;
ptr = medias ;
while ( ptr & & * ptr & & model & & * model ) {
if ( ! strcmp ( * ptr , choice ) )
break ;
ptr + + ;
model + + ;
}
results = try_with_device ( choice , * model ) ;
} else
return results ;
}
if ( results = = RETURN_OK )
2005-04-21 15:06:44 +04:00
{
update_splash ( ) ;
2004-01-20 21:32:43 +03:00
return RETURN_OK ;
2005-04-21 15:06:44 +04:00
}
2004-01-20 21:32:43 +03:00
if ( results = = RETURN_BACK )
return cdrom_prepare ( ) ;
2008-02-29 20:05:35 +03:00
i = ask_insmod ( ) ;
2004-01-20 21:32:43 +03:00
if ( i = = RETURN_BACK )
return RETURN_BACK ;
return cdrom_prepare ( ) ;
}