rtnetlink_server: Fix edge triggering

We need to receive messages until there are no more pending or else we
will leave messages in the file descriptor.

Change-Id: I3f4a5a7e57ccca62be76591d47c8317d995e527e
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/netlink.cpp b/src/netlink.cpp
index 5a3dc74..1577161 100644
--- a/src/netlink.cpp
+++ b/src/netlink.cpp
@@ -125,7 +125,7 @@
 
 } // namespace detail
 
-void receive(int sock, ReceiveCallback cb)
+size_t receive(int sock, ReceiveCallback cb)
 {
     // We need to make sure we have enough room for an entire packet otherwise
     // it gets truncated. The netlink docs guarantee packets will not exceed 8K
@@ -146,27 +146,29 @@
 
     // We only do multiple recvs if we have a MULTI type message
     bool done = true;
+    size_t num_msgs = 0;
     do
     {
         ssize_t recvd = recvmsg(sock, &hdr, 0);
-        if (recvd < 0)
+        if (recvd < 0 && errno != EAGAIN)
         {
             throw std::system_error(errno, std::generic_category(),
                                     "netlink recvmsg");
         }
-        if (recvd == 0)
+        if (recvd <= 0)
         {
             if (!done)
             {
                 throw std::runtime_error("netlink recvmsg: Got empty payload");
             }
-            return;
+            return num_msgs;
         }
 
         std::string_view msgs(buf.data(), recvd);
         do
         {
             detail::processMsg(msgs, done, cb);
+            num_msgs++;
         } while (!done && !msgs.empty());
 
         if (done && !msgs.empty())
@@ -174,6 +176,7 @@
             throw std::runtime_error("Extra unprocessed netlink messages");
         }
     } while (!done);
+    return num_msgs;
 }
 
 std::tuple<rtattr, std::string_view> extractRtAttr(std::string_view& data)