From: Thomas Graf Date: Sat, 21 Apr 2012 10:47:29 +0000 (+0200) Subject: cache_mngr: Let nl_cache_mngr_data_ready() read multiple messages X-Git-Tag: libnl3_2_8~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a518a318d496ef5a2c02b4e0ad2eae45b0f77e5d;p=thirdparty%2Flibnl.git cache_mngr: Let nl_cache_mngr_data_ready() read multiple messages Having nl_recvmsgs() return the number of read messages allows to continue reading until the underlying recvmsg() will return EAGAIN for the non blocking socket. --- diff --git a/lib/cache_mngr.c b/lib/cache_mngr.c index aaf90bf..3eefbb0 100644 --- a/lib/cache_mngr.c +++ b/lib/cache_mngr.c @@ -324,7 +324,7 @@ int nl_cache_mngr_poll(struct nl_cache_mngr *mngr, int timeout) */ int nl_cache_mngr_data_ready(struct nl_cache_mngr *mngr) { - int err; + int err, nread = 0; struct nl_cb *cb; NL_DBG(2, "Cache manager %p, reading new data from fd %d\n", @@ -336,12 +336,17 @@ int nl_cache_mngr_data_ready(struct nl_cache_mngr *mngr) nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, event_input, mngr); - err = nl_recvmsgs(mngr->cm_sock, cb); + while ((err = nl_recvmsgs(mngr->cm_sock, cb)) > 0) { + NL_DBG(2, "Cache manager %p, recvmsgs read %d messages\n", + mngr, err); + nread += err; + } + nl_cb_put(cb); if (err < 0) return err; - return 1; + return nread; } /**