diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index b2d288ea..70f883a5 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -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; }