summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/disk.c')
-rw-r--r--mdk-stage1/disk.c97
1 files changed, 90 insertions, 7 deletions
diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c
index b682872e1..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,14 +19,14 @@
*
*/
+#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"
@@ -42,6 +42,82 @@
#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 };
@@ -75,7 +151,7 @@ static enum return_type try_with_device(char *dev_name)
/* 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: ext2, vfat, ntfs, reiserfs). "
+ 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);
}
@@ -96,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;
}
@@ -122,10 +198,17 @@ enum return_type disk_prepare(void)
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);
+ my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL);
return disk_prepare();
}
stg1_error_message("No DISK drive found.");