[iSCSI] Support Windows Server 2008 direct iSCSI installation
[people/mdeck/gpxe.git] / src / core / main.c
1 /**************************************************************************
2 gPXE -  Network Bootstrap Program
3
4 Literature dealing with the network protocols:
5         ARP - RFC826
6         RARP - RFC903
7         UDP - RFC768
8         BOOTP - RFC951, RFC2132 (vendor extensions)
9         DHCP - RFC2131, RFC2132 (options)
10         TFTP - RFC1350, RFC2347 (options), RFC2348 (blocksize), RFC2349 (tsize)
11         RPC - RFC1831, RFC1832 (XDR), RFC1833 (rpcbind/portmapper)
12         NFS - RFC1094, RFC1813 (v3, useful for clarifications, not implemented)
13         IGMP - RFC1112
14
15 **************************************************************************/
16
17 #include <stdio.h>
18 #include <gpxe/init.h>
19 #include <gpxe/features.h>
20 #include <gpxe/shell.h>
21 #include <gpxe/shell_banner.h>
22 #include <usr/autoboot.h>
23
24 #define NORMAL  "\033[0m"
25 #define BOLD    "\033[1m"
26 #define CYAN    "\033[36m"
27
28 static struct feature features[0] __table_start ( struct feature, features );
29 static struct feature features_end[0] __table_end ( struct feature, features );
30
31 /**
32  * Main entry point
33  *
34  * @ret rc              Return status code
35  */
36 __cdecl int main ( void ) {
37         struct feature *feature;
38
39         initialise();
40         startup();
41
42         /* Print welcome banner */
43         printf ( NORMAL "\n\n\n" BOLD "gPXE " VERSION
44                  NORMAL " -- Open Source Boot Firmware -- "
45                  CYAN "http://etherboot.org" NORMAL "\n"
46                  "Features:" );
47         for ( feature = features ; feature < features_end ; feature++ )
48                 printf ( " %s", feature->name );
49         printf ( "\n" );
50
51         /* Prompt for shell */
52         if ( shell_banner() ) {
53                 /* User wants shell; just give them a shell */
54                 shell();
55         } else {
56                 /* User doesn't want shell; try booting.  If booting
57                  * fails, offer a second chance to enter the shell for
58                  * diagnostics.
59                  */
60                 autoboot();
61                 if ( shell_banner() )
62                         shell();
63         }
64
65         shutdown ( SHUTDOWN_EXIT | shutdown_exit_flags );
66
67         return 0;
68 }