diff --git a/src/kernel/boot/loader/Jamfile b/src/kernel/boot/loader/Jamfile index 55ae686087..16cfa9ed5c 100644 --- a/src/kernel/boot/loader/Jamfile +++ b/src/kernel/boot/loader/Jamfile @@ -36,6 +36,10 @@ KernelStaticLibrary boot_loader : menu.cpp loader.cpp kernel_args.cpp + load_driver_settings.cpp + + # libroot + driver_settings.c # utils list.c @@ -60,6 +64,9 @@ KernelStaticLibrary boot_partitions : SEARCH on [ FGristFiles kernel_cpp.cpp list.c ] = [ FDirName $(OBOS_TOP) src kernel core util ] ; +SEARCH on [ FGristFiles driver_settings.c ] + = [ FDirName $(OBOS_TOP) src kernel libroot os ] ; + SEARCH on [ FGristFiles amiga_rdb.cpp ] = [ FDirName $(OBOS_TOP) src add-ons kernel partitioning_systems amiga ] ; diff --git a/src/kernel/boot/loader/load_driver_settings.cpp b/src/kernel/boot/loader/load_driver_settings.cpp new file mode 100644 index 0000000000..02e002eacf --- /dev/null +++ b/src/kernel/boot/loader/load_driver_settings.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ + + +#include "load_driver_settings.h" + +#include + +#include +#include +#include +#include + +#include + + +static status_t +load_driver_settings_file(Directory *directory, const char *name) +{ + int fd = open_from(directory, name, O_RDONLY); + if (fd < 0) + return fd; + + struct stat stat; + fstat(fd, &stat); + + char *buffer = (char *)kernel_args_malloc(stat.st_size + 1); + if (buffer == NULL) + return B_NO_MEMORY; + + if (read(fd, buffer, stat.st_size) != stat.st_size) + return B_IO_ERROR; + + driver_settings_file *file = (driver_settings_file *)kernel_args_malloc(sizeof(driver_settings_file)); + if (file == NULL) { + kernel_args_free(buffer); + return B_NO_MEMORY; + } + + buffer[stat.st_size] = '\0'; + // null terminate the buffer + + strlcpy(file->name, name, sizeof(file->name)); + file->buffer = buffer; + file->size = stat.st_size; + + // add it to the list + file->next = gKernelArgs.driver_settings; + gKernelArgs.driver_settings = file; + + return B_OK; +} + + +status_t +load_driver_settings(stage2_args */*args*/, Directory *volume) +{ + int fd = open_from(volume, "home/config/settings/kernel/drivers", O_RDONLY); + if (fd < B_OK) + return fd; + + Directory *settings = (Directory *)get_node_from(fd); + if (settings == NULL) + return B_ENTRY_NOT_FOUND; + + void *cookie; + if (settings->Open(&cookie, O_RDONLY) == B_OK) { + char name[B_FILE_NAME_LENGTH]; + while (settings->GetNextEntry(cookie, name, sizeof(name)) == B_OK) { + if (!strcmp(name, ".") || !strcmp(name, "..")) + continue; + + status_t status = load_driver_settings_file(settings, name); + if (status != B_OK) + dprintf("Could not load \"%s\" error %ld\n", name, status); + } + + settings->Close(cookie); + } + + return B_OK; +} diff --git a/src/kernel/boot/loader/load_driver_settings.h b/src/kernel/boot/loader/load_driver_settings.h new file mode 100644 index 0000000000..978ade0868 --- /dev/null +++ b/src/kernel/boot/loader/load_driver_settings.h @@ -0,0 +1,14 @@ +/* + * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef LOAD_DRIVER_SETTINGS_H +#define LOAD_DRIVER_SETTINGS_H + + +#include + + +extern status_t load_driver_settings(stage2_args *args, Directory *volume); + +#endif /* LOAD_DRIVER_SETTINGS_H */ diff --git a/src/kernel/boot/loader/main.cpp b/src/kernel/boot/loader/main.cpp index 3c4356c609..cb4d55a573 100644 --- a/src/kernel/boot/loader/main.cpp +++ b/src/kernel/boot/loader/main.cpp @@ -1,11 +1,12 @@ /* -** Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the Haiku License. -*/ + * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + */ #include "menu.h" #include "loader.h" +#include "load_driver_settings.h" #include #include @@ -35,8 +36,6 @@ main(stage2_args *args) TRACE(("boot(): heap initialized...\n")); platform_init_video(); - if ((platform_boot_options() & (BOOT_OPTION_DEBUG_OUTPUT | BOOT_OPTION_MENU)) == 0) - platform_switch_to_logo(); // the main platform dependent initialisation // has already taken place at this point. @@ -97,7 +96,12 @@ main(stage2_args *args) // know our boot volume, too if (status == B_OK) { register_boot_file_system(volume); + + if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) == 0) + platform_switch_to_logo(); + load_modules(args, volume); + load_driver_settings(args, volume); // set up kernel args version info gKernelArgs.kernel_args_size = sizeof(kernel_args); diff --git a/src/kernel/boot/loader/stdio.cpp b/src/kernel/boot/loader/stdio.cpp index 8c829f074e..6a6efeec28 100644 --- a/src/kernel/boot/loader/stdio.cpp +++ b/src/kernel/boot/loader/stdio.cpp @@ -1,7 +1,7 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ #include @@ -16,6 +16,9 @@ //extern FILE *stdout; //extern FILE *stdin; +int errno; +int *_errnop = &errno; + int vfprintf(FILE *file, const char *format, va_list list)