FreeCalypso > hg > fc-sim-tools
diff 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 diff
--- a/libcommon/globalopts.c Sat Mar 20 21:53:31 2021 +0000 +++ b/libcommon/globalopts.c Sun Mar 21 01:56:49 2021 +0000 @@ -2,11 +2,14 @@ * 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; +unsigned calypso_fd, pcsc_reader_num, serial_spenh; +int use_pcsc; +char *serial_device, *serial_baud; parse_global_options(argc, argv) char **argv; @@ -14,12 +17,35 @@ extern char *optarg; int c; - while ((c = getopt(argc, argv, "+C:p:")) != EOF) { + 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 '?': @@ -28,5 +54,20 @@ 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); }