Split the (quick hack) boot logic out from main.c to autoboot.c, add a
authorMichael Brown <mcb30@etherboot.org>
Wed, 20 Dec 2006 07:04:08 +0000 (07:04 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 20 Dec 2006 07:04:08 +0000 (07:04 +0000)
"boot" command to attempt booting from within the command shell, fall back
to shell if boot fails for any reason.

src/Makefile
src/config.h
src/core/config.c
src/core/main.c
src/hci/commands/boot_cmd.c [new file with mode: 0644]
src/include/gpxe/autoboot.h [new file with mode: 0644]
src/usr/autoboot.c [new file with mode: 0644]

index 9c98909..95ea399 100644 (file)
@@ -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.
index 088d448..32caa8a 100644 (file)
  * 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 */ 
 
index c8ec936..b501ea5 100644 (file)
@@ -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
index 191ba84..0a8ea1f 100644 (file)
@@ -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 (file)
index 0000000..0681ec5
--- /dev/null
@@ -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 (file)
index 0000000..bea2e4b
--- /dev/null
@@ -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 (file)
index 0000000..ddfc378
--- /dev/null
@@ -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" );
+       }
+}