diff --git a/src/add-ons/kernel/file_systems/bfs/Jamfile b/src/add-ons/kernel/file_systems/bfs/Jamfile index b298e8a326..741b4888a6 100644 --- a/src/add-ons/kernel/file_systems/bfs/Jamfile +++ b/src/add-ons/kernel/file_systems/bfs/Jamfile @@ -28,6 +28,7 @@ UsePrivateHeaders [ FDirName kernel disk_device_manager ] ; UsePrivateHeaders [ FDirName storage ] ; KernelAddon bfs : + bfs_disk_system.cpp BlockAllocator.cpp BPlusTree.cpp kernel_cpp.cpp diff --git a/src/add-ons/kernel/file_systems/bfs/bfs_disk_system.cpp b/src/add-ons/kernel/file_systems/bfs/bfs_disk_system.cpp new file mode 100644 index 0000000000..25b2fb845f --- /dev/null +++ b/src/add-ons/kernel/file_systems/bfs/bfs_disk_system.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + +#include "bfs_disk_system.h" + +#include "bfs.h" +#include "Volume.h" + + +status_t +parse_initialize_parameters(const char* parameterString, + initialize_parameters& parameters) +{ + parameters.flags = 0; + parameters.verbose = false; + + void *handle = parse_driver_settings_string(parameterString); + if (handle == NULL) + return B_ERROR; + + if (get_driver_boolean_parameter(handle, "noindex", false, true)) + parameters.flags |= VOLUME_NO_INDICES; + if (get_driver_boolean_parameter(handle, "verbose", false, true)) + parameters.verbose = true; + + const char *string = get_driver_parameter(handle, "block_size", + NULL, NULL); + uint32 blockSize = 1024; + if (string != NULL) + blockSize = strtoul(string, NULL, 0); + + delete_driver_settings(handle); + + if (blockSize != 1024 && blockSize != 2048 && blockSize != 4096 + && blockSize != 8192) { + return B_BAD_VALUE; + } + + parameters.blockSize = blockSize; + + return B_OK; +} + + +status_t +check_volume_name(const char* name) +{ + if (name == NULL || strlen(name) >= BFS_DISK_NAME_LENGTH + || strchr(name, '/') != NULL) { + return B_BAD_VALUE; + } + + return B_OK; +} + diff --git a/src/add-ons/kernel/file_systems/bfs/bfs_disk_system.h b/src/add-ons/kernel/file_systems/bfs/bfs_disk_system.h new file mode 100644 index 0000000000..d12abc2a94 --- /dev/null +++ b/src/add-ons/kernel/file_systems/bfs/bfs_disk_system.h @@ -0,0 +1,22 @@ +/* + * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _BFS_DISK_SYSTEM_H +#define _BFS_DISK_SYSTEM_H + +#include "system_dependencies.h" + + +struct initialize_parameters { + uint32 blockSize; + uint32 flags; + bool verbose; +}; + +status_t parse_initialize_parameters(const char* parameterString, + initialize_parameters& parameters); +status_t check_volume_name(const char* name); + + +#endif // _BFS_DISK_SYSTEM_H diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 4116792a5f..69c7872f41 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -14,6 +14,7 @@ #include "Query.h" #include "Attribute.h" #include "bfs_control.h" +#include "bfs_disk_system.h" #define BFS_IO_SIZE 65536 @@ -2014,49 +2015,6 @@ bfs_rewind_query(void */*fs*/, void *cookie) // #pragma mark - -struct initialize_parameters { - uint32 blockSize; - uint32 flags; - bool verbose; -}; - - -static status_t -parse_initialize_parameters(const char* parameterString, - initialize_parameters& parameters) -{ - parameters.flags = 0; - parameters.verbose = false; - - void *handle = parse_driver_settings_string(parameterString); - if (handle == NULL) - return B_ERROR; - - if (get_driver_boolean_parameter(handle, "noindex", false, true)) - parameters.flags |= VOLUME_NO_INDICES; - if (get_driver_boolean_parameter(handle, "verbose", false, true)) - parameters.verbose = true; - - const char *string = get_driver_parameter(handle, "block_size", - NULL, NULL); - uint32 blockSize = 1024; - if (string != NULL) - blockSize = strtoul(string, NULL, 0); - - delete_driver_settings(handle); - - if (blockSize != 1024 && blockSize != 2048 && blockSize != 4096 - && blockSize != 8192) { - INFORM(("valid block sizes are: 1024, 2048, 4096, and 8192\n")); - return B_BAD_VALUE; - } - - parameters.blockSize = blockSize; - - return B_OK; -} - - static uint32 bfs_get_supported_operations(partition_data* partition, uint32 mask) { @@ -2066,37 +2024,18 @@ bfs_get_supported_operations(partition_data* partition, uint32 mask) } -static bool -bfs_validate_initialize(partition_data *partition, char *name, - const char *parameterString) -{ - if (name == NULL) - return B_BAD_VALUE; - - // truncate the name, if it is too long - size_t nameLen = strlen(name); - if (nameLen >= BFS_DISK_NAME_LENGTH) { - nameLen = BFS_DISK_NAME_LENGTH - 1; - name[nameLen] = '\0'; - } - - // replace '/' by '-' - while ((name = strchr(name, '/')) != NULL) - *name = '-'; - - // parse parameters - initialize_parameters parameters; - return (parse_initialize_parameters(parameterString, parameters) == B_OK); -} - - static status_t bfs_initialize(int fd, partition_id partitionID, const char *name, const char *parameterString, off_t /*partitionSize*/, disk_job_id job) { + // check name + status_t status = check_volume_name(name); + if (status != B_OK) + return status; + // parse parameters initialize_parameters parameters; - status_t status = parse_initialize_parameters(parameterString, parameters); + status = parse_initialize_parameters(parameterString, parameters); if (status != B_OK) return status; @@ -2296,7 +2235,7 @@ static file_system_module_info sBeFileSystem = { NULL, // validate_move NULL, // validate_set_content_name NULL, // validate_set_content_parameters - &bfs_validate_initialize, + NULL, // validate_initialize, /* shadow partition modification */ NULL, // shadow_changed diff --git a/src/tools/bfs_shell/Jamfile b/src/tools/bfs_shell/Jamfile index 674200abf3..3b9b4268b1 100644 --- a/src/tools/bfs_shell/Jamfile +++ b/src/tools/bfs_shell/Jamfile @@ -28,6 +28,7 @@ UsePrivateHeaders fs_shell ; BuildPlatformMain bfs_shell : + bfs_disk_system.cpp BlockAllocator.cpp BPlusTree.cpp Attribute.cpp