FreeCalypso > hg > themwi-system-sw
annotate mgw/main.c @ 158:51cf5ea7f320
sip-out: map INVITE errors to GSM cause values
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 12 Oct 2022 08:45:39 -0800 |
parents | f062c32a5116 |
children | a6eb2de277f6 |
rev | line source |
---|---|
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * Main module for themwi-mgw. |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <sys/types.h> |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
6 #include <sys/time.h> |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/errno.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
95
f280328e7e2e
themwi-mgw: initial implementation of PSTN to GSM forwarding
Mychaela Falconia <falcon@freecalypso.org>
parents:
32
diff
changeset
|
9 #include <stdint.h> |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdlib.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <string.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <strings.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <signal.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include <syslog.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <unistd.h> |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
17 extern int dtmf_timer_running; |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
18 extern struct timeval dtmf_next_time; |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
19 |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 fd_set select_for_read; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 void (*select_handlers[FD_SETSIZE])(); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 void *select_data[FD_SETSIZE]; |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
23 struct timeval cur_event_time; |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 static int max_fd; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 update_max_fd(newfd) |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 if (newfd >= FD_SETSIZE) { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 syslog(LOG_CRIT, "FATAL: file descriptor %d >= FD_SETSIZE", |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 newfd); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 exit(1); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 } |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 if (newfd > max_fd) |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 max_fd = newfd; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 } |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 main(argc, argv) |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 char **argv; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 fd_set fds; |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
42 struct timeval timeout; |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 int cc, i; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 openlog("themwi-mgw", 0, LOG_LOCAL5); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 read_config_file(); |
126
815e4c59162e
mgw DTMF: tone definitions and sample array generation
Mychaela Falconia <falcon@freecalypso.org>
parents:
95
diff
changeset
|
47 dtmf_init_sample_arrays(); |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 if (create_ctrl_socket() < 0) { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 fprintf(stderr, "error creating TMGW control socket\n"); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 exit(1); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 } |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 signal(SIGPIPE, SIG_IGN); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 /* main select loop */ |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 for (;;) { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 bcopy(&select_for_read, &fds, sizeof(fd_set)); |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
56 if (dtmf_timer_running) { |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
57 if (timercmp(&dtmf_next_time, &cur_event_time, >)) |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
58 timersub(&dtmf_next_time, &cur_event_time, |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
59 &timeout); |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
60 else |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
61 timerclear(&timeout); |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
62 cc = select(max_fd+1, &fds, 0, 0, &timeout); |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
63 } else |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
64 cc = select(max_fd+1, &fds, 0, 0, 0); |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 if (cc < 0) { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 if (errno == EINTR) |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 continue; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 syslog(LOG_CRIT, "select: %m"); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 exit(1); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 } |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
71 gettimeofday(&cur_event_time, 0); |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 for (i = 0; cc && i <= max_fd; i++) { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 if (FD_ISSET(i, &fds)) { |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 select_handlers[i](i, select_data[i]); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 cc--; |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 } |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 } |
127
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
78 if (dtmf_timer_running && |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
79 !timercmp(&cur_event_time, &dtmf_next_time, <)) |
f062c32a5116
mgw: implement DTMF
Mychaela Falconia <falcon@freecalypso.org>
parents:
126
diff
changeset
|
80 dtmf_timer_process(); |
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 free_deleted_endpoints(); |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 } |
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 } |