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 <stephen.hemminger@vyatta.com>
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
index d13596f..7876c19 100644
--- a/lib/libnetlink.c
+++ b/lib/libnetlink.c
@@ -173,10 +173,11 @@
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 @@
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 @@
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");