libnl 3.2.8

Thomas Graf tgraf at infradead.org
Tue May 8 09:07:24 EDT 2012


On Mon, May 07, 2012 at 07:58:54PM -0600, Justin Mayfield wrote:
> 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

> 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;
> +	}
>  }

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;
 }
 
 /**




More information about the libnl mailing list