summaryrefslogtreecommitdiff
path: root/sock_events.c
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2018-10-31 19:18:41 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2018-10-31 19:18:41 +0700
commit04ac4751701a28b7bec0c812a98d8a7ca1008a69 (patch)
tree837a4d4cfa318008f68e1004a6a9dee3d14a0e0d /sock_events.c
parent0578d751b1ea0ac10ad2b033f9b73c922f120fdb (diff)
sock_events.c: also track child file descriptors
In some applications, such as OsmocomBB, a single UNIX socket can be used by multiple processes (i.e. a server and multiple clients). Previously this caused a segmentation fault. Let's modify both sock_ev_accept() and sock_ev_accept4() in order to handle such connections properly, by using both socket path and dissector from the parent.
Diffstat (limited to 'sock_events.c')
-rw-r--r--sock_events.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sock_events.c b/sock_events.c
index 9340d7d..a2b4108 100644
--- a/sock_events.c
+++ b/sock_events.c
@@ -85,7 +85,8 @@ void sock_ev_accept(int fd, int ret, int err, struct sockaddr *addr,
{
if (ret < 0)
return;
- udtrace_add_fd(ret);
+ LOG("accept(fd=%d on parent fd=%d)\n", ret, fd);
+ udtrace_add_fd_child(fd, ret);
}
void sock_ev_accept4(int fd, int ret, int err, struct sockaddr *addr,
@@ -93,7 +94,8 @@ void sock_ev_accept4(int fd, int ret, int err, struct sockaddr *addr,
{
if (ret < 0)
return;
- udtrace_add_fd(ret);
+ LOG("accept(fd=%d on parent fd=%d)\n", ret, fd);
+ udtrace_add_fd_child(fd, ret);
}
void sock_ev_send(int fd, int ret, int err, const void *buf, size_t bytes,
personal git repositories of Harald Welte. Your mileage may vary