summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/stage1.c3
-rw-r--r--mdk-stage1/thirdparty.c109
-rw-r--r--mdk-stage1/thirdparty.h9
3 files changed, 81 insertions, 40 deletions
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c
index a338c990b..e3a5b364c 100644
--- a/mdk-stage1/stage1.c
+++ b/mdk-stage1/stage1.c
@@ -324,6 +324,9 @@ static void method_select_and_prepare(void)
if (results != RETURN_OK)
return method_select_and_prepare();
+
+ /* try to find third party modules on the install media */
+ thirdparty_load_media_modules();
}
static enum return_type create_initial_fs_symlinks(char* symlinks)
diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c
index cd4e6b83c..1c8942d3c 100644
--- a/mdk-stage1/thirdparty.c
+++ b/mdk-stage1/thirdparty.c
@@ -26,13 +26,14 @@
#include "frontend.h"
#include "partition.h"
#include "automatic.h"
+#include "probing.h"
#include "thirdparty.h"
#define THIRDPARTY_MOUNT_LOCATION "/tmp/thirdparty"
#define THIRDPARTY_DIRECTORY "/install/thirdparty"
-static enum return_type third_party_choose_device(char ** device, int probe_only)
+static enum return_type thirdparty_choose_device(char ** device, int probe_only)
{
char ** medias, ** medias_models;
char ** ptr, ** ptr_models;
@@ -210,7 +211,7 @@ static enum return_type thirdparty_prompt_modules(const char *modules_location,
}
-static enum return_type thirdparty_autoload_modules(const char *modules_location, char ** modules_list, FILE *f)
+static enum return_type thirdparty_autoload_modules(const char *modules_location, char ** modules_list, FILE *f, int load_probed_only)
{
while (1) {
char final_name[500];
@@ -230,6 +231,11 @@ static enum return_type thirdparty_autoload_modules(const char *modules_location
options++;
}
+ if (load_probed_only && !exists_orphan_device(module)) {
+ log_message("third party: no device detected for module %s, skipping", module);
+ continue;
+ }
+
log_message("third party: auto-loading module (%s) (%s)", module, options);
while (entry && *entry) {
if (!strncmp(*entry, module, strlen(module)) && (*entry)[strlen(module)] == '.') {
@@ -250,31 +256,83 @@ static enum return_type thirdparty_autoload_modules(const char *modules_location
}
}
}
- fclose(f);
return RETURN_OK;
}
+static enum return_type thirdparty_try_directory(char * root_directory, int interactive) {
+ char modules_location[100];
+ char list_filename[50];
+ FILE *f_load, *f_detect;
+ char **modules_list;
+
+ /* look first in the specific third-party directory */
+ strcpy(modules_location, root_directory);
+ strcat(modules_location, THIRDPARTY_DIRECTORY);
+ modules_list = list_directory(modules_location);
+
+ /* if it's empty, look in the root of selected device */
+ if (!modules_list || !modules_list[0]) {
+ modules_location[strlen(root_directory)] = '\0';
+ modules_list = list_directory(modules_location);
+ }
+
+ log_message("third party: using modules location %s", modules_location);
+
+ if (!modules_list || !*modules_list) {
+ log_message("third party: no modules found");
+ if (interactive)
+ stg1_error_message("No modules found on selected device.");
+ return RETURN_ERROR;
+ }
+
+ sprintf(list_filename, "%s/to_load", modules_location);
+ f_load = fopen(list_filename, "rb");
+ if (f_load) {
+ thirdparty_autoload_modules(modules_location, modules_list, f_load, 0);
+ fclose(f_load);
+ }
+
+ sprintf(list_filename, "%s/to_detect", modules_location);
+ f_detect = fopen(list_filename, "rb");
+ if (f_detect) {
+ thirdparty_autoload_modules(modules_location, modules_list, f_detect, 1);
+ fclose(f_detect);
+ }
+
+ if (f_load || f_detect)
+ return RETURN_OK;
+ else if (interactive) {
+ if (IS_AUTOMATIC)
+ stg1_error_message("I can't find a \"to_load\" file. Please select the modules manually.");
+ log_message("third party: no \"to_load\" file, prompting for modules");
+ return thirdparty_prompt_modules(modules_location, modules_list);
+ } else {
+ return RETURN_OK;
+ }
+}
+
+void thirdparty_load_media_modules(void)
+{
+ thirdparty_try_directory(IMAGE_LOCATION, 0);
+}
void thirdparty_load_modules(void)
{
enum return_type results;
- char * device, * modules_location;
- char ** modules_list;
- char toload_name[500];
- FILE * f;
+ char * device;
device = NULL;
if (IS_AUTOMATIC) {
device = get_auto_value("thirdparty");
- third_party_choose_device(NULL, 1); /* probe only to create devices */
+ thirdparty_choose_device(NULL, 1); /* probe only to create devices */
log_message("third party: trying automatic device %s", device);
if (thirdparty_mount_device(device) != RETURN_OK)
device = NULL;
}
while (!device || streq(device, "")) {
- results = third_party_choose_device(&device, 0);
+ results = thirdparty_choose_device(&device, 0);
if (results == RETURN_BACK)
return;
if (thirdparty_mount_device(device) != RETURN_OK)
@@ -283,38 +341,9 @@ void thirdparty_load_modules(void)
log_message("third party: using device %s", device);
- /* 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) {
- log_message("third party: no modules found");
- stg1_error_message("No modules found on selected device.");
- umount(THIRDPARTY_MOUNT_LOCATION);
- return thirdparty_load_modules();
- }
-
- sprintf(toload_name, "%s/to_load", modules_location);
- f = fopen(toload_name, "rb");
- if (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("third party: no \"to_load\" file, prompting for modules");
- results = thirdparty_prompt_modules(modules_location, modules_list);
- }
+ results = thirdparty_try_directory(THIRDPARTY_MOUNT_LOCATION, 1);
umount(THIRDPARTY_MOUNT_LOCATION);
- if (results == RETURN_OK)
- return;
- else
+ if (results != RETURN_OK)
return thirdparty_load_modules();
}
diff --git a/mdk-stage1/thirdparty.h b/mdk-stage1/thirdparty.h
index b09f36682..b88db7e0e 100644
--- a/mdk-stage1/thirdparty.h
+++ b/mdk-stage1/thirdparty.h
@@ -16,6 +16,15 @@
#ifndef _THIRDPARTY_H_
#define _THIRDPARTY_H_
+/* load third party modules present on install media
+ * use to_load and to_detect files in /install/thirdparty
+ * do not prompt user
+ */
+void thirdparty_load_media_modules(void);
+
+/* load modules if to_load or to_detect files are present
+ * prompt user if no to_load file is present
+ */
void thirdparty_load_modules(void);
#endif