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.