[PATCH evemu 2/3] tools: play: use getopt

Peter Hutterer peter.hutterer at who-t.net
Thu Jan 9 14:07:07 PST 2014


On Thu, Jan 09, 2014 at 02:34:08PM -0500, Benjamin Tissoires wrote:
> Instead of relying on argc and hard coded values, use getopt framework.
> 
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires at gmail.com>
> ---
>  tools/evemu-play.c | 37 +++++++++++++++++++++++++++++++++----
>  1 file changed, 33 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/evemu-play.c b/tools/evemu-play.c
> index 8d14618..030e142 100644
> --- a/tools/evemu-play.c
> +++ b/tools/evemu-play.c
> @@ -45,10 +45,18 @@
>  #include <fcntl.h>
>  #include <string.h>
>  #include <unistd.h>
> +#include <getopt.h>
> +
> +static struct option opts[] = {
> +	{ "help", no_argument, 0, 'h'},
> +};
>  
>  static void usage(void)
>  {
> -	fprintf(stderr, "Usage: %s <device>\n", program_invocation_short_name);
> +	fprintf(stderr, "Usage: %s [OPTION] <device>\n", program_invocation_short_name);
> +	fprintf(stderr, "\n");
> +	fprintf(stderr, "Where OPTION is:\n");
> +	fprintf(stderr, "   -h or --help: print this message\n");
>  	fprintf(stderr, "\n");
>  	fprintf(stderr, "Event data is read from standard input.\n");
>  }
> @@ -56,11 +64,30 @@ static void usage(void)
>  int main(int argc, char *argv[])
>  {
>  	int fd;
> -	if (argc != 2) {
> +
> +	while(1) {
> +		int option_index = 0;
> +		int c;
> +
> +		c = getopt_long(argc, argv, "h", opts, &option_index);

don't you need GNU_SOURCE for getopt_long or is that pulled in from
elsewhere? also, we could probably drop it from other files and use
AC_USE_SYSTEM_EXTENSIONS in configure.ac.

> +		if (c == -1) /* Detect the end of the options. */
> +			break;
> +
> +		switch(c) {
> +			case 'h': /* help */
> +			default:
> +				usage();
> +				goto out;
> +		}
> +	}
> +
> +	/* if the device was not specified, fail */
> +	if (optind >= argc) {
>  		usage();
> -		return -1;
> +		goto out;
>  	}
> -	fd = open(argv[1], O_WRONLY);
> +
> +	fd = open(argv[optind], O_WRONLY);
>  	if (fd < 0) {
>  		fprintf(stderr, "error: could not open device\n");
>  		return -1;
> @@ -70,4 +97,6 @@ int main(int argc, char *argv[])
>  	}
>  	close(fd);
>  	return 0;
> +out:
> +	return -1;

we should probably return 1 instead of -1 but that's a follow-up patch.

Cheers,
   Peter

>  }
> -- 
> 1.8.3.1


More information about the Input-tools mailing list