<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    <font face="DejaVu Sans">Hi Thomas,<br>
      <br>
      So far this is working well for me.  Testing mostly the route/link
      and route/addr based cache mangers here btw.<br>
      <br>
      Thanks!<br>
      Justin Mayfield<br>
    </font><br>
    On 05/08/2012 07:07 AM, Thomas Graf wrote:
    <blockquote cite="mid:20120508130724.GF21089@canuck.infradead.org"
      type="cite">
      <pre wrap="">
On Mon, May 07, 2012 at 07:58:54PM -0600, Justin Mayfield wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">Thomas,

If you don't want to revert the API change then you might try the
attached patch.  It seemed to cover the main trouble spot as far as
my grep skills could uncover.

Thanks,
Justin Mayfield
</pre>
      </blockquote>
      <pre wrap="">
</pre>
      <blockquote type="cite">
        <pre wrap="">diff --git a/include/netlink-local.h b/include/netlink-local.h
index 01c611a..9544d29 100644
--- a/include/netlink-local.h
+++ b/include/netlink-local.h
@@ -194,8 +194,10 @@ static inline int wait_for_ack(struct nl_sock *sk)
 {
        if (sk->s_flags & NL_NO_AUTO_ACK)
                return 0;
-       else
-               return nl_wait_for_ack(sk);
+       else {
+               int err = nl_wait_for_ack(sk);
+               return (err < 0) ? err : 0;
+       }
 }
</pre>
      </blockquote>
      <pre wrap="">
Thanks Justin,

I think the above won't be enough as the change also seems to have
broken applications directly. I'm considering to push the following
fix into the tree. Is this acceptable for everyone?

diff --git a/include/netlink/netlink.h b/include/netlink/netlink.h
index 0768708..a501eaa 100644
--- a/include/netlink/netlink.h
+++ b/include/netlink/netlink.h
@@ -71,6 +71,7 @@ extern int                    nl_recv(struct nl_sock *,
                                        struct ucred **);
 
 extern int                     nl_recvmsgs(struct nl_sock *, struct nl_cb *);
+extern int                     nl_recvmsgs_report(struct nl_sock *, struct nl_cb *);
 
 extern int                     nl_recvmsgs_default(struct nl_sock *);
 
diff --git a/lib/cache_mngr.c b/lib/cache_mngr.c
index dae8768..0f0df51 100644
--- a/lib/cache_mngr.c
+++ b/lib/cache_mngr.c
@@ -359,7 +359,7 @@ int nl_cache_mngr_data_ready(struct nl_cache_mngr *mngr)
 
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, event_input, mngr);
 
-       while ((err = nl_recvmsgs(mngr->cm_sock, cb)) > 0) {
+       while ((err = nl_recvmsgs_report(mngr->cm_sock, cb)) > 0) {
                NL_DBG(2, "Cache manager %p, recvmsgs read %d messages\n",
                       mngr, err);
                nread += err;
diff --git a/lib/nl.c b/lib/nl.c
index c41a3b9..7e59130 100644
--- a/lib/nl.c
+++ b/lib/nl.c
@@ -763,6 +763,26 @@ out:
 }
 
 /**
+ * Receive a set of messages from a netlink socket and report parsed messages
+ * @arg sk             Netlink socket.
+ * @arg cb             set of callbacks to control behaviour.
+ *
+ * This function is identical to nl_recvmsgs() to the point that it will
+ * return the number of parsed messages instead of 0 on success.
+ *
+ * @see nl_recvmsgs()
+ *
+ * @return Number of received messages or a negative error code from nl_recv().
+ */
+int nl_recvmsgs_report(struct nl_sock *sk, struct nl_cb *cb)
+{
+       if (cb->cb_recvmsgs_ow)
+               return cb->cb_recvmsgs_ow(sk, cb);
+       else
+               return recvmsgs(sk, cb);
+}
+
+/**
  * Receive a set of messages from a netlink socket.
  * @arg sk             Netlink socket.
  * @arg cb             set of callbacks to control behaviour.
@@ -775,14 +795,18 @@ out:
  * A non-blocking sockets causes the function to return immediately if
  * no data is available.
  *
- * @return Number of received messages or a negative error code from nl_recv().
+ * @see nl_recvmsgs_report()
+ *
+ * @return 0 on success or a negative error code from nl_recv().
  */
 int nl_recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
 {
-       if (cb->cb_recvmsgs_ow)
-               return cb->cb_recvmsgs_ow(sk, cb);
-       else
-               return recvmsgs(sk, cb);
+       int err;
+
+       if ((err = nl_recvmsgs_report(sk, cb)) > 0)
+               err = 0;
+
+       return err;
 }
 
 /**

!SIG:4fa91a95171629579363684!

</pre>
    </blockquote>
  </body>
</html>