| #ifndef _GETOPT_H |
| #define _GETOPT_H |
| |
| /** @file |
| * |
| * Parse command-line options |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); |
| |
| #include <stddef.h> |
| |
| enum getopt_argument_requirement { |
| /** Option does not take an argument */ |
| no_argument = 0, |
| /** Option requires an argument */ |
| required_argument = 1, |
| /** Option may have an argument */ |
| optional_argument = 2, |
| }; |
| |
| /** A long option, as used for getopt_long() */ |
| struct option { |
| /** Long name of this option */ |
| const char *name; |
| /** Option takes an argument |
| * |
| * Must be one of @c no_argument, @c required_argument, or @c |
| * optional_argument. |
| */ |
| int has_arg; |
| /** Location into which to store @c val, or NULL. |
| * |
| * See the description for @c val for more details. |
| */ |
| int *flag; |
| /** Value to return |
| * |
| * If @c flag is NULL, then this is the value that will be |
| * returned by getopt_long() when this option is found, and |
| * should therefore be set to the equivalent short option |
| * character. |
| * |
| * If @c flag is non-NULL, then this value will be written to |
| * the location pointed to by @flag, and getopt_long() will |
| * return 0. |
| */ |
| int val; |
| }; |
| |
| extern char *optarg; |
| extern int optind; |
| extern int nextchar; |
| extern int optopt; |
| |
| extern int getopt_long ( int argc, char * const argv[], const char *optstring, |
| const struct option *longopts, int *longindex ); |
| |
| /** |
| * Parse command-line options |
| * |
| * @v argv Argument count |
| * @v argv Argument list |
| * @v optstring Option specification string |
| * @ret option Option found, or -1 for no more options |
| * |
| * See getopt_long() for full details. |
| */ |
| static inline int getopt ( int argc, char * const argv[], |
| const char *optstring ) { |
| static const struct option no_options[] = { |
| { NULL, 0, NULL, 0 } |
| }; |
| 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 */ |