summaryrefslogtreecommitdiffstats
path: root/src/include/getopt.h
blob: db3de17869d32d4166cb352447435523bdbcce64 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#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 */