david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/core/main.c
Michael Brown 076154a1c6 [image] Allow multiple embedded images
This patch extends the embedded image feature to allow multiple
embedded images instead of just one.

gPXE now always boots the first embedded image on startup instead of
doing the hardcoded DHCP boot (aka autoboot).

Based heavily upon a patch by Stefan Hajnoczi <stefanha@gmail.com>.
2009-02-16 00:30:36 +00:00

91 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. If booting fails (i.e. if the image
* returns, or fails to execute), offer a second
* chance to enter the shell for diagnostics.
*/
for_each_image ( image ) {
image_exec ( image );
break;
}
if ( shell_banner() )
shell();
}
shutdown ( SHUTDOWN_EXIT | shutdown_exit_flags );
return 0;
}