summaryrefslogtreecommitdiffstats
path: root/src/core/settings.c
diff options
context:
space:
mode:
authorMichael Brown2006-08-11 20:22:41 +0200
committerMichael Brown2006-08-11 20:22:41 +0200
commitfe774fe356cbcaebe0f915ad8f039bc09f02e2be (patch)
tree14dc870c436ac86714167b7e9ca013b222c9f283 /src/core/settings.c
parentAdd string configuration type (diff)
downloadipxe-fe774fe356cbcaebe0f915ad8f039bc09f02e2be.tar.gz
ipxe-fe774fe356cbcaebe0f915ad8f039bc09f02e2be.tar.xz
ipxe-fe774fe356cbcaebe0f915ad8f039bc09f02e2be.zip
Added ipv4 configuration type
Diffstat (limited to 'src/core/settings.c')
-rw-r--r--src/core/settings.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/core/settings.c b/src/core/settings.c
index 0de697e0..e15fc297 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -21,6 +21,8 @@
#include <string.h>
#include <errno.h>
#include <assert.h>
+#include <vsprintf.h>
+#include <gpxe/in.h>
#include <gpxe/settings.h>
/** @file
@@ -195,3 +197,57 @@ struct config_setting_type config_setting_type_string __config_setting_type = {
.show = show_string,
.set = set_string,
};
+
+/**
+ * Show value of IPv4 setting
+ *
+ * @v context Configuration context
+ * @v setting Configuration setting
+ * @v buf Buffer to contain value
+ * @v len Length of buffer
+ * @ret rc Return status code
+ */
+static int show_ipv4 ( struct config_context *context,
+ struct config_setting *setting,
+ char *buf, size_t len ) {
+ struct dhcp_option *option;
+ struct in_addr ipv4;
+
+ option = find_dhcp_option ( context->options, setting->tag );
+ if ( ! option )
+ return -ENOENT;
+ dhcp_ipv4_option ( option, &ipv4 );
+ snprintf ( buf, len, inet_ntoa ( ipv4 ) );
+ return 0;
+}
+
+/** Set value of IPV4 setting
+ *
+ * @v context Configuration context
+ * @v setting Configuration setting
+ * @v value Setting value (as a string)
+ * @ret rc Return status code
+ */
+static int set_ipv4 ( struct config_context *context,
+ struct config_setting *setting,
+ const char *value ) {
+ struct dhcp_option *option;
+ struct in_addr ipv4;
+ int rc;
+
+ if ( ( rc = inet_aton ( value, &ipv4 ) ) != 0 )
+ return rc;
+ option = set_dhcp_option ( context->options, setting->tag,
+ &ipv4, sizeof ( ipv4 ) );
+ if ( ! option )
+ return -ENOMEM;
+ return 0;
+}
+
+/** An IPv4 configuration setting */
+struct config_setting_type config_setting_type_ipv4 __config_setting_type = {
+ .name = "ipv4",
+ .show = show_ipv4,
+ .set = set_ipv4,
+};
+