From b1a30140c03f3643d4290637f7ab90a37282e47b Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Thu, 24 Oct 2019 06:17:27 +0200 Subject: [PATCH] * net: rearranged poll() return value handling for clarity --- net/net.c | 116 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 55 deletions(-) diff --git a/net/net.c b/net/net.c index 957e82d..8a1c2d4 100644 --- a/net/net.c +++ b/net/net.c @@ -253,18 +253,30 @@ int tcp_accept(int sock, int timeout) { pfd.fd = sock; pfd.events = POLLIN; r = poll(&pfd, 1, timeout); - if (r == 1 && pfd.revents & (POLLIN | POLLERR | POLLHUP)) { - /* In case of POLLERR or POLLHUP we let accept() catch the error! */ - struct sockaddr_storage addr; - struct sockaddr *paddr = (struct sockaddr *)&addr; - socklen_t addrlen = sizeof addr; - r = accept(sock, paddr, &addrlen); - if (r < 0) { + if (r == 1) { + if (pfd.revents & (POLLIN | POLLERR | POLLHUP)) { + /* In case of POLLERR or POLLHUP we let accept() catch the error! */ + struct sockaddr_storage addr; + struct sockaddr *paddr = (struct sockaddr *)&addr; + socklen_t addrlen = sizeof addr; + r = accept(sock, paddr, &addrlen); + if (r < 0) { + r = EAI_SYSTEM; + } + else { + ADDR2STR(paddr, addrlen, stra, 100); + NETLOG_DBG("accept(%d) -> (%d, %s): Ok", sock, r, stra); + } + } + else if (pfd.revents & POLLNVAL) { + errno = EBADF; r = EAI_SYSTEM; } else { - ADDR2STR(paddr, addrlen, stra, 100); - NETLOG_DBG("accept(%d) -> (%d, %s): Ok", sock, r, stra); + NETLOG_DBG("This should never happen! (r=%d, revents=0x%04X)", + r, (unsigned)pfd.revents); + errno = EIO; + r = EAI_SYSTEM; } } else if (r == 0) { @@ -274,16 +286,6 @@ int tcp_accept(int sock, int timeout) { else if (r < 0) { r = EAI_SYSTEM; } - else if (pfd.revents & POLLNVAL) { - errno = EBADF; - r = EAI_SYSTEM; - } - else { - NETLOG_DBG("This should never happen! (r=%d, revents=0x%04X)", - r, (unsigned)pfd.revents); - errno = EIO; - r = EAI_SYSTEM; - } if (r < 0) { NETLOG_ERR(r, "tcp_accept(%d)", sock); } @@ -299,16 +301,28 @@ ssize_t recvfrom_tm(int fd, void *buf, size_t len, int flags, pfd.fd = fd; pfd.events = POLLIN; r = poll(&pfd, 1, timeout); - if (r == 1 && pfd.revents & (POLLIN | POLLERR | POLLHUP)) { - /* In case of POLLERR or POLLHUP we let recv() catch the error! */ - r = recvfrom(fd, buf, len, flags | MSG_DONTWAIT, addr, alen); - if (r < 0 && errno == ENOTSOCK) { - NETLOG_DBG("recvfrom_tm(%d): not a socket, trying read()", fd); - r = read(fd, buf, len); - if (r >= 0 && alen != NULL) - *alen = 0; + if (r == 1) { + if (pfd.revents & (POLLIN | POLLERR | POLLHUP)) { + /* In case of POLLERR or POLLHUP we let recv() catch the error! */ + r = recvfrom(fd, buf, len, flags | MSG_DONTWAIT, addr, alen); + if (r < 0 && errno == ENOTSOCK) { + NETLOG_DBG("recvfrom_tm(%d): not a socket, trying read()", fd); + r = read(fd, buf, len); + if (r >= 0 && alen != NULL) + *alen = 0; + } + r = r < 0 ? EAI_SYSTEM : r; + } + else if (pfd.revents & POLLNVAL) { + errno = EBADF; + r = EAI_SYSTEM; + } + else { + NETLOG_DBG("This should never happen! (r=%zd, revents=0x%04X)", + r, (unsigned)pfd.revents); + errno = EIO; + r = EAI_SYSTEM; } - r = r < 0 ? EAI_SYSTEM : r; } else if (r == 0) { errno = ETIME; @@ -317,16 +331,6 @@ ssize_t recvfrom_tm(int fd, void *buf, size_t len, int flags, else if (r < 0) { r = EAI_SYSTEM; } - else if (pfd.revents & POLLNVAL) { - errno = EBADF; - r = EAI_SYSTEM; - } - else { - NETLOG_DBG("This should never happen! (r=%zd, revents=0x%04X)", - r, (unsigned)pfd.revents); - errno = EIO; - r = EAI_SYSTEM; - } if (r < 0) { NETLOG_ERR(r, "recv_tm(%d)", fd); } @@ -345,14 +349,26 @@ ssize_t sendto_tm(int fd, void *buf, size_t len, int flags, pfd.fd = fd; pfd.events = POLLOUT; r = poll(&pfd, 1, timeout); - if (r == 1 && pfd.revents & (POLLOUT | POLLERR | POLLHUP)) { - /* In case of POLLERR or POLLHUP we let send() catch the error! */ - r = sendto(fd, buf, len, flags | MSG_DONTWAIT | MSG_NOSIGNAL, addr, alen); - if (r < 0 && errno == ENOTSOCK) { - NETLOG_DBG("sendto_tm(%d): not a socket, trying write()", fd); - r = write(fd, buf, len); + if (r == 1) { + if (pfd.revents & (POLLOUT | POLLERR | POLLHUP)) { + /* In case of POLLERR or POLLHUP we let send() catch the error! */ + r = sendto(fd, buf, len, flags | MSG_DONTWAIT | MSG_NOSIGNAL, addr, alen); + if (r < 0 && errno == ENOTSOCK) { + NETLOG_DBG("sendto_tm(%d): not a socket, trying write()", fd); + r = write(fd, buf, len); + } + r = r < 0 ? EAI_SYSTEM : r; + } + else if (pfd.revents & POLLNVAL) { + errno = EBADF; + r = EAI_SYSTEM; + } + else { + NETLOG_DBG("This should never happen! (r=%zd, revents=0x%04X)", + r, (unsigned)pfd.revents); + errno = EIO; + r = EAI_SYSTEM; } - r = r < 0 ? EAI_SYSTEM : r; } else if (r == 0) { errno = ETIME; @@ -361,16 +377,6 @@ ssize_t sendto_tm(int fd, void *buf, size_t len, int flags, else if (r < 0) { r = EAI_SYSTEM; } - else if (pfd.revents & POLLNVAL) { - errno = EBADF; - r = EAI_SYSTEM; - } - else { - NETLOG_DBG("This should never happen! (r=%zd, revents=0x%04X)", - r, (unsigned)pfd.revents); - errno = EIO; - r = EAI_SYSTEM; - } if (r < 0) { NETLOG_ERR(r, "send_tm(%d)", fd); } -- 2.30.2