Home | History | Annotate | Download | only in include
      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