From aa8032e628405c1318271fc928babbc06ab12d62 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Fri, 25 Jan 2008 15:39:09 -0800 Subject: [PATCH] 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 --- lib/libnetlink.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/libnetlink.c b/lib/libnetlink.c index d13596fa..7876c190 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");