FreeCalypso > hg > themwi-system-sw
comparison sip-in/mgw_sock.c @ 107:372209628038
sip-in: handle themwi-mgw shutdown without terminating
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 27 Sep 2022 23:45:40 -0800 |
parents | 02761f1ae5e5 |
children |
comparison
equal
deleted
inserted
replaced
106:245dc4837b56 | 107:372209628038 |
---|---|
11 #include <syslog.h> | 11 #include <syslog.h> |
12 #include "../include/tmgw_ctrl.h" | 12 #include "../include/tmgw_ctrl.h" |
13 | 13 |
14 static char tmgw_socket_pathname[] = "/var/gsm/tmgw_socket"; | 14 static char tmgw_socket_pathname[] = "/var/gsm/tmgw_socket"; |
15 | 15 |
16 int mgw_socket; | 16 int mgw_socket, mgw_is_connected; |
17 | 17 |
18 open_tmgw_socket() | 18 connect_tmgw_socket() |
19 { | 19 { |
20 struct sockaddr_un sa; | 20 struct sockaddr_un sa; |
21 unsigned sa_len; | 21 unsigned sa_len; |
22 int rc; | 22 int rc; |
23 | 23 |
24 if (mgw_is_connected) | |
25 return(0); | |
24 mgw_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0); | 26 mgw_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0); |
25 if (mgw_socket < 0) { | 27 if (mgw_socket < 0) { |
26 syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m"); | 28 syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m"); |
27 return(-1); | 29 return(-1); |
28 } | 30 } |
29 fill_sockaddr_un(tmgw_socket_pathname, &sa, &sa_len); | 31 fill_sockaddr_un(tmgw_socket_pathname, &sa, &sa_len); |
30 rc = connect(mgw_socket, (struct sockaddr *) &sa, sa_len); | 32 rc = connect(mgw_socket, (struct sockaddr *) &sa, sa_len); |
31 if (rc < 0) { | 33 if (rc < 0) { |
32 syslog(LOG_ERR, "connect to %s: %m", tmgw_socket_pathname); | 34 syslog(LOG_ERR, "connect to %s: %m", tmgw_socket_pathname); |
35 close(mgw_socket); | |
33 return(-1); | 36 return(-1); |
34 } | 37 } |
35 update_max_fd(mgw_socket); | 38 update_max_fd(mgw_socket); |
39 mgw_is_connected = 1; | |
36 return(0); | 40 return(0); |
37 } | 41 } |
38 | 42 |
39 void | 43 void |
40 mgw_socket_select() | 44 mgw_socket_select() |
41 { | 45 { |
42 struct tmgw_ctrl_resp msg; | 46 struct tmgw_ctrl_resp msg; |
43 int rc; | 47 int rc; |
44 | 48 |
45 rc = recv(mgw_socket, &msg, sizeof msg, 0); | 49 rc = recv(mgw_socket, &msg, sizeof msg, 0); |
46 if (rc < 0) { | 50 if (rc <= 0) { |
47 syslog(LOG_CRIT, "error reading from TMGW socket: %m"); | 51 syslog(LOG_ERR, "themwi-mgw socket disconnected"); |
48 exit(1); | 52 close(mgw_socket); |
53 mgw_is_connected = 0; | |
54 shutdown_mgw_conn(); | |
55 return; | |
49 } | 56 } |
50 if (rc != sizeof(struct tmgw_ctrl_resp)) { | 57 if (rc != sizeof(struct tmgw_ctrl_resp)) { |
51 syslog(LOG_CRIT, | 58 syslog(LOG_CRIT, |
52 "response packet from TMGW has wrong length: %d bytes", | 59 "response packet from TMGW has wrong length: %d bytes", |
53 rc); | 60 rc); |