aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown <mcb30@etherboot.org>2006-12-19 16:27:15 +0000
committerMichael Brown <mcb30@etherboot.org>2006-12-19 16:27:15 +0000
commit70d20c4e7a156e3161b2578d3b048ae45f23f02a (patch)
tree74b001441cfbfd11632fa1f75362bbe822797398 /src
parentc1bac56f8546f2cadbaefbda33ca23efeb269bf9 (diff)
downloadipxe-70d20c4e7a156e3161b2578d3b048ae45f23f02a.tar.gz
Use common symbols to avoid dragging in getopt.o unless a getopt-using
command is linked in.
Diffstat (limited to 'src')
-rw-r--r--src/core/exec.c4
-rw-r--r--src/core/getopt.c23
-rw-r--r--src/include/getopt.h18
3 files changed, 26 insertions, 19 deletions
diff --git a/src/core/exec.c b/src/core/exec.c
index 73f111eed..3340d18a6 100644
--- a/src/core/exec.c
+++ b/src/core/exec.c
@@ -36,6 +36,10 @@
static struct command commands[0] __table_start ( commands );
static struct command commands_end[0] __table_end ( commands );
+/* Avoid dragging in getopt.o unless a command really uses it */
+int optind;
+int nextchar;
+
/**
* Execute command
*
diff --git a/src/core/getopt.c b/src/core/getopt.c
index df275539c..4e839cab2 100644
--- a/src/core/getopt.c
+++ b/src/core/getopt.c
@@ -41,14 +41,14 @@ char *optarg;
* This is an index into the argv[] array. When getopt() returns -1,
* @c optind is the index to the first element that is not an option.
*/
-int optind = 1;
+int optind;
/**
* Current option character index
*
* This is an index into the current element of argv[].
*/
-static int nextchar = 0;
+int nextchar;
/**
* Unrecognised option
@@ -59,22 +59,6 @@ static int nextchar = 0;
int optopt;
/**
- * Reset getopt() internal state
- *
- * Due to a limitation of the POSIX getopt() API, it is necessary to
- * add a call to reset_getopt() before each set of calls to getopt()
- * or getopt_long(). This arises because POSIX assumes that each
- * process will parse command line arguments no more than once; this
- * assumption is not valid within Etherboot. We work around the
- * limitation by arranging for execv() to call reset_getopt() before
- * executing the command.
- */
-void reset_getopt ( void ) {
- optind = 1;
- nextchar = 0;
-}
-
-/**
* Get option argument from argv[] array
*
* @v argc Argument count
@@ -231,6 +215,9 @@ static int match_short_option ( int argc, char * const argv[],
* @ret longindex Index of long option (or NULL)
* @ret option Option found, or -1 for no more options
*
+ * Note that the caller must arrange for reset_getopt() to be called
+ * before each set of calls to getopt_long(). In Etherboot, this is
+ * done automatically by execv().
*/
int getopt_long ( int argc, char * const argv[], const char *optstring,
const struct option *longopts, int *longindex ) {
diff --git a/src/include/getopt.h b/src/include/getopt.h
index 8bf0d3317..2505223ed 100644
--- a/src/include/getopt.h
+++ b/src/include/getopt.h
@@ -49,9 +49,9 @@ struct option {
extern char *optarg;
extern int optind;
+extern int nextchar;
extern int optopt;
-extern void reset_getopt();
extern int getopt_long ( int argc, char * const argv[], const char *optstring,
const struct option *longopts, int *longindex );
@@ -73,4 +73,20 @@ static inline int getopt ( int argc, char * const argv[],
return getopt_long ( argc, argv, optstring, no_options, NULL );
}
+/**
+ * Reset getopt() internal state
+ *
+ * Due to a limitation of the POSIX getopt() API, it is necessary to
+ * add a call to reset_getopt() before each set of calls to getopt()
+ * or getopt_long(). This arises because POSIX assumes that each
+ * process will parse command line arguments no more than once; this
+ * assumption is not valid within Etherboot. We work around the
+ * limitation by arranging for execv() to call reset_getopt() before
+ * executing the command.
+ */
+static inline void reset_getopt ( void ) {
+ optind = 1;
+ nextchar = 0;
+}
+
#endif /* _GETOPT_H */