iPXE - Open Source Boot Firmware

[build] Prevent gcc from creating position-independent 32-bit code
[wimboot.git] / src / cmdline.c
1 /*
2  * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  */
19
20 /**
21  * @file
22  *
23  * Command line
24  *
25  */
26
27 #include <stddef.h>
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <ctype.h>
32 #include "wimboot.h"
33 #include "cmdline.h"
34
35 /** Use raw (unpatched) BCD files */
36 int cmdline_rawbcd;
37
38 /** Use raw (unpatched) WIM files */
39 int cmdline_rawwim;
40
41 /** Allow graphical output from bootmgr/bootmgfw */
42 int cmdline_gui;
43
44 /** Pause before booting OS */
45 int cmdline_pause;
46
47 /** Pause without displaying any prompt */
48 int cmdline_pause_quiet;
49
50 /** WIM boot index */
51 unsigned int cmdline_index;
52
53 /**
54  * Process command line
55  *
56  * @v cmdline           Command line
57  */
58 void process_cmdline ( char *cmdline ) {
59         char *tmp = cmdline;
60         char *key;
61         char *value;
62         char *endp;
63
64         /* Do nothing if we have no command line */
65         if ( ( cmdline == NULL ) || ( cmdline[0] == '\0' ) )
66                 return;
67         DBG ( "Command line: \"%s\"\n", cmdline );
68
69         /* Parse command line */
70         while ( *tmp ) {
71
72                 /* Skip whitespace */
73                 while ( isspace ( *tmp ) )
74                         tmp++;
75
76                 /* Find value (if any) and end of this argument */
77                 key = tmp;
78                 value = NULL;
79                 while ( *tmp ) {
80                         if ( isspace ( *tmp ) ) {
81                                 *(tmp++) = '\0';
82                                 break;
83                         } else if ( *tmp == '=' ) {
84                                 *(tmp++) = '\0';
85                                 value = tmp;
86                         } else {
87                                 tmp++;
88                         }
89                 }
90
91                 /* Process this argument */
92                 if ( strcmp ( key, "rawbcd" ) == 0 ) {
93                         cmdline_rawbcd = 1;
94                 } else if ( strcmp ( key, "rawwim" ) == 0 ) {
95                         cmdline_rawwim = 1;
96                 } else if ( strcmp ( key, "gui" ) == 0 ) {
97                         cmdline_gui = 1;
98                 } else if ( strcmp ( key, "pause" ) == 0 ) {
99                         cmdline_pause = 1;
100                         if ( value && ( strcmp ( value, "quiet" ) == 0 ) )
101                                 cmdline_pause_quiet = 1;
102                 } else if ( strcmp ( key, "index" ) == 0 ) {
103                         if ( ( ! value ) || ( ! value[0] ) )
104                                 die ( "Argument \"index\" needs a value\n" );
105                         cmdline_index = strtoul ( value, &endp, 0 );
106                         if ( *endp )
107                                 die ( "Invalid index \"%s\"\n", value );
108                 } else if ( strcmp ( key, "initrdfile" ) == 0 ) {
109                         /* Ignore this keyword to allow for use with syslinux */
110                 } else if ( key == cmdline ) {
111                         /* Ignore unknown initial arguments, which may
112                          * be the program name.
113                          */
114                 } else {
115                         die ( "Unrecognised argument \"%s%s%s\"\n", key,
116                               ( value ? "=" : "" ), ( value ? value : "" ) );
117                 }
118         }
119 }