FreeCalypso > hg > themwi-system-sw
annotate sip-out/mgw_sock.c @ 275:def9f6e4f49e default tip
doc/Use-outside-USA: Fake-NANP-numbers article is here
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Mon, 27 Nov 2023 21:49:19 -0800 | 
| parents | e54b0a9e322f | 
| children | 
| rev | line source | 
|---|---|
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * In this module we implement our local socket interface to themwi-mgw. | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 */ | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 #include <sys/types.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 #include <sys/socket.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <sys/un.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <stdio.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdint.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include <stdlib.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <syslog.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include "../include/tmgw_ctrl.h" | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 static char tmgw_socket_pathname[] = "/var/gsm/tmgw_socket"; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 | 
| 107 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 16 int mgw_socket, mgw_is_connected; | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 | 
| 107 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 18 connect_tmgw_socket() | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 struct sockaddr_un sa; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 unsigned sa_len; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 int rc; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 | 
| 107 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 24 if (mgw_is_connected) | 
| 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 25 return(0); | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 mgw_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 if (mgw_socket < 0) { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m"); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 return(-1); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 fill_sockaddr_un(tmgw_socket_pathname, &sa, &sa_len); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 rc = connect(mgw_socket, (struct sockaddr *) &sa, sa_len); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 if (rc < 0) { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 syslog(LOG_ERR, "connect to %s: %m", tmgw_socket_pathname); | 
| 107 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 35 close(mgw_socket); | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 return(-1); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 update_max_fd(mgw_socket); | 
| 107 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 39 mgw_is_connected = 1; | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 return(0); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 void | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 mgw_socket_select() | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 struct tmgw_ctrl_resp msg; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 int rc; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 rc = recv(mgw_socket, &msg, sizeof msg, 0); | 
| 107 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 50 if (rc <= 0) { | 
| 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 51 syslog(LOG_ERR, "themwi-mgw socket disconnected"); | 
| 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 52 close(mgw_socket); | 
| 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 53 mgw_is_connected = 0; | 
| 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 54 shutdown_mgw_conn(); | 
| 
372209628038
sip-in: handle themwi-mgw shutdown without terminating
 Mychaela Falconia <falcon@freecalypso.org> parents: 
60diff
changeset | 55 return; | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 if (rc != sizeof(struct tmgw_ctrl_resp)) { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 syslog(LOG_CRIT, | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 "response packet from TMGW has wrong length: %d bytes", | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 rc); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 exit(1); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 } | 
| 60 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 63 process_tmgw_response(&msg); | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 } | 
| 60 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 65 | 
| 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 66 send_req_to_tmgw(msg) | 
| 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 67 struct tmgw_ctrl_req *msg; | 
| 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 68 { | 
| 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 69 return send(mgw_socket, msg, sizeof(struct tmgw_ctrl_req), 0); | 
| 
02761f1ae5e5
sip-in INVITE processing: got as far as CRCX completion
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 70 } | 
