/************************************************************************** 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 #include #include #include #include #include #include #include #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; }