diff options
author | Michael Brown | 2006-12-20 08:04:08 +0100 |
---|---|---|
committer | Michael Brown | 2006-12-20 08:04:08 +0100 |
commit | 84202d89f0fa83790a4d3f78119f1fb62c1b3d9b (patch) | |
tree | 066eba0ee9db7e82922e662e7d6e5c29ac59d021 | |
parent | Explicitly call erase(), to cope with platforms where the ANSI clear (diff) | |
download | ipxe-84202d89f0fa83790a4d3f78119f1fb62c1b3d9b.tar.gz ipxe-84202d89f0fa83790a4d3f78119f1fb62c1b3d9b.tar.xz ipxe-84202d89f0fa83790a4d3f78119f1fb62c1b3d9b.zip |
Split the (quick hack) boot logic out from main.c to autoboot.c, add a
"boot" command to attempt booting from within the command shell, fall back
to shell if boot fails for any reason.
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/config.h | 3 | ||||
-rw-r--r-- | src/core/config.c | 3 | ||||
-rw-r--r-- | src/core/main.c | 19 | ||||
-rw-r--r-- | src/hci/commands/boot_cmd.c | 21 | ||||
-rw-r--r-- | src/include/gpxe/autoboot.h | 12 | ||||
-rw-r--r-- | src/usr/autoboot.c | 40 |
7 files changed, 85 insertions, 14 deletions
diff --git a/src/Makefile b/src/Makefile index 9c98909d..95ea3998 100644 --- a/src/Makefile +++ b/src/Makefile @@ -146,6 +146,7 @@ SRCDIRS += tests SRCDIRS += crypto SRCDIRS += hci hci/commands hci/tui SRCDIRS += hci/mucurses hci/mucurses/widgets +SRCDIRS += usr # NON_AUTO_SRCS lists files that are excluded from the normal # automatic build system. diff --git a/src/config.h b/src/config.h index 088d448a..32caa8ac 100644 --- a/src/config.h +++ b/src/config.h @@ -115,8 +115,9 @@ * Command-line commands to include * */ +#define BOOT_CMD /* Automatic booting */ #define NVO_CMD /* Non-volatile option storage commands */ -#define CONFIG_CMD /* Option configuration console */ +#define CONFIG_CMD /* Option configuration console */ /* @END general.h */ diff --git a/src/core/config.c b/src/core/config.c index c8ec9362..b501ea55 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -143,6 +143,9 @@ REQUIRE_OBJECT ( pxe ); * Drag in all requested commands * */ +#ifdef BOOT_CMD +REQUIRE_OBJECT ( boot_cmd ); +#endif #ifdef NVO_CMD REQUIRE_OBJECT ( nvo_cmd ); #endif diff --git a/src/core/main.c b/src/core/main.c index 191ba841..0a8ea1f1 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -150,26 +150,19 @@ void test_dhcp ( struct net_device *netdev ); MAIN - Kick off routine **************************************************************************/ int main ( void ) { - struct net_device *netdev; /* Call all registered initialisation functions */ init_heap(); call_init_fns (); probe_devices(); - if ( shell_banner() ) { - shell(); + /* Try autobooting if we're not going straight to the shell */ + if ( ! shell_banner() ) { + autoboot(); } - - netdev = next_netdev (); - if ( netdev ) { - test_dhcp ( netdev ); - } else { - printf ( "No network device found\n" ); - } - - printf ( "Press any key to exit\n" ); - getchar(); + + /* Autobooting failed or the user wanted the shell */ + shell(); remove_devices(); call_exit_fns (); diff --git a/src/hci/commands/boot_cmd.c b/src/hci/commands/boot_cmd.c new file mode 100644 index 00000000..0681ec54 --- /dev/null +++ b/src/hci/commands/boot_cmd.c @@ -0,0 +1,21 @@ +#include <vsprintf.h> +#include <gpxe/command.h> +#include <gpxe/autoboot.h> + +static int boot_exec ( int argc, char **argv ) { + + if ( argc != 1 ) { + printf ( "Usage: %s\n" + "Attempts to boot the system\n", argv[0] ); + return 1; + } + + autoboot(); + + return 0; +} + +struct command boot_command __command = { + .name = "boot", + .exec = boot_exec, +}; diff --git a/src/include/gpxe/autoboot.h b/src/include/gpxe/autoboot.h new file mode 100644 index 00000000..bea2e4b3 --- /dev/null +++ b/src/include/gpxe/autoboot.h @@ -0,0 +1,12 @@ +#ifndef _GPXE_AUTOBOOT_H +#define _GPXE_AUTOBOOT_H + +/** @file + * + * Automatic booting + * + */ + +extern void autoboot ( void ); + +#endif /* _GPXE_AUTOBOOT_H */ diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c new file mode 100644 index 00000000..ddfc3781 --- /dev/null +++ b/src/usr/autoboot.c @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <vsprintf.h> +#include <gpxe/autoboot.h> + +/** @file + * + * Automatic booting + * + */ + +#include <gpxe/netdevice.h> +void test_dhcp ( struct net_device *netdev ); + +void autoboot ( void ) { + struct net_device *netdev; + + netdev = next_netdev (); + if ( netdev ) { + test_dhcp ( netdev ); + } else { + printf ( "No network device found\n" ); + } +} |