From 95ceb9eae3ff08162d7e17be5ce82090d78cb269 Mon Sep 17 00:00:00 2001 Message-Id: <95ceb9eae3ff08162d7e17be5ce82090d78cb269.1714735023.git.mdw@distorted.org.uk> From: Mark Wooding Date: Tue, 18 Dec 2007 17:03:24 +0000 Subject: [PATCH 1/1] disorder-udplog exits more reliably when parent dies Organization: Straylight/Edgeware From: Richard Kettlewell --- tests/udplog.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/udplog.c b/tests/udplog.c index eb87651..0aa8f59 100644 --- a/tests/udplog.c +++ b/tests/udplog.c @@ -78,6 +78,8 @@ int main(int argc, char **argv) { struct sockaddr_in6 sin6; } sa; socklen_t len; + fd_set fds; + struct timeval tv; static const struct addrinfo pref = { 0, /* ai_flags */ AF_UNSPEC, /* ai_family */ @@ -110,9 +112,17 @@ int main(int argc, char **argv) { if(!(ai = get_address(&a, &pref, &name))) exit(1); fd = xsocket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + nonblock(fd); if(bind(fd, ai->ai_addr, ai->ai_addrlen) < 0) fatal(errno, "error binding to %s", name); while(getppid() != 1) { + /* Wait for something to happen. We don't just block forever in recvfrom() + * as otherwise we'd never die if the parent terminated uncontrolledly. */ + FD_ZERO(&fds); + FD_SET(fd, &fds); + tv.tv_sec = 1; + tv.tv_usec = 0; + select(fd + 1, &fds, 0, 0, &tv); len = sizeof sa; n = recvfrom(fd, buffer, sizeof buffer, 0, &sa.sa, &len); if(n < 0) { -- [mdw]