view libcommon/globalopts.c @ 45:9eb5460f51a6

main tools: support both pcsc and serial back ends
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 21 Mar 2021 01:56:49 +0000
parents c9ef9e91dd8e
children
line wrap: on
line source

/*
 * This module implements parsing of global command line options.
 */

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

unsigned calypso_fd, pcsc_reader_num, serial_spenh;
int use_pcsc;
char *serial_device, *serial_baud;

parse_global_options(argc, argv)
	char **argv;
{
	extern char *optarg;
	int c;

	while ((c = getopt(argc, argv, "+b:C:d:e:p:")) != EOF) {
		switch (c) {
		case 'b':
			serial_baud = optarg;
			continue;
		case 'C':
			calypso_fd = atoi(optarg);
			continue;
		case 'd':
			serial_device = optarg;
			continue;
		case 'e':
			if (!isdigit(optarg[0]) || optarg[1]) {
bad_minus_e:			fprintf(stderr, "error: bad -e argument\n");
				exit(1);
			}
			serial_spenh = optarg[0] - '0';
			switch (serial_spenh) {
			case 1:
			case 2:
			case 4:
			case 8:
				break;
			default:
				goto bad_minus_e;
			}
			continue;
		case 'p':
			use_pcsc = 1;
			pcsc_reader_num = atoi(optarg);
			continue;
		case '?':
		default:
			/* error msg already printed */
			exit(1);
		}
	}
	if (serial_device && use_pcsc) {
		fprintf(stderr,
	"error: -d and -p target selection options are mutually exclusive\n");
		exit(1);
	}
	if (!serial_device && (serial_baud || serial_spenh)) {
		fprintf(stderr,
		"error: -b and -e options are meaningless without -d\n");
		exit(1);
	}
	if (serial_baud && serial_spenh) {
		fprintf(stderr,
			"error: -b and -e options are mutually exclusive\n");
		exit(1);
	}
	return(0);
}