diff --git a/src/core/settings.c b/src/core/settings.c index 816ae141..e2b48263 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -646,6 +646,29 @@ int fetch_string_setting_copy ( struct settings *settings, return len; } +/** + * Fetch value of IPv4 address setting + * + * @v settings Settings block, or NULL to search all blocks + * @v setting Setting to fetch + * @v inp IPv4 addresses to fill in + * @v count Maximum number of IPv4 addresses + * @ret len Length of setting, or negative error + */ +int fetch_ipv4_array_setting ( struct settings *settings, + struct setting *setting, + struct in_addr *inp, unsigned int count ) { + int len; + + len = fetch_setting ( settings, setting, inp, + ( sizeof ( *inp ) * count ) ); + if ( len < 0 ) + return len; + if ( ( len % sizeof ( *inp ) ) != 0 ) + return -ERANGE; + return len; +} + /** * Fetch value of IPv4 address setting * @@ -656,14 +679,7 @@ int fetch_string_setting_copy ( struct settings *settings, */ int fetch_ipv4_setting ( struct settings *settings, struct setting *setting, struct in_addr *inp ) { - int len; - - len = fetch_setting ( settings, setting, inp, sizeof ( *inp ) ); - if ( len < 0 ) - return len; - if ( len < ( int ) sizeof ( *inp ) ) - return -ERANGE; - return len; + return fetch_ipv4_array_setting ( settings, setting, inp, 1 ); } /** diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h index db20be5e..a764bf0e 100644 --- a/src/include/ipxe/settings.h +++ b/src/include/ipxe/settings.h @@ -193,6 +193,10 @@ extern int fetch_string_setting ( struct settings *settings, extern int fetch_string_setting_copy ( struct settings *settings, struct setting *setting, char **data ); +extern int fetch_ipv4_array_setting ( struct settings *settings, + struct setting *setting, + struct in_addr *inp, + unsigned int count ); extern int fetch_ipv4_setting ( struct settings *settings, struct setting *setting, struct in_addr *inp ); extern int fetch_int_setting ( struct settings *settings,