mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-23 01:51:58 +00:00
[autoboot] Use next-server from filename's settings block
Locate the settings block containing the filename, and search only that settings block for the next-server address. This avoids problems caused by misconfigured DHCP servers which provide a next-server address (often defaulting to the DHCP server's own IP address) even when not providing a filename. Originally-implemented-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
238050dfd4
commit
936134ed46
@ -251,31 +251,42 @@ static void close_all_netdevs ( void ) {
|
||||
* @ret uri URI, or NULL on failure
|
||||
*/
|
||||
struct uri * fetch_next_server_and_filename ( struct settings *settings ) {
|
||||
struct in_addr next_server;
|
||||
char buf[256];
|
||||
struct in_addr next_server = { 0 };
|
||||
char *raw_filename = NULL;
|
||||
struct uri *uri = NULL;
|
||||
char *filename;
|
||||
struct uri *uri;
|
||||
|
||||
/* Fetch next-server setting */
|
||||
fetch_ipv4_setting ( settings, &next_server_setting, &next_server );
|
||||
if ( next_server.s_addr )
|
||||
printf ( "Next server: %s\n", inet_ntoa ( next_server ) );
|
||||
/* Determine settings block containing the filename, if any */
|
||||
settings = fetch_setting_origin ( settings, &filename_setting );
|
||||
|
||||
/* Fetch filename setting */
|
||||
fetch_string_setting ( settings, &filename_setting,
|
||||
buf, sizeof ( buf ) );
|
||||
if ( buf[0] )
|
||||
printf ( "Filename: %s\n", buf );
|
||||
/* If we have a filename, fetch it along with next-server */
|
||||
if ( settings ) {
|
||||
fetch_ipv4_setting ( settings, &next_server_setting,
|
||||
&next_server );
|
||||
if ( fetch_string_setting_copy ( settings, &filename_setting,
|
||||
&raw_filename ) < 0 )
|
||||
goto err_fetch;
|
||||
}
|
||||
|
||||
/* Expand filename setting */
|
||||
filename = expand_settings ( buf );
|
||||
filename = expand_settings ( raw_filename ? raw_filename : "" );
|
||||
if ( ! filename )
|
||||
return NULL;
|
||||
goto err_expand;
|
||||
|
||||
/* Parse next server and filename */
|
||||
if ( next_server.s_addr )
|
||||
printf ( "Next server: %s\n", inet_ntoa ( next_server ) );
|
||||
if ( filename[0] )
|
||||
printf ( "Filename: %s\n", filename );
|
||||
uri = parse_next_server_and_filename ( next_server, filename );
|
||||
if ( ! uri )
|
||||
goto err_parse;
|
||||
|
||||
err_parse:
|
||||
free ( filename );
|
||||
err_expand:
|
||||
free ( raw_filename );
|
||||
err_fetch:
|
||||
return uri;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user