diff 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
line wrap: on
line diff
--- a/sip-in/mgw_sock.c	Tue Sep 27 23:44:07 2022 -0800
+++ b/sip-in/mgw_sock.c	Tue Sep 27 23:45:40 2022 -0800
@@ -13,14 +13,16 @@
 
 static char tmgw_socket_pathname[] = "/var/gsm/tmgw_socket";
 
-int mgw_socket;
+int mgw_socket, mgw_is_connected;
 
-open_tmgw_socket()
+connect_tmgw_socket()
 {
 	struct sockaddr_un sa;
 	unsigned sa_len;
 	int rc;
 
+	if (mgw_is_connected)
+		return(0);
 	mgw_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0);
 	if (mgw_socket < 0) {
 		syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m");
@@ -30,9 +32,11 @@
 	rc = connect(mgw_socket, (struct sockaddr *) &sa, sa_len);
 	if (rc < 0) {
 		syslog(LOG_ERR, "connect to %s: %m", tmgw_socket_pathname);
+		close(mgw_socket);
 		return(-1);
 	}
 	update_max_fd(mgw_socket);
+	mgw_is_connected = 1;
 	return(0);
 }
 
@@ -43,9 +47,12 @@
 	int rc;
 
 	rc = recv(mgw_socket, &msg, sizeof msg, 0);
-	if (rc < 0) {
-		syslog(LOG_CRIT, "error reading from TMGW socket: %m");
-		exit(1);
+	if (rc <= 0) {
+		syslog(LOG_ERR, "themwi-mgw socket disconnected");
+		close(mgw_socket);
+		mgw_is_connected = 0;
+		shutdown_mgw_conn();
+		return;
 	}
 	if (rc != sizeof(struct tmgw_ctrl_resp)) {
 		syslog(LOG_CRIT,