X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=qemu%2Froms%2Fipxe%2Fsrc%2Fusr%2Fautoboot.c;fp=qemu%2Froms%2Fipxe%2Fsrc%2Fusr%2Fautoboot.c;h=912543828aead8e2523c34524aa3e666f7b622d1;hb=437fd90c0250dee670290f9b714253671a990160;hp=47476ae404d96a57d613fd2f170243c2dfee9c0d;hpb=5bbd6fe9b8bab2a93e548c5a53b032d1939eec05;p=kvmfornfv.git diff --git a/qemu/roms/ipxe/src/usr/autoboot.c b/qemu/roms/ipxe/src/usr/autoboot.c index 47476ae40..912543828 100644 --- a/qemu/roms/ipxe/src/usr/autoboot.c +++ b/qemu/roms/ipxe/src/usr/autoboot.c @@ -15,9 +15,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. + * + * You can also choose to distribute this program under the terms of + * the Unmodified Binary Distribution Licence (as given in the file + * COPYING.UBDL), provided that you have satisfied its requirements. */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include @@ -42,6 +46,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include /** @file * @@ -101,7 +106,7 @@ static struct uri * parse_next_server_and_filename ( struct in_addr next_server, /* Construct a TFTP URI for the filename, if applicable */ if ( next_server.s_addr && filename[0] && ! uri_is_absolute ( uri ) ) { uri_put ( uri ); - uri = tftp_uri ( next_server, filename ); + uri = tftp_uri ( next_server, 0, filename ); if ( ! uri ) return NULL; } @@ -173,6 +178,7 @@ int uriboot ( struct uri *filename, struct uri *root_path, int drive, if ( filename ) { if ( ( rc = imgdownload ( filename, 0, &image ) ) != 0 ) goto err_download; + imgstat ( image ); image->flags |= IMAGE_AUTO_UNREGISTER; if ( ( rc = image_exec ( image ) ) != 0 ) { printf ( "Could not boot image: %s\n", @@ -434,9 +440,14 @@ int netboot ( struct net_device *netdev ) { * @ret is_autoboot Network device matches the autoboot device */ static int is_autoboot_busloc ( struct net_device *netdev ) { + struct device *dev; - return ( ( netdev->dev->desc.bus_type == autoboot_desc.bus_type ) && - ( netdev->dev->desc.location == autoboot_desc.location ) ); + for ( dev = netdev->dev ; dev ; dev = dev->parent ) { + if ( ( dev->desc.bus_type == autoboot_desc.bus_type ) && + ( dev->desc.location == autoboot_desc.location ) ) + return 1; + } + return 0; } /** @@ -522,7 +533,8 @@ static int shell_banner ( void ) { /* Prompt user */ printf ( "\n" ); - return ( prompt ( "Press Ctrl-B for the iPXE command line...", + return ( prompt ( "Press Ctrl-B for the " PRODUCT_SHORT_NAME + " command line...", ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 ), CTRL_B ) == 0 ); } @@ -531,28 +543,29 @@ static int shell_banner ( void ) { * Main iPXE flow of execution * * @v netdev Network device, or NULL + * @ret rc Return status code */ -void ipxe ( struct net_device *netdev ) { +int ipxe ( struct net_device *netdev ) { struct feature *feature; struct image *image; char *scriptlet; + int rc; /* * Print welcome banner * * * If you wish to brand this build of iPXE, please do so by - * defining the string PRODUCT_NAME in config/general.h. + * defining the string PRODUCT_NAME in config/branding.h. * * While nothing in the GPL prevents you from removing all * references to iPXE or http://ipxe.org, we prefer you not to * do so. * */ - printf ( NORMAL "\n\n%s\n" BOLD "iPXE %s" - NORMAL " -- Open Source Network Boot Firmware -- " - CYAN "http://ipxe.org" NORMAL "\n" - "Features:", product_name, product_version ); + printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD PRODUCT_SHORT_NAME " %s" + NORMAL " -- " PRODUCT_TAG_LINE " -- " + CYAN PRODUCT_URI NORMAL "\nFeatures:", product_version ); for_each_table_entry ( feature, FEATURES ) printf ( " %s", feature->name ); printf ( "\n" ); @@ -560,28 +573,30 @@ void ipxe ( struct net_device *netdev ) { /* Boot system */ if ( ( image = first_image() ) != NULL ) { /* We have an embedded image; execute it */ - image_exec ( image ); + return image_exec ( image ); } else if ( shell_banner() ) { /* User wants shell; just give them a shell */ - shell(); + return shell(); } else { fetch_string_setting_copy ( NULL, &scriptlet_setting, &scriptlet ); if ( scriptlet ) { /* User has defined a scriptlet; execute it */ - system ( scriptlet ); + rc = system ( scriptlet ); free ( scriptlet ); + return rc; } else { /* Try booting. If booting fails, offer the * user another chance to enter the shell. */ if ( netdev ) { - netboot ( netdev ); + rc = netboot ( netdev ); } else { - autoboot(); + rc = autoboot(); } if ( shell_banner() ) - shell(); + rc = shell(); + return rc; } } }