FreeCalypso > hg > themwi-system-sw
annotate mgw/ctrl_sock.c @ 120:c62d0f28da6f
sip-manual-out: make Max-Forwards configurable
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 29 Sep 2022 14:13:43 -0800 |
| parents | f280328e7e2e |
| children | f062c32a5116 |
| 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 * In this module we implement the logic of listening on the |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * TMGW control socket and accepting control connections. |
|
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 |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/types.h> |
|
35
db7ed6a55ba4
themwi-{mgw,mncc}: chmod connection-accepting sockets to 775
Mychaela Falconia <falcon@freecalypso.org>
parents:
32
diff
changeset
|
7 #include <sys/stat.h> |
|
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <sys/socket.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <sys/un.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <netinet/in.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <stdio.h> |
|
95
f280328e7e2e
themwi-mgw: initial implementation of PSTN to GSM forwarding
Mychaela Falconia <falcon@freecalypso.org>
parents:
35
diff
changeset
|
12 #include <stdint.h> |
|
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <stdlib.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include <string.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <strings.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include <syslog.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include <unistd.h> |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 #include "struct.h" |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 #include "select.h" |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 static char ctrl_socket_pathname[] = "/var/gsm/tmgw_socket"; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 extern void ctrl_message_handler(); |
|
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 void |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 ctrlsock_accept_handler(listener_fd) |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 struct sockaddr_un sa; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 socklen_t sa_len; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 int conn_fd; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 struct ctrl_conn *conn; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 sa_len = sizeof sa; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 conn_fd = accept(listener_fd, (struct sockaddr *) &sa, &sa_len); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 if (conn_fd < 0) { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 syslog(LOG_CRIT, "accept on UNIX socket: %m"); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 exit(1); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 } |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 conn = malloc(sizeof(struct ctrl_conn)); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 if (!conn) { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 syslog(LOG_CRIT, "malloc for ctrl socket conn: %m"); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 close(conn_fd); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 return; |
|
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 bzero(conn, sizeof(struct ctrl_conn)); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 update_max_fd(conn_fd); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 FD_SET(conn_fd, &select_for_read); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 select_handlers[conn_fd] = ctrl_message_handler; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 select_data[conn_fd] = (void *) conn; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 syslog(LOG_INFO, "accepted ctrl connection"); |
|
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 |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 create_ctrl_socket() |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 struct sockaddr_un sa; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 unsigned sa_len; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 int fd, rc; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 if (fd < 0) { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 syslog(LOG_CRIT, "socket(AF_UNIX, SOCK_SEQPACKET, 0): %m"); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 return(-1); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 } |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 unlink(ctrl_socket_pathname); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 fill_sockaddr_un(ctrl_socket_pathname, &sa, &sa_len); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 rc = bind(fd, (struct sockaddr *) &sa, sa_len); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 if (rc < 0) { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 syslog(LOG_ERR, "bind to %s: %m", ctrl_socket_pathname); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 return(-1); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 } |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 rc = listen(fd, 3); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 if (rc < 0) { |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 syslog(LOG_CRIT, "listen on UNIX socket: %m"); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 return(-1); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 } |
|
35
db7ed6a55ba4
themwi-{mgw,mncc}: chmod connection-accepting sockets to 775
Mychaela Falconia <falcon@freecalypso.org>
parents:
32
diff
changeset
|
76 chmod(ctrl_socket_pathname, 0775); |
|
32
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 update_max_fd(fd); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 FD_SET(fd, &select_for_read); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 select_handlers[fd] = ctrlsock_accept_handler; |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 return(0); |
|
b3f74df7b808
beginning of themwi-mgw
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 } |
