From 70d20c4e7a156e3161b2578d3b048ae45f23f02a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 19 Dec 2006 16:27:15 +0000 Subject: [PATCH] Use common symbols to avoid dragging in getopt.o unless a getopt-using command is linked in. --- src/core/exec.c | 4 ++++ src/core/getopt.c | 23 +++++------------------ src/include/getopt.h | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/core/exec.c b/src/core/exec.c index 73f111ee..3340d18a 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 df275539..4e839cab 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 @@ -58,22 +58,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 * @@ -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 8bf0d331..2505223e 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 */