diff options
Diffstat (limited to 'mdk-stage1')
-rw-r--r-- | mdk-stage1/disk.c | 32 | ||||
-rw-r--r-- | mdk-stage1/modules.c | 2 | ||||
-rw-r--r-- | mdk-stage1/modules.h | 1 | ||||
-rw-r--r-- | mdk-stage1/stage1.c | 63 | ||||
-rw-r--r-- | mdk-stage1/tools.c | 21 | ||||
-rw-r--r-- | mdk-stage1/tools.h | 1 |
6 files changed, 97 insertions, 23 deletions
diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index 7c8f2406c..9e0946313 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.c @@ -24,8 +24,6 @@ #include <stdio.h> #include <string.h> #include <sys/mount.h> -#include <dirent.h> -#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "stage1.h" @@ -38,22 +36,18 @@ #include "disk.h" - -static char * list_directory(char * direct) +static char * disk_extract_list_directory(char * direct) { - char tmp[500] = ""; - int nb = 0; - struct dirent *ep; - DIR *dp = opendir(direct); - while (dp && nb < 5 && (ep = readdir(dp))) { - if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { - strcat(tmp, strdup(ep->d_name)); - strcat(tmp, "\n"); - nb++; - } + char ** full = list_directory(direct); + char tmp[2000] = ""; + int i; + for (i=0; i<5 ; i++) { + if (!full || !*full) + break; + strcat(tmp, *full); + strcat(tmp, "\n"); + full++; } - if (dp) - closedir(dp); return strdup(tmp); } @@ -129,7 +123,7 @@ static enum return_type try_with_device(char *dev_name) if (access(location_full, R_OK)) { error_message("Directory or ISO image file could not be found on partition.\n" "Here's a short extract of the files in the root of the partition:\n" - "%s", list_directory(disk_own_mount)); + "%s", disk_extract_list_directory(disk_own_mount)); umount(disk_own_mount); return try_with_device(dev_name); } @@ -152,7 +146,7 @@ static enum return_type try_with_device(char *dev_name) error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " "(I need the subdirectory " RAMDISK_LOCATION ")\n" "Here's a short extract of the files in the directory:\n" - "%s", list_directory(IMAGE_LOCATION)); + "%s", disk_extract_list_directory(IMAGE_LOCATION)); umount(disk_own_mount); return try_with_device(dev_name); } @@ -168,7 +162,7 @@ static enum return_type try_with_device(char *dev_name) error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " "(I need the subdirectory " LIVE_LOCATION ")\n" "Here's a short extract of the files in the directory:\n" - "%s", list_directory(IMAGE_LOCATION)); + "%s", disk_extract_list_directory(IMAGE_LOCATION)); umount(disk_own_mount); return try_with_device(dev_name); } diff --git a/mdk-stage1/modules.c b/mdk-stage1/modules.c index ee99374da..f73972e62 100644 --- a/mdk-stage1/modules.c +++ b/mdk-stage1/modules.c @@ -294,7 +294,7 @@ static enum return_type insmod_with_options(char * mod, enum driver_type type) error_message("Insmod failed."); return RETURN_ERROR; } - + add_modules_conf(options); return RETURN_OK; diff --git a/mdk-stage1/modules.h b/mdk-stage1/modules.h index 74ecc8a57..b1c921b01 100644 --- a/mdk-stage1/modules.h +++ b/mdk-stage1/modules.h @@ -22,7 +22,6 @@ void init_modules_insmoding(void); int my_insmod(const char * mod_name, enum driver_type type, char * options); enum return_type ask_insmod(enum driver_type); - struct module_deps_elem { char * name; char ** deps; diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 6da2b5ad6..9ed4cc492 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -43,6 +43,8 @@ #include "modules.h" #include "tools.h" #include "automatic.h" +#include "mount.h" +#include "insmod-busybox/insmod.h" #ifndef DISABLE_CDROM #include "cdrom.h" @@ -71,7 +73,7 @@ void fatal_error(char *msg) /* spawns a shell on console #2 */ -void spawn_shell(void) +static void spawn_shell(void) { int fd; pid_t pid; @@ -109,7 +111,61 @@ void spawn_shell(void) } -enum return_type method_select_and_prepare(void) +static void expert_third_party_modules(void) +{ + enum return_type results; + char * floppy_mount_location = "/tmp/floppy"; + char ** modules; + char final_name[500] = "/tmp/floppy/"; + char * choice; + int rc; + char * questions[] = { "Options", NULL }; + char ** answers; + + results = ask_yes_no("If you want to insert third-party kernel modules, insert " + "a Linux (ext2fs) formatted floppy containing the modules and confirm. Otherwise, select \"no\".");; + if (results != RETURN_OK) + return; + + if (my_mount("/dev/fd0", floppy_mount_location, "ext2") == -1) { + error_message("I can't find a Linux ext2 floppy in first floppy drive."); + return expert_third_party_modules(); + } + + modules = list_directory("/tmp/floppy"); + + if (!modules || !*modules) { + error_message("No modules found on floppy disk."); + umount(floppy_mount_location); + return expert_third_party_modules(); + } + + results = ask_from_list("Which driver would you like to insmod?", modules, &choice); + if (results != RETURN_OK) { + umount(floppy_mount_location); + return; + } + + strcat(final_name, choice); + + results = ask_from_entries("Please enter the options:", questions, &answers, 24); + if (results != RETURN_OK) { + umount(floppy_mount_location); + return expert_third_party_modules(); + } + + rc = insmod_call(final_name, answers[0]); + umount(floppy_mount_location); + + if (rc) { + log_message("\tfailed."); + error_message("Insmod failed."); + } + + return expert_third_party_modules(); +} + +static enum return_type method_select_and_prepare(void) { enum return_type results; char * choice; @@ -194,6 +250,9 @@ int main(int argc, char **argv, char **env) init_modules_insmoding(); init_frontend(); + if (IS_EXPERT) + expert_third_party_modules(); + ret = method_select_and_prepare(); finish_frontend(); diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c index 7266409c5..2a50c0ee4 100644 --- a/mdk-stage1/tools.c +++ b/mdk-stage1/tools.c @@ -27,6 +27,8 @@ #include <string.h> #include <ctype.h> #include <stdio.h> +#include <dirent.h> +#include <sys/types.h> #include <zlib.h> #include "stage1.h" #include "log.h" @@ -337,3 +339,22 @@ void add_to_env(char * name, char * value) env_size++; my_env[env_size] = NULL; } + + +char ** list_directory(char * direct) +{ + char * tmp[500]; + int i = 0; + struct dirent *ep; + DIR *dp = opendir(direct); + while (dp && (ep = readdir(dp))) { + if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { + tmp[i] = strdup(ep->d_name); + i++; + } + } + if (dp) + closedir(dp); + tmp[i] = NULL; + return memdup(tmp, sizeof(char*) * (i+1)); +} diff --git a/mdk-stage1/tools.h b/mdk-stage1/tools.h index 5efe5a64f..8ec084451 100644 --- a/mdk-stage1/tools.h +++ b/mdk-stage1/tools.h @@ -38,6 +38,7 @@ void * memdup(void *src, size_t size); void add_to_env(char * name, char * value); void handle_env(char ** env); char ** grab_env(void); +char ** list_directory(char * direct); struct param_elem { |