|
|
1.1 ! root 1: #ifndef _GETOPT_H ! 2: #define _GETOPT_H ! 3: ! 4: /** @file ! 5: * ! 6: * Parse command-line options ! 7: * ! 8: */ ! 9: ! 10: FILE_LICENCE ( GPL2_OR_LATER ); ! 11: ! 12: #include <stddef.h> ! 13: ! 14: enum getopt_argument_requirement { ! 15: /** Option does not take an argument */ ! 16: no_argument = 0, ! 17: /** Option requires an argument */ ! 18: required_argument = 1, ! 19: /** Option may have an argument */ ! 20: optional_argument = 2, ! 21: }; ! 22: ! 23: /** A long option, as used for getopt_long() */ ! 24: struct option { ! 25: /** Long name of this option */ ! 26: const char *name; ! 27: /** Option takes an argument ! 28: * ! 29: * Must be one of @c no_argument, @c required_argument, or @c ! 30: * optional_argument. ! 31: */ ! 32: int has_arg; ! 33: /** Location into which to store @c val, or NULL. ! 34: * ! 35: * See the description for @c val for more details. ! 36: */ ! 37: int *flag; ! 38: /** Value to return ! 39: * ! 40: * If @c flag is NULL, then this is the value that will be ! 41: * returned by getopt_long() when this option is found, and ! 42: * should therefore be set to the equivalent short option ! 43: * character. ! 44: * ! 45: * If @c flag is non-NULL, then this value will be written to ! 46: * the location pointed to by @flag, and getopt_long() will ! 47: * return 0. ! 48: */ ! 49: int val; ! 50: }; ! 51: ! 52: extern char *optarg; ! 53: extern int optind; ! 54: extern int nextchar; ! 55: extern int optopt; ! 56: ! 57: extern int getopt_long ( int argc, char * const argv[], const char *optstring, ! 58: const struct option *longopts, int *longindex ); ! 59: ! 60: /** ! 61: * Parse command-line options ! 62: * ! 63: * @v argv Argument count ! 64: * @v argv Argument list ! 65: * @v optstring Option specification string ! 66: * @ret option Option found, or -1 for no more options ! 67: * ! 68: * See getopt_long() for full details. ! 69: */ ! 70: static inline int getopt ( int argc, char * const argv[], ! 71: const char *optstring ) { ! 72: static const struct option no_options[] = { ! 73: { NULL, 0, NULL, 0 } ! 74: }; ! 75: return getopt_long ( argc, argv, optstring, no_options, NULL ); ! 76: } ! 77: ! 78: /** ! 79: * Reset getopt() internal state ! 80: * ! 81: * Due to a limitation of the POSIX getopt() API, it is necessary to ! 82: * add a call to reset_getopt() before each set of calls to getopt() ! 83: * or getopt_long(). This arises because POSIX assumes that each ! 84: * process will parse command line arguments no more than once; this ! 85: * assumption is not valid within Etherboot. We work around the ! 86: * limitation by arranging for execv() to call reset_getopt() before ! 87: * executing the command. ! 88: */ ! 89: static inline void reset_getopt ( void ) { ! 90: optind = 1; ! 91: nextchar = 0; ! 92: } ! 93: ! 94: #endif /* _GETOPT_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.