Receive a set of messages from a Netlink socket.

    https://github.com/thom311/libnl/blob/libnl3_2_25/lib/nl.c#L1023

    Repeatedly calls nl_recv() or the respective replacement if provided by the application (see nl_cb_overwrite_recv())
    and parses the received data as Netlink messages. Stops reading if one of the callbacks returns NL_STOP or nl_recv
    returns either 0 or a negative error code.

    A non-blocking sockets causes the function to return immediately if no data is available.

    See nl_recvmsgs_report().

    Positional arguments:
    sk -- Netlink socket (nl_sock class instance).
    cb -- set of callbacks to control behaviour (nl_cb class instance).

    Returns:
    0 on success or a negative error code from nl_recv().

def nl_recvmsgs(sk, cb):
    """Receive a set of messages from a Netlink socket.

    https://github.com/thom311/libnl/blob/libnl3_2_25/lib/nl.c#L1023

    Repeatedly calls nl_recv() or the respective replacement if provided by the application (see nl_cb_overwrite_recv())
    and parses the received data as Netlink messages. Stops reading if one of the callbacks returns NL_STOP or nl_recv
    returns either 0 or a negative error code.

    A non-blocking sockets causes the function to return immediately if no data is available.

    See nl_recvmsgs_report().

    Positional arguments:
    sk -- Netlink socket (nl_sock class instance).
    cb -- set of callbacks to control behaviour (nl_cb class instance).

    Returns:
    0 on success or a negative error code from nl_recv().
    """
    err = nl_recvmsgs_report(sk, cb)
    if err > 0:
        return 0
    return int(err)