/* * tio - a simple TTY terminal I/O application * * Copyright (c) 2014-2017 Martin Lund * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "tio/options.h" #include "tio/error.h" /* Default options */ struct option_t option = { "", // Device name 115200, // Baudrate 8, // Databits "none", // Flow 1, // Stopbits "none", // Parity 0, // No output delay false, // No autoconnect false, // No log "" // Log filename }; void print_help(char *argv[]) { printf("Usage: %s [] \n", argv[0]); printf("\n"); printf("Options:\n"); printf(" -b, --baudrate Baud rate (default: 115200)\n"); printf(" -d, --databits 5|6|7|8 Data bits (default: 8)\n"); printf(" -f, --flow hard|soft|none Flow control (default: none)\n"); printf(" -s, --stopbits 1|2 Stop bits (default: 1)\n"); printf(" -p, --parity odd|even|none Parity (default: none)\n"); printf(" -o, --output-delay Output delay (default: 0)\n"); printf(" -n, --no-autoconnect Disable automatic connect\n"); printf(" -l, --log Log to file\n"); printf(" -v, --version Display version\n"); printf(" -h, --help Display help\n"); printf("\n"); printf("In session, press ctrl-t q to quit.\n"); printf("\n"); } long string_to_long(char *string) { long result; char *end_token; errno = 0; result = strtol(string, &end_token, 10); if ((errno != 0) || (*end_token != 0)) { error_printf("Invalid digit"); exit(EXIT_FAILURE); } return result; } void parse_options(int argc, char *argv[]) { int c; if (argc == 1) { print_help(argv); exit(EXIT_SUCCESS); } while (1) { static struct option long_options[] = { {"baudrate", required_argument, 0, 'b'}, {"databits", required_argument, 0, 'd'}, {"flow", required_argument, 0, 'f'}, {"stopbits", required_argument, 0, 's'}, {"parity", required_argument, 0, 'p'}, {"output-delay", required_argument, 0, 'o'}, {"no-autoconnect", no_argument, 0, 'n'}, {"log", required_argument, 0, 'l'}, {"version", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0 } }; /* getopt_long stores the option index here */ int option_index = 0; /* Parse argument using getopt_long */ c = getopt_long(argc, argv, "b:d:f:s:p:o:nl:vh", long_options, &option_index); /* Detect the end of the options */ if (c == -1) break; switch (c) { case 0: /* If this option sets a flag, do nothing else now */ if (long_options[option_index].flag != 0) break; printf("option %s", long_options[option_index].name); if (optarg) printf(" with arg %s", optarg); printf("\n"); break; case 'b': option.baudrate = string_to_long(optarg); break; case 'd': option.databits = string_to_long(optarg); break; case 'f': option.flow = optarg; break; case 's': option.stopbits = string_to_long(optarg); break; case 'p': option.parity = optarg; break; case 'o': option.output_delay = string_to_long(optarg); break; case 'n': option.no_autoconnect = true; break; case 'l': option.log = true; option.log_filename = optarg; break; case 'v': printf("tio v%s\n", VERSION); printf("Copyright (c) 2014-2017 Martin Lund\n"); printf("\n"); printf("License GPLv2+: GNU GPL version 2 or later .\n"); printf("This is free software: you are free to change and redistribute it.\n"); printf("There is NO WARRANTY, to the extent permitted by law.\n"); exit(EXIT_SUCCESS); break; case 'h': print_help(argv); exit(EXIT_SUCCESS); break; case '?': /* getopt_long already printed an error message */ exit(EXIT_FAILURE); break; default: exit(EXIT_FAILURE); } } /* Assume first non-option is the tty device name */ if (optind < argc) option.tty_device = argv[optind++]; if (strlen(option.tty_device) == 0) { error_printf("Missing device name"); exit(EXIT_FAILURE); } /* Print any remaining command line arguments (unknown options) */ if (optind < argc) { printf("Error: unknown arguments: "); while (optind < argc) printf("%s ", argv[optind++]); printf("\n"); exit(EXIT_FAILURE); } }