]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
libnetlink: don't spin forever on receive error
authorStephen Hemminger <stephen.hemminger@vyatta.com>
Fri, 25 Jan 2008 23:39:09 +0000 (15:39 -0800)
committerStephen Hemminger <stephen.hemminger@vyatta.com>
Fri, 25 Jan 2008 23:39:09 +0000 (15:39 -0800)
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>
lib/libnetlink.c

index d13596fa2d9b406309bca462f9e189a438afaeea..7876c190b5b5f1c5b6fc187eae0311f90ea381bd 100644 (file)
@@ -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");