From 60c4e62e5dc56a451958456c7c013b161e53c9b9 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 4 Dec 2013 23:36:53 +0000 Subject: [PATCH] [settings] Add fetch_ipv6_setting() Signed-off-by: Michael Brown --- src/core/settings.c | 38 +++++++++++++++++++++++++++++++++++++ src/include/ipxe/settings.h | 7 +++++++ 2 files changed, 45 insertions(+) diff --git a/src/core/settings.c b/src/core/settings.c index 9b4087e8..1269c9a3 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -877,6 +877,44 @@ int fetch_ipv4_setting ( struct settings *settings, return fetch_ipv4_array_setting ( settings, setting, inp, 1 ); } +/** + * Fetch value of IPv6 address setting + * + * @v settings Settings block, or NULL to search all blocks + * @v setting Setting to fetch + * @v inp IPv6 addresses to fill in + * @v count Maximum number of IPv6 addresses + * @ret len Length of setting, or negative error + */ +int fetch_ipv6_array_setting ( struct settings *settings, + const struct setting *setting, + struct in6_addr *inp, unsigned int count ) { + int len; + + len = fetch_raw_setting ( settings, setting, inp, + ( sizeof ( *inp ) * count ) ); + if ( len < 0 ) + return len; + if ( ( len % sizeof ( *inp ) ) != 0 ) + return -ERANGE; + return len; +} + +/** + * Fetch value of IPv6 address setting + * + * @v settings Settings block, or NULL to search all blocks + * @v setting Setting to fetch + * @v inp IPv6 address to fill in + * @ret len Length of setting, or negative error + */ +int fetch_ipv6_setting ( struct settings *settings, + const struct setting *setting, + struct in6_addr *inp ) { + + return fetch_ipv6_array_setting ( settings, setting, inp, 1 ); +} + /** * Extract numeric value of setting * diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h index 3b1328c8..39756f7f 100644 --- a/src/include/ipxe/settings.h +++ b/src/include/ipxe/settings.h @@ -16,6 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); struct settings; struct in_addr; +struct in6_addr; union uuid; /** A setting */ @@ -341,6 +342,12 @@ extern int fetch_ipv4_array_setting ( struct settings *settings, extern int fetch_ipv4_setting ( struct settings *settings, const struct setting *setting, struct in_addr *inp ); +extern int fetch_ipv6_array_setting ( struct settings *settings, + const struct setting *setting, + struct in6_addr *inp, unsigned int count); +extern int fetch_ipv6_setting ( struct settings *settings, + const struct setting *setting, + struct in6_addr *inp ); extern int fetch_int_setting ( struct settings *settings, const struct setting *setting, long *value ); extern int fetch_uint_setting ( struct settings *settings,