@@ -20,6 +20,11 @@ struct ReadEntry {
20
20
bool result;
21
21
};
22
22
23
+ struct DeleteSubtreeEntry {
24
+ const char *prefix;
25
+ int result;
26
+ };
27
+
23
28
/* Random magic bytes to represent an empty value.
24
29
It is needed because Zephyr settings subsystem does not distinguish an empty value from no value. */
25
30
constexpr uint8_t kEmptyValue [] = { 0x22 , 0xa6 , 0x54 , 0xd1 , 0x39 };
@@ -61,6 +66,24 @@ int LoadEntryCallback(const char *name, size_t entrySize, settings_read_cb readC
61
66
62
67
return 1 ;
63
68
}
69
+
70
+ int DeleteSubtreeCallback (const char *name, size_t entrySize, settings_read_cb readCb, void *cbArg, void *param)
71
+ {
72
+ DeleteSubtreeEntry &entry = *static_cast <DeleteSubtreeEntry *>(param);
73
+ char fullKey[SETTINGS_MAX_NAME_LEN + 1 ];
74
+
75
+ // name comes from Zephyr settings subsystem so it is guaranteed to fit in the buffer.
76
+ (void )snprintf (fullKey, sizeof (fullKey), " %s/%s" , entry.prefix , name);
77
+ const int result = settings_delete (fullKey);
78
+
79
+ // Return the first error, but continue removing remaining keys anyway.
80
+ if (entry.result == 0 ) {
81
+ entry.result = result;
82
+ }
83
+
84
+ return 0 ;
85
+ }
86
+
64
87
} /* namespace */
65
88
66
89
namespace Nrf
@@ -160,4 +183,17 @@ bool PersistentStorageSettings::LoadEntry(const char *key, void *data, size_t da
160
183
161
184
return true ;
162
185
}
186
+
187
+ PSErrorCode PersistentStorageSettings::_NonSecureRemoveSubtree (const char *prefix)
188
+ {
189
+ DeleteSubtreeEntry entry{ prefix, 0 };
190
+ int result = settings_load_subtree_direct (prefix, DeleteSubtreeCallback, &entry);
191
+
192
+ if (result == 0 && entry.result == 0 ) {
193
+ return PSErrorCode::Success;
194
+ }
195
+
196
+ return PSErrorCode::Failure;
197
+ }
198
+
163
199
} /* namespace Nrf */
0 commit comments