FreeCalypso > hg > themwi-system-sw
annotate mgw/main.c @ 133:765991f42d86
liboutrt started with binary file reading
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Thu, 06 Oct 2022 23:15:26 -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: 
126diff
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: 
32diff
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: 
126diff
changeset | 17 extern int dtmf_timer_running; | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 18 extern struct timeval dtmf_next_time; | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
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: 
126diff
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: 
126diff
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: 
95diff
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: 
126diff
changeset | 56 if (dtmf_timer_running) { | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 57 if (timercmp(&dtmf_next_time, &cur_event_time, >)) | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 58 timersub(&dtmf_next_time, &cur_event_time, | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 59 &timeout); | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 60 else | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 61 timerclear(&timeout); | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 62 cc = select(max_fd+1, &fds, 0, 0, &timeout); | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 63 } else | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
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: 
126diff
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: 
126diff
changeset | 78 if (dtmf_timer_running && | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
changeset | 79 !timercmp(&cur_event_time, &dtmf_next_time, <)) | 
| 
f062c32a5116
mgw: implement DTMF
 Mychaela Falconia <falcon@freecalypso.org> parents: 
126diff
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 } | 
