GophHub - go4retro/tcpser/src/init.c


Raw File

    1	#include <stdio.h>
    2	#include <stdlib.h>       // for exit,atoi
    3	#include <unistd.h>
    4	#include "version.h"
    5	#include "debug.h"
    6	#include "phone_book.h"
    7	#include "init.h"
    8	
    9	void print_help(char* name) {
   10	  fprintf(stderr, "Usage: %s <parameters>\n", name);
   11	  fprintf(stderr, "  -p   [ip address:]tcp port to listen on (defaults to 6400)\n");
   12	  fprintf(stderr, "  -t   trace flags: (can be combined)\n");
   13	  fprintf(stderr, "       'm' = modem input\n");
   14	  fprintf(stderr, "       'M' = modem output\n");
   15	  fprintf(stderr, "       's' = serial input\n");
   16	  fprintf(stderr, "       'S' = serial output\n");
   17	  fprintf(stderr, "       'i' = IP input\n");
   18	  fprintf(stderr, "       'I' = IP output\n");
   19	  fprintf(stderr, "  -l   0 (NONE), 1 (FATAL) - 7 (DEBUG_X) (defaults to 0)\n");
   20	  fprintf(stderr, "  -L   log file (defaults to stderr)\n");
   21	  fprintf(stderr, "  -n   add phone entry (number=replacement)\n");
   22	  fprintf(stderr, "  -V   print version number\n");
   23	  fprintf(stderr, "\n");
   24	  fprintf(stderr, "  The following can be repeated for each modem desired\n");
   25	  fprintf(stderr, "  (all except -d and -v will apply to any subsequent modem if not set again)\n");
   26	  fprintf(stderr, "\n");
   27	  fprintf(stderr, "  -d   serial device (e.g. /dev/ttyS0)\n");
   28	  fprintf(stderr, "  -v   [ip address:]tcp port (or '-' for STDIN/OUT) for virtual RS232\n");
   29	  fprintf(stderr, "       Only 1 of -d or -v can be used per modem definition\n");
   30	  fprintf(stderr, "  -s   serial port speed (defaults to 38400)\n");
   31	  fprintf(stderr, "  -S   speed modem will report (defaults to -s value)\n");
   32	  fprintf(stderr, "  -I   invert DCD pin\n");
   33	  fprintf(stderr, "  -a   filename to send to local side upon answer\n");
   34	  fprintf(stderr, "  -A   filename to send to remote side upon answer\n");
   35	  fprintf(stderr, "  -c   filename to send to local side upon connect\n");
   36	  fprintf(stderr, "  -C   filename to send to remote side upon connect\n");
   37	  fprintf(stderr, "  -N   filename to send when no answer\n");
   38	  fprintf(stderr, "  -B   filename to send when modem(s) busy\n");
   39	  fprintf(stderr, "  -T   filename to send upon inactivity timeout\n");
   40	  fprintf(stderr, "  -i   modem init string (defaults to '', leave off 'at' prefix when specifying)\n");
   41	  fprintf(stderr, "  -D   direct connection (follow with hostname:port for caller, : for receiver)\n");
   42	  exit(0);
   43	}
   44	
   45	int init(int argc,
   46	         char **argv,
   47	         modem_config cfg[],
   48	         int max_modem,
   49	         char **ip_addr, 
   50	         char *all_busy,
   51	         int all_busy_len
   52	         ) {
   53	  int i = 0;
   54	  int j = 0;
   55	  int opt = 0;
   56	  int trace_flags = 0;
   57	  char *tok;
   58	  int dce_set = FALSE;
   59	  int tty_set = FALSE;
   60	
   61	  LOG_ENTER();
   62	  mdm_init_config(&cfg[0]);
   63	  cfg[0].dce_data.port_speed = 38400;
   64	  cfg[0].line_speed = 38400;
   65	
   66	  while(opt>-1 && i < max_modem) {
   67	    opt=getopt(argc, argv, "p:s:S:d:v:hw:i:Il:L:t:n:a:A:c:C:N:B:T:D:V");
   68	    switch(opt) {
   69	      case 't':
   70	        trace_flags = log_get_trace_flags();
   71	        for(j = 0; j < strlen(optarg); j++) {
   72	          switch(optarg[j]) {
   73	            case 'm':
   74	              trace_flags |= TRACE_MODEM_IN;
   75	              break;
   76	            case 'M':
   77	              trace_flags |= TRACE_MODEM_OUT;
   78	              break;
   79	            case 's':
   80	              trace_flags |= TRACE_SERIAL_IN;
   81	              break;
   82	            case 'S':
   83	              trace_flags |= TRACE_SERIAL_OUT;
   84	              break;
   85	            case 'i':
   86	              trace_flags |= TRACE_IP_IN;
   87	              break;
   88	            case 'I':
   89	              trace_flags |= TRACE_IP_OUT;
   90	              break;
   91	          }
   92	          log_set_trace_flags(trace_flags);
   93	        }
   94	        break;
   95	      case 'a':
   96	        strncpy(cfg[i].local_answer, optarg, sizeof(cfg[i].local_answer));
   97	        break;
   98	      case 'A':
   99	        strncpy(cfg[i].remote_answer, optarg, sizeof(cfg[i].remote_answer));
  100	        break;
  101	      case 'c':
  102	        strncpy(cfg[i].local_connect, optarg, sizeof(cfg[i].local_connect));
  103	        break;
  104	      case 'C':
  105	        strncpy(cfg[i].remote_connect, optarg, sizeof(cfg[i].remote_connect));
  106	        break;
  107	      case 'B':
  108	        strncpy(all_busy, optarg, all_busy_len);
  109	        break;
  110	      case 'N':
  111	        strncpy(cfg[i].no_answer, optarg, sizeof(cfg[i].no_answer));
  112	        break;
  113	      case 'T':
  114	        strncpy(cfg[i].inactive, optarg, sizeof(cfg[i].inactive));
  115	        break;
  116	      case 'i':
  117	        strncpy(cfg[i].cur_line, optarg, sizeof(cfg[i].cur_line));
  118	        cfg[i].cur_line_idx = strlen(cfg[i].cur_line);
  119	        break;
  120	      case 'I':
  121	        cfg[i].invert_dcd = TRUE;
  122	        break;
  123	      case 'p':
  124	        *ip_addr = optarg;
  125	        break;
  126	      case 'n':
  127	        tok = strtok(optarg, "=");
  128	        pb_add(tok, strtok(NULL, "="));
  129	        break;
  130	      case 'l':
  131	        log_set_level(atoi(optarg));
  132	        break;
  133	      case 'L':
  134	        log_set_file(fopen(optarg, "w+"));
  135	        // should check to see if an error occurred...
  136	        break;
  137	      case 's':
  138	        cfg[i].dce_data.port_speed = atoi(optarg);
  139	        LOG(LOG_ALL, "Setting DTE speed to %d", cfg[i].dce_data.port_speed);
  140	        if(dce_set == FALSE)
  141	          cfg[i].line_speed = cfg[i].dce_data.port_speed;
  142	        break;
  143	      case '?':
  144	      case 'h':
  145	        print_help(argv[0]);
  146	        break;
  147	      case 'd':
  148	      case 'v':
  149	        if (tty_set) {
  150	          if (++i < max_modem) {
  151	            dce_set = FALSE;
  152	            mdm_init_config(&cfg[i]);
  153	            cfg[i].dce_data.port_speed = cfg[i - 1].dce_data.port_speed;
  154	            cfg[i].line_speed = cfg[i - 1].line_speed;
  155	            cfg[i].dce_data.is_ip232 = FALSE;
  156	            strncpy((char *)cfg[i].cur_line, (char *)cfg[i - 1].cur_line, sizeof(cfg[i].cur_line));
  157	            strncpy((char *)cfg[i].local_connect, (char *)cfg[i - 1].local_connect, sizeof(cfg[i].local_connect));
  158	            strncpy((char *)cfg[i].remote_connect, (char *)cfg[i - 1].remote_connect, sizeof(cfg[i].remote_connect));
  159	            strncpy((char *)cfg[i].local_answer, (char *)cfg[i - 1].local_answer, sizeof(cfg[i].local_answer));
  160	            strncpy((char *)cfg[i].remote_answer, (char *)cfg[i - 1].remote_answer, sizeof(cfg[i].remote_answer));
  161	            strncpy((char *)cfg[i].no_answer, (char *)cfg[i - 1].no_answer, sizeof(cfg[i].no_answer));
  162	            strncpy((char *)cfg[i].inactive, (char *)cfg[i - 1].inactive, sizeof(cfg[i].inactive));
  163	          } else {
  164	            LOG(LOG_WARN, "Maximum modems defined - ignoring extra");
  165	            break;
  166	          }
  167	        }
  168	        strncpy((char *)cfg[i].dce_data.tty, optarg, sizeof(cfg[i].dce_data.tty));
  169	        LOG(LOG_ALL, "Setting TTY to %s", optarg);
  170	        cfg[i].dce_data.is_ip232 = ('v' == opt);
  171	        tty_set = TRUE;
  172	        break;
  173	      case 'S':
  174	        cfg[i].line_speed = atoi(optarg);
  175	        dce_set = TRUE;
  176	        break;
  177	      case 'D':
  178	        cfg[i].direct_conn = TRUE;
  179	        strncpy(cfg[i].direct_conn_num, optarg, sizeof(cfg[i].direct_conn_num));
  180	        break;
  181	      case 'V':
  182	        printf("%s (TCPSER) %s\n", argv[0], VERSION);
  183	        printf("Copyright (C) 2004-%s Jim Brain (tcpser@jbrain.com)\n", __DATE__ + 7);
  184	        exit(0);
  185	        break;
  186	    }
  187	  }
  188	
  189	  if (tty_set) {
  190	    if (i < max_modem)
  191	      i++;
  192	  } else {
  193	    // no modems defined
  194	    LOG(LOG_FATAL, "No modems defined");
  195	    print_help(argv[0]);
  196	  }
  197	
  198	  LOG(LOG_DEBUG, "Read configuration for %i serial port(s)", i);
  199	
  200	  LOG_EXIT();
  201	  return i;
  202	}
  203	

Generated by GNU Enscript 1.6.6, and GophHub 1.3.