From: Stephen Hemminger Date: Fri, 25 Jan 2008 23:39:09 +0000 (-0800) Subject: libnetlink: don't spin forever on receive error X-Git-Tag: v2.6.25~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aa8032e628405c1318271fc928babbc06ab12d62;p=thirdparty%2Fiproute2.git libnetlink: don't spin forever on receive error If there is a problem talking to kernel, don't retry except in the special case of signal or -EAGAIN Signed-off-by: Stephen Hemminger --- diff --git a/lib/libnetlink.c b/lib/libnetlink.c index d13596fa2..7876c190b 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -173,10 +173,11 @@ int rtnl_dump_filter(struct rtnl_handle *rth, status = recvmsg(rth->fd, &msg, 0); if (status < 0) { - if (errno == EINTR) + if (errno == EINTR || errno == EAGAIN) continue; - perror("OVERRUN"); - continue; + fprintf(stderr, "netlink receive error %s (%d)\n", + strerror(errno), errno); + return -1; } if (status == 0) { @@ -276,10 +277,11 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, status = recvmsg(rtnl->fd, &msg, 0); if (status < 0) { - if (errno == EINTR) + if (errno == EINTR || errno == EAGAIN) continue; - perror("OVERRUN"); - continue; + fprintf(stderr, "netlink receive error %s (%d)\n", + strerror(errno), errno); + return -1; } if (status == 0) { fprintf(stderr, "EOF on netlink\n"); @@ -380,10 +382,11 @@ int rtnl_listen(struct rtnl_handle *rtnl, status = recvmsg(rtnl->fd, &msg, 0); if (status < 0) { - if (errno == EINTR) + if (errno == EINTR || errno == EAGAIN) continue; - perror("OVERRUN"); - continue; + fprintf(stderr, "netlink receive error %s (%d)\n", + strerror(errno), errno); + return -1; } if (status == 0) { fprintf(stderr, "EOF on netlink\n");