[uri] Make URI parsing handle IPv6 addresses
[gpxe.git] / src / include / getopt.h
blob0fe43567e482edd5d2804740fbf4aa84e47ef747
1 #ifndef _GETOPT_H
2 #define _GETOPT_H
4 /** @file
6 * Parse command-line options
8 */
10 FILE_LICENCE ( GPL2_OR_LATER );
12 #include <stddef.h>
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,
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
29 * Must be one of @c no_argument, @c required_argument, or @c
30 * optional_argument.
32 int has_arg;
33 /** Location into which to store @c val, or NULL.
35 * See the description for @c val for more details.
37 int *flag;
38 /** Value to return
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.
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.
49 int val;
52 extern char *optarg;
53 extern int optind;
54 extern int nextchar;
55 extern int optopt;
57 extern int getopt_long ( int argc, char * const argv[], const char *optstring,
58 const struct option *longopts, int *longindex );
60 /**
61 * Parse command-line options
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
68 * See getopt_long() for full details.
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 }
75 return getopt_long ( argc, argv, optstring, no_options, NULL );
78 /**
79 * Reset getopt() internal state
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.
89 static inline void reset_getopt ( void ) {
90 optind = 1;
91 nextchar = 0;
94 #endif /* _GETOPT_H */