diff options
author | Michael Brown | 2013-03-11 19:38:42 +0100 |
---|---|---|
committer | Michael Brown | 2013-03-13 23:24:13 +0100 |
commit | 033f4c92ca86834e44cb3c2a75cdc87cdef80cf9 (patch) | |
tree | 0bb54bb20a11e2bed4bde9d0c3f0ee96b37bd1f8 /src/usr | |
parent | [efi] Update to latest EDK2 headers (diff) | |
download | ipxe-033f4c92ca86834e44cb3c2a75cdc87cdef80cf9.tar.gz ipxe-033f4c92ca86834e44cb3c2a75cdc87cdef80cf9.tar.xz ipxe-033f4c92ca86834e44cb3c2a75cdc87cdef80cf9.zip |
[autoboot] Split main control flow out of main() into a new function ipxe()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/usr')
-rw-r--r-- | src/usr/autoboot.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index 0587f204..b2d288ea 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -30,11 +30,18 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <ipxe/uri.h> #include <ipxe/open.h> #include <ipxe/init.h> +#include <ipxe/keys.h> +#include <ipxe/version.h> +#include <ipxe/shell.h> +#include <ipxe/features.h> +#include <ipxe/image.h> #include <usr/ifmgmt.h> #include <usr/route.h> #include <usr/dhcpmgmt.h> #include <usr/imgmgmt.h> +#include <usr/prompt.h> #include <usr/autoboot.h> +#include <config/general.h> /** @file * @@ -47,6 +54,18 @@ FILE_LICENCE ( GPL2_OR_LATER ); #define EINFO_ENOENT_BOOT \ __einfo_uniqify ( EINFO_ENOENT, 0x01, "Nothing to boot" ) +#define NORMAL "\033[0m" +#define BOLD "\033[1m" +#define CYAN "\033[36m" + +/** The "scriptlet" setting */ +struct setting scriptlet_setting __setting ( SETTING_MISC ) = { + .name = "scriptlet", + .description = "Boot scriptlet", + .tag = DHCP_EB_SCRIPTLET, + .type = &setting_type_string, +}; + /** * Perform PXE menu boot when PXE stack is not available */ @@ -423,3 +442,79 @@ int autoboot ( void ) { printf ( "No more network devices\n" ); return rc; } + +/** + * Prompt for shell entry + * + * @ret enter_shell User wants to enter shell + */ +static int shell_banner ( void ) { + + /* Skip prompt if timeout is zero */ + if ( BANNER_TIMEOUT <= 0 ) + return 0; + + /* Prompt user */ + printf ( "\n" ); + return ( prompt ( "Press Ctrl-B for the iPXE command line...", + ( BANNER_TIMEOUT * 100 ), CTRL_B ) == 0 ); +} + +/** + * Main iPXE flow of execution + * + * @v netdev Network device, or NULL + */ +void ipxe ( struct net_device *netdev ) { + struct feature *feature; + struct image *image; + char *scriptlet; + + /* + * 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. + * + * 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" PRODUCT_NAME "\n" BOLD "iPXE %s" + NORMAL " -- Open Source Network Boot Firmware -- " + CYAN "http://ipxe.org" NORMAL "\n" + "Features:", product_version ); + for_each_table_entry ( feature, FEATURES ) + printf ( " %s", feature->name ); + printf ( "\n" ); + + /* Boot system */ + if ( ( image = first_image() ) != NULL ) { + /* We have an embedded image; execute it */ + image_exec ( image ); + } else if ( shell_banner() ) { + /* User wants shell; just give them a shell */ + shell(); + } else { + fetch_string_setting_copy ( NULL, &scriptlet_setting, + &scriptlet ); + if ( scriptlet ) { + /* User has defined a scriptlet; execute it */ + system ( scriptlet ); + free ( scriptlet ); + } else { + /* Try booting. If booting fails, offer the + * user another chance to enter the shell. + */ + if ( netdev ) { + netboot ( netdev ); + } else { + autoboot(); + } + if ( shell_banner() ) + shell(); + } + } +} |