|
|
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.