diff options
Diffstat (limited to 'mdk-stage1/disk.c')
| -rw-r--r-- | mdk-stage1/disk.c | 128 | 
1 files changed, 105 insertions, 23 deletions
| diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index e3e84d7da..51a033639 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.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. @@ -19,28 +19,105 @@   *   */ +#define _GNU_SOURCE         /* We want the non segfaulting my_dirname() -- See dirname(3) */ +#include <string.h>  #include <stdlib.h>  #include <unistd.h>  #include <stdio.h> -#include <string.h>  #include <sys/mount.h>  #include <sys/stat.h>  #include <fcntl.h> -#include <string.h>  #include <libgen.h>  #include "stage1.h"  #include "frontend.h"  #include "modules.h"  #include "probing.h"  #include "log.h" +#include "tools.h" +#include "utils.h"  #include "mount.h" -#include "lomount.h"  #include "automatic.h"  #include "directory.h"  #include "partition.h"  #include "disk.h" +static enum return_type try_automatic_with_partition(char *dev) { +	enum return_type results; +	int mounted; +	char *dir= get_auto_value("directory"); +	char location_full[500]; +	strcpy(location_full, MEDIA_LOCATION); +	if (dir) { +		strcat(location_full, "/"); +		strcat(location_full, dir); +	} +	wait_message("Trying to access " DISTRIB_NAME " disk (partition %s)", dev); +	mounted = !try_mount(dev, MEDIA_LOCATION); +	remove_wait_message(); +	if (mounted) { +		create_IMAGE_LOCATION(MEDIA_LOCATION); +		if (image_has_stage2()) { +			results = try_with_directory(MEDIA_LOCATION, "disk", "disk-iso"); +		} else { +			results = try_with_directory(location_full, "disk", "disk-iso"); +		} +		if (results == RETURN_OK) { +			if (!KEEP_MOUNTED) +				umount(MEDIA_LOCATION); +			return RETURN_OK; +		} +	} +	if (mounted) +		umount(MEDIA_LOCATION); +	return RETURN_ERROR; +} + +static enum return_type try_automatic_with_disk(char *disk, char *model) { +	char * parts[50]; +	char * parts_comments[50]; +	enum return_type results; +	char **dev; +	char *part = get_auto_value("partition"); +	wait_message("Trying to access " DISTRIB_NAME " disk (drive %s)", model); +	if (list_partitions(disk, parts, parts_comments)) { +		stg1_error_message("Could not read partitions information."); +		return RETURN_ERROR; +	} +	remove_wait_message(); +	dev = parts; +	while (dev && *dev) { +		if (part && strcmp(part, *dev) != 0) +			goto next; +		results = try_automatic_with_partition(*dev); +		if (results == RETURN_OK) { +			return RETURN_OK; +		} +	next: +		dev++; +	} +	return RETURN_ERROR; +} + +static enum return_type try_automatic(char ** medias, char ** medias_models) +{ +	char ** model = medias_models; +	char ** ptr = medias; +	char *disk = get_auto_value("disk"); +	while (ptr && *ptr) { +		enum return_type results; +		if (disk && strcmp(disk, *ptr) != 0) +			goto next; +		results = try_automatic_with_disk(*ptr, *model); +		if (results == RETURN_OK) +			return RETURN_OK; +	next: +		ptr++; +		model++; +	} +	return RETURN_ERROR; +} +  static enum return_type try_with_device(char *dev_name)  {  	char * questions_location[] = { "Directory or ISO images directory or ISO image", NULL }; @@ -48,8 +125,6 @@ static enum return_type try_with_device(char *dev_name)  	static char ** answers_location = NULL;  	char location_full[500]; -	char * disk_own_mount = IMAGE_LOCATION_DIR "hdimage"; -  	char * parts[50];  	char * parts_comments[50];  	enum return_type results; @@ -74,9 +149,9 @@ static enum return_type try_with_device(char *dev_name)                          return results;          } -	/* in testing mode, assume the partition is already mounted on IMAGE_LOCATION_DIR "hdimage" */ -        if (!IS_TESTING && try_mount(choice, disk_own_mount)) { -		stg1_error_message("I can't find a valid filesystem (tried: ext2, vfat, ntfs, reiserfs). " +	/* in testing mode, assume the partition is already mounted on MEDIA_LOCATION */ +        if (!IS_TESTING && try_mount(choice, MEDIA_LOCATION)) { +		stg1_error_message("I can't find a valid filesystem (tried: ext4, vfat, ntfs, reiserfs). "                                     "Make sure the partition has been cleanly unmounted.");  		return try_with_device(dev_name);  	} @@ -85,11 +160,11 @@ static enum return_type try_with_device(char *dev_name)  	if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the "  				  DISTRIB_NAME " Distribution install source.",  				  questions_location, &answers_location, 24, questions_location_auto, NULL) != RETURN_OK) { -		umount(disk_own_mount); +		umount(MEDIA_LOCATION);  		return try_with_device(dev_name);  	} -	strcpy(location_full, disk_own_mount); +	strcpy(location_full, MEDIA_LOCATION);  	strcat(location_full, "/");  	strcat(location_full, answers_location[0]); @@ -97,7 +172,7 @@ static enum return_type try_with_device(char *dev_name)  		char * path = strdup(answers_location[0]);  		stg1_error_message("Directory or ISO image file could not be found on partition.\n"  			      "Here's a short extract of the files in the directory %s:\n" -			      "%s", dirname(path), extract_list_directory(dirname(location_full))); +			      "%s", my_dirname(path), extract_list_directory(my_dirname(location_full)));  		free(path);  		goto ask_dir;  	} @@ -108,7 +183,7 @@ static enum return_type try_with_device(char *dev_name)  	}  	if (!KEEP_MOUNTED) -		umount(disk_own_mount); +		umount(MEDIA_LOCATION);  	return RETURN_OK;  } @@ -119,18 +194,25 @@ enum return_type disk_prepare(void)  	char * choice;  	int i;  	enum return_type results; -        static int already_probed_ide_generic = 0; +	static int already_probed_ide_generic = 0;          int count = get_disks(&medias, &medias_models); +	if (IS_AUTOMATIC) { +		results = try_automatic(medias, medias_models); +		if (results != RETURN_ERROR) +			return results; +		unset_automatic(); +        } +  	if (count == 0) { -                if (!already_probed_ide_generic) { -                        already_probed_ide_generic = 1; -                        my_insmod("ide-generic", ANY_DRIVER_TYPE, NULL, 0); -                        return disk_prepare(); -                } +		if (!already_probed_ide_generic) { +			already_probed_ide_generic = 1; +			my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL); +			return disk_prepare(); +		}  		stg1_error_message("No DISK drive found."); -		i = ask_insmod(SCSI_ADAPTERS); +		i = ask_insmod(MEDIA_ADAPTERS);  		if (i == RETURN_BACK)  			return RETURN_BACK;  		return disk_prepare(); @@ -140,7 +222,7 @@ enum return_type disk_prepare(void)  		results = try_with_device(*medias);  		if (results != RETURN_ERROR)  			return results; -		i = ask_insmod(SCSI_ADAPTERS); +		i = ask_insmod(MEDIA_ADAPTERS);  		if (i == RETURN_BACK)  			return RETURN_BACK;  		return disk_prepare(); @@ -156,7 +238,7 @@ enum return_type disk_prepare(void)  	results = try_with_device(choice);  	if (results != RETURN_ERROR)  		return results; -	i = ask_insmod(SCSI_ADAPTERS); +	i = ask_insmod(MEDIA_ADAPTERS);  	if (i == RETURN_BACK)  		return RETURN_BACK;  	return disk_prepare(); | 
