4f3bab1a55
Having a default script containing #!gpxe autoboot can cause problems when entering commands to load and start a kernel manually; the default script image will still be present when the kernel is started and so will be treated as an initrd. It is possible to work around this by typing "imgfree" before any other commands, but this is counter-intuitive. Fix by allowing the embedded image list to be empty (in which case we just call autoboot()), and making this the default. Reported by alkisg@gmail.com.
95 lines
2.4 KiB
C
95 lines
2.4 KiB
C
/**************************************************************************
|
|
gPXE - Network Bootstrap Program
|
|
|
|
Literature dealing with the network protocols:
|
|
ARP - RFC826
|
|
RARP - RFC903
|
|
UDP - RFC768
|
|
BOOTP - RFC951, RFC2132 (vendor extensions)
|
|
DHCP - RFC2131, RFC2132 (options)
|
|
TFTP - RFC1350, RFC2347 (options), RFC2348 (blocksize), RFC2349 (tsize)
|
|
RPC - RFC1831, RFC1832 (XDR), RFC1833 (rpcbind/portmapper)
|
|
NFS - RFC1094, RFC1813 (v3, useful for clarifications, not implemented)
|
|
IGMP - RFC1112
|
|
|
|
**************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <gpxe/init.h>
|
|
#include <gpxe/features.h>
|
|
#include <gpxe/shell.h>
|
|
#include <gpxe/shell_banner.h>
|
|
#include <gpxe/image.h>
|
|
#include <usr/autoboot.h>
|
|
#include <config/general.h>
|
|
|
|
#define NORMAL "\033[0m"
|
|
#define BOLD "\033[1m"
|
|
#define CYAN "\033[36m"
|
|
|
|
static struct feature features[0] __table_start ( struct feature, features );
|
|
static struct feature features_end[0] __table_end ( struct feature, features );
|
|
|
|
/**
|
|
* Main entry point
|
|
*
|
|
* @ret rc Return status code
|
|
*/
|
|
__asmcall int main ( void ) {
|
|
struct feature *feature;
|
|
struct image *image;
|
|
|
|
/* Some devices take an unreasonably long time to initialise */
|
|
printf ( PRODUCT_SHORT_NAME " initialising devices...\n" );
|
|
|
|
initialise();
|
|
startup();
|
|
|
|
/*
|
|
* Print welcome banner
|
|
*
|
|
*
|
|
* If you wish to brand this build of gPXE, please do so by
|
|
* defining the string PRODUCT_NAME in config/general.h.
|
|
*
|
|
* While nothing in the GPL prevents you from removing all
|
|
* references to gPXE or http://etherboot.org, we prefer you
|
|
* not to do so.
|
|
*
|
|
*/
|
|
printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD "gPXE " VERSION
|
|
NORMAL " -- Open Source Boot Firmware -- "
|
|
CYAN "http://etherboot.org" NORMAL "\n"
|
|
"Features:" );
|
|
for ( feature = features ; feature < features_end ; feature++ )
|
|
printf ( " %s", feature->name );
|
|
printf ( "\n" );
|
|
|
|
/* Prompt for shell */
|
|
if ( shell_banner() ) {
|
|
/* User wants shell; just give them a shell */
|
|
shell();
|
|
} else {
|
|
/* User doesn't want shell; load and execute the first
|
|
* image, or autoboot() if we have no images. If
|
|
* booting fails for any reason, offer a second chance
|
|
* to enter the shell for diagnostics.
|
|
*/
|
|
if ( have_images() ) {
|
|
for_each_image ( image ) {
|
|
image_exec ( image );
|
|
break;
|
|
}
|
|
} else {
|
|
autoboot();
|
|
}
|
|
|
|
if ( shell_banner() )
|
|
shell();
|
|
}
|
|
|
|
shutdown ( SHUTDOWN_EXIT | shutdown_exit_flags );
|
|
|
|
return 0;
|
|
}
|