1 #include 2 #include // for exit,atoi 3 #include 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 \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 }