summaryrefslogtreecommitdiffstats
path: root/src/core/settings.c
diff options
context:
space:
mode:
authorMichael Brown2008-03-22 01:24:50 +0100
committerMichael Brown2008-03-22 01:31:08 +0100
commite5cea13e51f5226987048275499314c6f15d526f (patch)
treed346fa495c66a03eb2a5c40ef2eab3d92326d3c8 /src/core/settings.c
parent[Settings] DHCP is now working using the new settings API. (diff)
downloadipxe-e5cea13e51f5226987048275499314c6f15d526f.tar.gz
ipxe-e5cea13e51f5226987048275499314c6f15d526f.tar.xz
ipxe-e5cea13e51f5226987048275499314c6f15d526f.zip
[Settings] Implement simple_settings backed with extensible DHCP options
Diffstat (limited to 'src/core/settings.c')
-rw-r--r--src/core/settings.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/src/core/settings.c b/src/core/settings.c
index 7dd697ed..eb54ad73 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -79,23 +79,36 @@ static inline char * setting_tag_name ( unsigned int tag ) {
******************************************************************************
*/
-// Dummy routine just for testing
+/**
+ * Store value of simple setting
+ *
+ * @v options DHCP option block
+ * @v tag Setting tag number
+ * @v data Setting data, or NULL to clear setting
+ * @v len Length of setting data
+ * @ret rc Return status code
+ */
int simple_settings_store ( struct settings *settings, unsigned int tag,
const void *data, size_t len ) {
- DBGC ( settings, "Settings %p: store %s to:\n",
- settings, setting_tag_name ( tag ) );
- DBGC_HD ( settings, data, len );
- return 0;
+ struct simple_settings *simple =
+ container_of ( settings, struct simple_settings, settings );
+ return dhcpopt_extensible_store ( &simple->dhcpopts, tag, data, len );
}
-// Dummy routine just for testing
+/**
+ * Fetch value of simple setting
+ *
+ * @v options DHCP option block
+ * @v tag Setting tag number
+ * @v data Buffer to fill with setting data
+ * @v len Length of buffer
+ * @ret len Length of setting data, or negative error
+ */
int simple_settings_fetch ( struct settings *settings, unsigned int tag,
void *data, size_t len ) {
- ( void ) settings;
- ( void ) tag;
- ( void ) data;
- ( void ) len;
- return -ENOENT;
+ struct simple_settings *simple =
+ container_of ( settings, struct simple_settings, settings );
+ return dhcpopt_fetch ( &simple->dhcpopts, tag, data, len );
}
/** Simple settings operations */
@@ -104,15 +117,22 @@ struct settings_operations simple_settings_operations = {
.fetch = simple_settings_fetch,
};
-/** Root settings block */
-struct settings settings_root = {
- .refcnt = NULL,
- .name = "",
- .siblings = LIST_HEAD_INIT ( settings_root.siblings ),
- .children = LIST_HEAD_INIT ( settings_root.children ),
- .op = &simple_settings_operations,
+/** Root simple settings block */
+struct simple_settings simple_settings_root = {
+ .settings = {
+ .refcnt = NULL,
+ .name = "",
+ .siblings =
+ LIST_HEAD_INIT ( simple_settings_root.settings.siblings ),
+ .children =
+ LIST_HEAD_INIT ( simple_settings_root.settings.children ),
+ .op = &simple_settings_operations,
+ },
};
+/** Root settings block */
+#define settings_root simple_settings_root.settings
+
/**
* Apply all settings
*