diff --git a/doc/releases/release-notes-3.3.rst b/doc/releases/release-notes-3.3.rst index a9a54ca9343..ac806c85081 100644 --- a/doc/releases/release-notes-3.3.rst +++ b/doc/releases/release-notes-3.3.rst @@ -122,7 +122,8 @@ Deprecated in this release :kconfig:option:`CONFIG_SETTINGS_FS` in favor of :kconfig:option:`CONFIG_SETTINGS_FILE` - :kconfig:option:`CONFIG_SETTINGS_FS_DIR` in favor of :kconfig:option:`CONFIG_SETTINGS_FILE_DIR` + :kconfig:option:`CONFIG_SETTINGS_FS_DIR` in favor of creating all parent + directories from :kconfig:option:`CONFIG_SETTINGS_FILE_PATH` :kconfig:option:`CONFIG_SETTINGS_FS_FILE` in favor of :kconfig:option:`CONFIG_SETTINGS_FILE_PATH` diff --git a/samples/subsys/settings/boards/native_posix.conf b/samples/subsys/settings/boards/native_posix.conf index 90636345a99..21877f886f3 100644 --- a/samples/subsys/settings/boards/native_posix.conf +++ b/samples/subsys/settings/boards/native_posix.conf @@ -2,5 +2,4 @@ CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=y CONFIG_SETTINGS_FILE=y -CONFIG_SETTINGS_FILE_DIR="/ff/settings" CONFIG_SETTINGS_FILE_PATH="/ff/settings/run" diff --git a/samples/subsys/settings/boards/native_posix_64.conf b/samples/subsys/settings/boards/native_posix_64.conf index 90636345a99..21877f886f3 100644 --- a/samples/subsys/settings/boards/native_posix_64.conf +++ b/samples/subsys/settings/boards/native_posix_64.conf @@ -2,5 +2,4 @@ CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=y CONFIG_SETTINGS_FILE=y -CONFIG_SETTINGS_FILE_DIR="/ff/settings" CONFIG_SETTINGS_FILE_PATH="/ff/settings/run" diff --git a/subsys/settings/Kconfig b/subsys/settings/Kconfig index 0aa414ae8f7..0e2e4a29e96 100644 --- a/subsys/settings/Kconfig +++ b/subsys/settings/Kconfig @@ -111,13 +111,6 @@ config SETTINGS_FCB_MAGIC help Magic 32-bit word for to identify valid settings area -config SETTINGS_FILE_DIR - string "Serialization directory" - default "/settings" - depends on SETTINGS_FILE - help - Directory where the settings data is stored - config SETTINGS_FILE_PATH string "Default settings file" default "/settings/run" @@ -137,7 +130,7 @@ config SETTINGS_FS_DIR default "/settings" depends on SETTINGS_FS help - This is deprecated. Use SETTINGS_FILE_DIR instead. + This is deprecated. Use SETTINGS_FILE_PATH instead. config SETTINGS_FS_FILE string "Default settings file (DEPRECATED)" diff --git a/subsys/settings/src/settings_file.c b/subsys/settings/src/settings_file.c index e02194f80bd..99a27a07b8a 100644 --- a/subsys/settings/src/settings_file.c +++ b/subsys/settings/src/settings_file.c @@ -21,11 +21,9 @@ LOG_MODULE_DECLARE(settings, CONFIG_SETTINGS_LOG_LEVEL); #ifdef CONFIG_SETTINGS_FS #define SETTINGS_FILE_MAX_LINES CONFIG_SETTINGS_FS_MAX_LINES -#define SETTINGS_FILE_DIR CONFIG_SETTINGS_FS_DIR #define SETTINGS_FILE_PATH CONFIG_SETTINGS_FS_FILE #else #define SETTINGS_FILE_MAX_LINES CONFIG_SETTINGS_FILE_MAX_LINES -#define SETTINGS_FILE_DIR CONFIG_SETTINGS_FILE_DIR #define SETTINGS_FILE_PATH CONFIG_SETTINGS_FILE_PATH #endif @@ -519,16 +517,54 @@ void settings_mount_file_backend(struct settings_file *cf) settings_line_io_init(read_handler, write_handler, get_len_cb, 1); } +static int mkdir_if_not_exists(const char *path) +{ + struct fs_dirent entry; + int err; + + err = fs_stat(path, &entry); + if (err == -ENOENT) { + return fs_mkdir(path); + } else if (err) { + return err; + } + + if (entry.type != FS_DIR_ENTRY_DIR) { + return -EEXIST; + } + + return 0; +} + +static int mkdir_for_file(const char *file_path) +{ + char dir_path[SETTINGS_FILE_NAME_MAX]; + int err; + + for (size_t i = 0; file_path[i] != '\0'; i++) { + if (i > 0 && file_path[i] == '/') { + dir_path[i] = '\0'; + + err = mkdir_if_not_exists(dir_path); + if (err) { + return err; + } + } + + dir_path[i] = file_path[i]; + } + + return 0; +} + int settings_backend_init(void) { static struct settings_file config_init_settings_file = { .cf_name = SETTINGS_FILE_PATH, .cf_maxlines = SETTINGS_FILE_MAX_LINES }; - struct fs_dirent entry; int rc; - rc = settings_file_src(&config_init_settings_file); if (rc) { return rc; @@ -544,12 +580,7 @@ int settings_backend_init(void) /* * Must be called after root FS has been initialized. */ - rc = fs_stat(SETTINGS_FILE_DIR, &entry); - /* If directory doesn't exist, create it */ - if (rc == -ENOENT) { - rc = fs_mkdir(SETTINGS_FILE_DIR); - } - return rc; + return mkdir_for_file(config_init_settings_file.cf_name); } static void *settings_file_storage_get(struct settings_store *cs) diff --git a/tests/subsys/settings/file/include/settings_test.h b/tests/subsys/settings/file/include/settings_test.h index f508ed79d77..58e82f13cac 100644 --- a/tests/subsys/settings/file/include/settings_test.h +++ b/tests/subsys/settings/file/include/settings_test.h @@ -10,7 +10,7 @@ #include "settings_test_file.h" #define TEST_FS_MPTR "/fs" -#define TEST_CONFIG_DIR TEST_FS_MPTR""CONFIG_SETTINGS_FILE_DIR +#define TEST_CONFIG_DIR TEST_FS_MPTR"/settings" void *config_setup_fs(void); diff --git a/tests/subsys/settings/functional/file/prj.conf b/tests/subsys/settings/functional/file/prj.conf index 71800fa25a7..c9674b2b08a 100644 --- a/tests/subsys/settings/functional/file/prj.conf +++ b/tests/subsys/settings/functional/file/prj.conf @@ -14,5 +14,4 @@ CONFIG_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS_FILE=y -CONFIG_SETTINGS_FILE_DIR="/ff/settings" CONFIG_SETTINGS_FILE_PATH="/ff/settings/run" diff --git a/tests/subsys/settings/functional/file/prj_native_posix.conf b/tests/subsys/settings/functional/file/prj_native_posix.conf index 23b1a642ad4..b7fd141eda7 100644 --- a/tests/subsys/settings/functional/file/prj_native_posix.conf +++ b/tests/subsys/settings/functional/file/prj_native_posix.conf @@ -11,5 +11,4 @@ CONFIG_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS_FILE=y -CONFIG_SETTINGS_FILE_DIR="/ff/settings" CONFIG_SETTINGS_FILE_PATH="/ff/settings/run" diff --git a/tests/subsys/settings/functional/file/prj_native_posix_64.conf b/tests/subsys/settings/functional/file/prj_native_posix_64.conf index 23b1a642ad4..b7fd141eda7 100644 --- a/tests/subsys/settings/functional/file/prj_native_posix_64.conf +++ b/tests/subsys/settings/functional/file/prj_native_posix_64.conf @@ -11,5 +11,4 @@ CONFIG_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS_FILE=y -CONFIG_SETTINGS_FILE_DIR="/ff/settings" CONFIG_SETTINGS_FILE_PATH="/ff/settings/run" diff --git a/tests/subsys/settings/functional/file/prj_qemu_x86.conf b/tests/subsys/settings/functional/file/prj_qemu_x86.conf index 58f2c6d81a1..3efb806d63c 100644 --- a/tests/subsys/settings/functional/file/prj_qemu_x86.conf +++ b/tests/subsys/settings/functional/file/prj_qemu_x86.conf @@ -12,5 +12,4 @@ CONFIG_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS_FILE=y -CONFIG_SETTINGS_FILE_DIR="/ff/settings" CONFIG_SETTINGS_FILE_PATH="/ff/settings/run"