X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/71b70599a2cd81c13cc4326499a5d0c45358cd7d..e663c61b1aee7aea8fada6166d37256dfdb25735:/tests/udplog.c diff --git a/tests/udplog.c b/tests/udplog.c index eb87651..a27252c 100644 --- a/tests/udplog.c +++ b/tests/udplog.c @@ -17,9 +17,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ - -#include -#include "types.h" +/** @file tests/udplog.c + * @brief UDP logging utility + * + * Intended for low-level debugging. + */ +#include "common.h" #include #include @@ -78,15 +81,13 @@ 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 */ - SOCK_DGRAM, /* ai_socktype */ - IPPROTO_UDP, /* ai_protocol */ - 0, - 0, - 0, - 0 + .ai_flags = 0, + .ai_family = AF_UNSPEC, + .ai_socktype = SOCK_DGRAM, + .ai_protocol = IPPROTO_UDP, }; set_progname(argv); @@ -110,9 +111,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) {