X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fsocket-util.c;h=4843cc5423f1384cdc7eb7357f86f1dbd87170c8;hb=d6cedfd9d29df4f9e9b7575c03ffcd2d84588c62;hp=4edf956b555f69beaaabbfd54eefc0837bc615c4;hpb=c3f2538933e2a7663283158a8bf806bf66ac1a23;p=openvswitch diff --git a/lib/socket-util.c b/lib/socket-util.c index 4edf956b..4843cc54 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -221,6 +221,7 @@ get_socket_error(int fd) int check_connection_completion(int fd) { + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 10); struct pollfd pfd; int retval; @@ -230,9 +231,17 @@ check_connection_completion(int fd) retval = poll(&pfd, 1, 0); } while (retval < 0 && errno == EINTR); if (retval == 1) { - return get_socket_error(fd); + if (pfd.revents & POLLERR) { + ssize_t n = send(fd, "", 1, MSG_DONTWAIT); + if (n < 0) { + return errno; + } else { + VLOG_ERR_RL(&rl, "poll return POLLERR but send succeeded"); + return EPROTO; + } + } + return 0; } else if (retval < 0) { - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 10); VLOG_ERR_RL(&rl, "poll: %s", strerror(errno)); return errno; } else {