summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/thirdparty.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c
index 94240d541..17f04478c 100644
--- a/mdk-stage1/thirdparty.c
+++ b/mdk-stage1/thirdparty.c
@@ -30,6 +30,7 @@
#include "thirdparty.h"
#define THIRDPARTY_MOUNT_LOCATION "/tmp/thirdparty"
+#define THIRDPARTY_DIRECTORY "/install/thirdparty"
static enum return_type third_party_choose_device(char ** device)
{
@@ -168,7 +169,7 @@ static enum return_type thirdparty_mount_device(char * device)
}
-static enum return_type thirdparty_prompt_modules(char ** modules_list)
+static enum return_type thirdparty_prompt_modules(const char *modules_location, char ** modules_list)
{
enum return_type results;
char final_name[500];
@@ -182,7 +183,7 @@ static enum return_type thirdparty_prompt_modules(char ** modules_list)
if (results != RETURN_OK)
break;
- sprintf(final_name, "%s/%s", THIRDPARTY_MOUNT_LOCATION, module_name);
+ sprintf(final_name, "%s/%s", modules_location, module_name);
results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL);
if (results != RETURN_OK)
@@ -198,7 +199,7 @@ static enum return_type thirdparty_prompt_modules(char ** modules_list)
}
-static enum return_type thirdparty_autoload_modules(char ** modules_list, FILE *f)
+static enum return_type thirdparty_autoload_modules(const char *modules_location, char ** modules_list, FILE *f)
{
while (1) {
char final_name[500];
@@ -221,7 +222,7 @@ static enum return_type thirdparty_autoload_modules(char ** modules_list, FILE *
log_message("updatemodules: (%s) (%s)", module, options);
while (entry && *entry) {
if (!strncmp(*entry, module, strlen(module)) && (*entry)[strlen(module)] == '.') {
- sprintf(final_name, "%s/%s", THIRDPARTY_MOUNT_LOCATION, *entry);
+ sprintf(final_name, "%s/%s", modules_location, *entry);
if (insmod_local_file(final_name, options)) {
log_message("\t%s (floppy): failed", *entry);
stg1_error_message("Insmod %s (floppy) failed.", *entry);
@@ -247,11 +248,12 @@ static enum return_type thirdparty_autoload_modules(char ** modules_list, FILE *
void thirdparty_load_modules(void)
{
enum return_type results;
- char * device = NULL;
+ char * device, * modules_location;
char ** modules_list;
char toload_name[500];
FILE * f;
+ device = NULL;
if (IS_AUTOMATIC) {
device = get_auto_value("thirdparty");
log_message("third party : trying automatic device %s", device);
@@ -269,7 +271,16 @@ void thirdparty_load_modules(void)
log_message("third party : using device %s", device);
- modules_list = list_directory(THIRDPARTY_MOUNT_LOCATION);
+ /* look first in the specific third-party directory */
+ modules_location = THIRDPARTY_MOUNT_LOCATION THIRDPARTY_DIRECTORY;
+ modules_list = list_directory(modules_location);
+ if (!modules_list || !modules_list[0]) {
+ /* if it's empty, look in the root of selected device */
+ modules_location = THIRDPARTY_MOUNT_LOCATION;
+ modules_list = list_directory(modules_location);
+ }
+
+ log_message("third party: using modules location %s", modules_location);
if (!modules_list || !*modules_list) {
stg1_error_message("No modules found on disk.");
@@ -277,15 +288,15 @@ void thirdparty_load_modules(void)
return thirdparty_load_modules();
}
- sprintf(toload_name, "%s/to_load", THIRDPARTY_MOUNT_LOCATION);
+ sprintf(toload_name, "%s/to_load", modules_location);
f = fopen(toload_name, "rb");
if (f) {
- results = thirdparty_autoload_modules(modules_list, f);
+ results = thirdparty_autoload_modules(modules_location, modules_list, f);
} else {
if (IS_AUTOMATIC)
stg1_error_message("I can't find a \"to_load\" file. Please select the modules manually.");
log_message("No \"to_load\" file, prompting for modules");
- results = thirdparty_prompt_modules(modules_list);
+ results = thirdparty_prompt_modules(modules_location, modules_list);
}
umount(THIRDPARTY_MOUNT_LOCATION);