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 */ 95