diff options
Diffstat (limited to 'mdk-stage1')
-rw-r--r-- | mdk-stage1/Makefile | 2 | ||||
-rw-r--r-- | mdk-stage1/disk.c | 96 | ||||
-rw-r--r-- | mdk-stage1/mount.c | 10 | ||||
-rw-r--r-- | mdk-stage1/newt-frontend.c | 2 | ||||
-rw-r--r-- | mdk-stage1/probing.c | 12 | ||||
-rw-r--r-- | mdk-stage1/stage1.c | 4 |
6 files changed, 103 insertions, 23 deletions
diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index 55fe0a071..d4a3f2798 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -108,7 +108,7 @@ LDFLAGS_STAGE1 = -static endif -BINS = init stage1-full stage1-cdrom stage1-network +BINS = init stage1-full stage1-cdrom stage1-network stage1-disk #ifeq (i386, $(ARCH)) diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index e539b146a..42943e324 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.c @@ -21,19 +21,108 @@ #include <stdlib.h> #include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <sys/mount.h> #include "stage1.h" #include "frontend.h" #include "modules.h" #include "probing.h" #include "log.h" +#include "mount.h" #include "disk.h" + static enum return_type try_with_device(char *dev_name) { + char * questions_location[] = { "Directory", NULL }; + char ** answers_location; + char device_fullname[50]; + char location_full[50]; + + int major, minor, blocks; + char name[100]; + + char buf[512]; + FILE * f; + char * parts[50]; + char * parts_comments[50]; + int i = 0; + enum return_type results; + char * choice; + + if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { + log_perror(dev_name); + error_message("Could not read partitions information"); + return RETURN_ERROR; + } - /* I have to do the partition check here */ + while (fgets(buf, sizeof(buf), f)) { + sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); + if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) { + parts[i] = strdup(name); + parts_comments[i] = (char *) malloc(sizeof(char) * 25); + snprintf(parts_comments[i], 24, "size: %d blocks", blocks); + i++; + } + } + parts[i] = NULL; + fclose(f); + + results = ask_from_list_comments("Please choose the partition to use for the installation.", parts, parts_comments, &choice); + if (results != RETURN_OK) + return results; + + strcpy(device_fullname, "/dev/"); + strcat(device_fullname, choice); + + if (my_mount(device_fullname, "/tmp/disk", "ext2") == -1 && + my_mount(device_fullname, "/tmp/disk", "vfat") == -1 && + my_mount(device_fullname, "/tmp/disk", "reiserfs") == -1) { + error_message("I can't find a valid filesystem."); + return try_with_device(dev_name); + } + results = ask_from_entries("Please enter the directory containing the Linux-Mandrake installation.", + questions_location, &answers_location, 24); + if (results != RETURN_OK) { + umount("/tmp/disk"); + return try_with_device(dev_name); + } + + strcpy(location_full, "/tmp/disk/"); + strcat(location_full, answers_location[0]); + + if (access(location_full, R_OK)) { + umount("/tmp/disk"); + error_message("Directory could not be found on partition."); + return try_with_device(dev_name); + } + + unlink("/tmp/image"); + symlink(location_full, "/tmp/image"); + + if (access("/tmp/image/Mandrake/mdkinst", R_OK)) { + umount("/tmp/disk"); + unlink("/tmp/image"); + error_message("I can't find the Linux-Mandrake installation in the specified directory."); + return try_with_device(dev_name); + } + + log_message("found the Linux-Mandrake Installation, good news!"); + + if (IS_SPECIAL_STAGE2) { + if (load_ramdisk() != RETURN_OK) { + error_message("Could not load program into memory"); + return try_with_device(dev_name); + } + } + + if (IS_RESCUE) + umount("/tmp/image"); /* TOCHECK */ + + method_name = strdup("disk"); return RETURN_OK; } @@ -44,12 +133,7 @@ enum return_type disk_prepare(void) int i, count = 0; enum return_type results; - error_message("Currently unsupported"); - return RETURN_ERROR; - my_insmod("sd_mod"); - my_insmod("vfat"); - my_insmod("reiserfs"); get_medias(DISK, &medias, &medias_models); diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c index ade92adf5..93500a34f 100644 --- a/mdk-stage1/mount.c +++ b/mdk-stage1/mount.c @@ -120,17 +120,17 @@ int my_mount(char *dev, char *location, char *fs) if (stat(location, &buf)) { if (mkdir(location, 0755)) { - log_message("could not create location dir"); + log_perror("could not create location dir"); return -1; } } else if (!S_ISDIR(buf.st_mode)) { log_message("not a dir %s, will unlink and mkdir", location); if (unlink(location)) { - log_message("could not unlink %s", location); + log_perror("could not unlink"); return -1; } if (mkdir(location, 0755)) { - log_message("could not create location dir"); + log_perror("could not create location dir"); return -1; } } @@ -143,6 +143,10 @@ int my_mount(char *dev, char *location, char *fs) opts = "check=relaxed"; } + if (!strcmp(fs, "reiserfs")) { + my_insmod("reiserfs"); + } + if (!strcmp(fs, "iso9660")) { my_insmod("isofs"); flags |= MS_RDONLY; diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c index d44911c61..f0a373357 100644 --- a/mdk-stage1/newt-frontend.c +++ b/mdk-stage1/newt-frontend.c @@ -157,7 +157,7 @@ enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_ i = 0; while (elems && *elems) { - items[i] = malloc(sizeof(char) * (strlen(*elems) + strlen(*elems_comments) + 3)); + items[i] = malloc(sizeof(char) * (strlen(*elems) + strlen(*elems_comments) + 4)); strcpy(items[i], *elems); strcat(items[i], " ("); strcat(items[i], *elems_comments); diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c index 83257ae39..16f9ebb06 100644 --- a/mdk-stage1/probing.c +++ b/mdk-stage1/probing.c @@ -55,19 +55,11 @@ void probe_that_type(enum driver_type type) ask_insmod(type); else { /* ---- PCI probe */ - char * mytype; FILE * f; int len = 0; char buf[200]; struct pci_module_map * pcidb = NULL; - if (type == SCSI_ADAPTERS) - mytype = "SCSI"; - else if (type == NETWORK_DEVICES) - mytype = "NET"; - else - return; - f = fopen("/proc/bus/pci/devices", "rb"); if (!f) { @@ -105,7 +97,7 @@ void probe_that_type(enum driver_type type) #ifndef DISABLE_MEDIAS if (type == SCSI_ADAPTERS) { /* insmod takes time, let's use the wait message */ - wait_message("Installing %s driver for %s", mytype, pcidb[i].name); + wait_message("Installing %s", pcidb[i].name); my_insmod(pcidb[i].module); remove_wait_message(); } @@ -113,7 +105,7 @@ void probe_that_type(enum driver_type type) #ifndef DISABLE_NETWORK if (type == NETWORK_DEVICES) { /* insmod is quick, let's use the info message */ - info_message("Found %s driver for %s", mytype, pcidb[i].name); + info_message("Found %s", pcidb[i].name); my_insmod(pcidb[i].module); } #endif diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 50f04ad53..93aae9338 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -145,7 +145,7 @@ enum return_type method_select_and_prepare(void) results = ask_from_list_auto("Please choose the mean of installation.", means, &choice, "method", means_auto); if (results != RETURN_OK) - return results; + return method_select_and_prepare(); results = RETURN_ERROR; @@ -171,7 +171,7 @@ enum return_type method_select_and_prepare(void) #endif if (results != RETURN_OK) - method_select_and_prepare(); + return method_select_and_prepare(); return RETURN_OK; } |