Home | History | Annotate | Download | only in lib
      1 /*
      2  * lib/nl.c		Core Netlink Interface
      3  *
      4  *	This library is free software; you can redistribute it and/or
      5  *	modify it under the terms of the GNU Lesser General Public
      6  *	License as published by the Free Software Foundation version 2.1
      7  *	of the License.
      8  *
      9  * Copyright (c) 2003-2012 Thomas Graf <tgraf (at) suug.ch>
     10  */
     11 
     12 /**
     13  * @defgroup core Core Library (libnl)
     14  *
     15  * Socket handling, connection management, sending and receiving of data,
     16  * message construction and parsing, object caching system, ...
     17  *
     18  * This is the API reference of the core library. It is not meant as a guide
     19  * but as a reference. Please refer to the core library guide for detailed
     20  * documentation on the library architecture and examples:
     21  *
     22  * * @ref_asciidoc{core,_,Netlink Core Library Development Guide}
     23  *
     24  *
     25  * @{
     26  */
     27 
     28 #include <netlink-private/netlink.h>
     29 #include <netlink-private/socket.h>
     30 #include <netlink/netlink.h>
     31 #include <netlink/utils.h>
     32 #include <netlink/handlers.h>
     33 #include <netlink/msg.h>
     34 #include <netlink/attr.h>
     35 
     36 /**
     37  * @defgroup core_types Data Types
     38  *
     39  * Core library data types
     40  * @{
     41  * @}
     42  *
     43  * @defgroup send_recv Send & Receive Data
     44  *
     45  * Connection management, sending & receiving of data
     46  *
     47  * Related sections in the development guide:
     48  * - @core_doc{core_send_recv, Sending & Receiving}
     49  * - @core_doc{core_sockets, Sockets}
     50  *
     51  * @{
     52  *
     53  * Header
     54  * ------
     55  * ~~~~{.c}
     56  * #include <netlink/netlink.h>
     57  * ~~~~
     58  */
     59 
     60 /**
     61  * @name Connection Management
     62  * @{
     63  */
     64 
     65 /**
     66  * Create file descriptor and bind socket.
     67  * @arg sk		Netlink socket (required)
     68  * @arg protocol	Netlink protocol to use (required)
     69  *
     70  * Creates a new Netlink socket using `socket()` and binds the socket to the
     71  * protocol and local port specified in the `sk` socket object. Fails if
     72  * the socket is already connected.
     73  *
     74  * @note If available, the `close-on-exec` (`SOCK_CLOEXEC`) feature is enabled
     75  *       automatically on the new file descriptor. This causes the socket to
     76  *       be closed automatically if any of the `exec` family functions succeed.
     77  *       This is essential for multi threaded programs.
     78  *
     79  * @note The local port (`nl_socket_get_local_port()`) is unspecified after
     80  *       creating a new socket. It only gets determined when accessing the
     81  *       port the first time or during `nl_connect()`. When nl_connect()
     82  *       fails during `bind()` due to `ADDRINUSE`, it will retry with
     83  *       different ports if the port is unspecified. Unless you want to enforce
     84  *       the use of a specific local port, don't access the local port (or
     85  *       reset it to `unspecified` by calling `nl_socket_set_local_port(sk, 0)`).
     86  *       This capability is indicated by
     87  *       `%NL_CAPABILITY_NL_CONNECT_RETRY_GENERATE_PORT_ON_ADDRINUSE`.
     88  *
     89  * @see nl_socket_alloc()
     90  * @see nl_close()
     91  *
     92  * @return 0 on success or a negative error code.
     93  *
     94  * @retval -NLE_BAD_SOCK Socket is already connected
     95  */
     96 int nl_connect(struct nl_sock *sk, int protocol)
     97 {
     98 	int err, flags = 0;
     99 	int errsv;
    100 	socklen_t addrlen;
    101 
    102 #ifdef SOCK_CLOEXEC
    103 	flags |= SOCK_CLOEXEC;
    104 #endif
    105 
    106         if (sk->s_fd != -1)
    107                 return -NLE_BAD_SOCK;
    108 
    109 	sk->s_fd = socket(AF_NETLINK, SOCK_RAW | flags, protocol);
    110 	if (sk->s_fd < 0) {
    111 		errsv = errno;
    112 		NL_DBG(4, "nl_connect(%p): socket() failed with %d\n", sk, errsv);
    113 		err = -nl_syserr2nlerr(errsv);
    114 		goto errout;
    115 	}
    116 
    117 	if (!(sk->s_flags & NL_SOCK_BUFSIZE_SET)) {
    118 		err = nl_socket_set_buffer_size(sk, 0, 0);
    119 		if (err < 0)
    120 			goto errout;
    121 	}
    122 
    123 	if (_nl_socket_is_local_port_unspecified (sk)) {
    124 		uint32_t port;
    125 		uint32_t used_ports[32] = { 0 };
    126 
    127 		while (1) {
    128 			port = _nl_socket_generate_local_port_no_release(sk);
    129 
    130 			if (port == UINT32_MAX) {
    131 				NL_DBG(4, "nl_connect(%p): no more unused local ports.\n", sk);
    132 				_nl_socket_used_ports_release_all(used_ports);
    133 				err = -NLE_EXIST;
    134 				goto errout;
    135 			}
    136 			err = bind(sk->s_fd, (struct sockaddr*) &sk->s_local,
    137 				   sizeof(sk->s_local));
    138 			if (err == 0)
    139 				break;
    140 
    141 			errsv = errno;
    142 			if (errsv == EADDRINUSE) {
    143 				NL_DBG(4, "nl_connect(%p): local port %u already in use. Retry.\n", sk, (unsigned) port);
    144 				_nl_socket_used_ports_set(used_ports, port);
    145 			} else {
    146 				NL_DBG(4, "nl_connect(%p): bind() for port %u failed with %d\n", sk, (unsigned) port, errsv);
    147 				_nl_socket_used_ports_release_all(used_ports);
    148 				err = -nl_syserr2nlerr(errsv);
    149 				goto errout;
    150 			}
    151 		}
    152 		_nl_socket_used_ports_release_all(used_ports);
    153 	} else {
    154 		err = bind(sk->s_fd, (struct sockaddr*) &sk->s_local,
    155 			   sizeof(sk->s_local));
    156 		if (err != 0) {
    157 			errsv = errno;
    158 			NL_DBG(4, "nl_connect(%p): bind() failed with %d\n", sk, errsv);
    159 			err = -nl_syserr2nlerr(errsv);
    160 			goto errout;
    161 		}
    162 	}
    163 
    164 	addrlen = sizeof(sk->s_local);
    165 	err = getsockname(sk->s_fd, (struct sockaddr *) &sk->s_local,
    166 			  &addrlen);
    167 	if (err < 0) {
    168 		err = -nl_syserr2nlerr(errno);
    169 		goto errout;
    170 	}
    171 
    172 	if (addrlen != sizeof(sk->s_local)) {
    173 		err = -NLE_NOADDR;
    174 		goto errout;
    175 	}
    176 
    177 	if (sk->s_local.nl_family != AF_NETLINK) {
    178 		err = -NLE_AF_NOSUPPORT;
    179 		goto errout;
    180 	}
    181 
    182 	sk->s_proto = protocol;
    183 
    184 	return 0;
    185 errout:
    186         if (sk->s_fd != -1) {
    187     		close(sk->s_fd);
    188     		sk->s_fd = -1;
    189         }
    190 
    191 	return err;
    192 }
    193 
    194 /**
    195  * Close Netlink socket
    196  * @arg sk		Netlink socket (required)
    197  *
    198  * Closes the Netlink socket using `close()`.
    199  *
    200  * @note The socket is closed automatically if a `struct nl_sock` object is
    201  *       freed using `nl_socket_free()`.
    202  *
    203  * @see nl_connect()
    204  */
    205 void nl_close(struct nl_sock *sk)
    206 {
    207 	if (sk->s_fd >= 0) {
    208 		close(sk->s_fd);
    209 		sk->s_fd = -1;
    210 	}
    211 
    212 	sk->s_proto = 0;
    213 }
    214 
    215 /** @} */
    216 
    217 /**
    218  * @name Send
    219  * @{
    220  */
    221 
    222 /**
    223  * Transmit raw data over Netlink socket.
    224  * @arg sk		Netlink socket (required)
    225  * @arg buf		Buffer carrying data to send (required)
    226  * @arg size		Size of buffer (required)
    227  *
    228  * Transmits "raw" data over the specified Netlink socket. Unlike the other
    229  * transmit functions it does not modify the data in any way. It directly
    230  * passes the buffer \c buf of \c size to sendto().
    231  *
    232  * The message is addressed to the peer as specified in the socket by either
    233  * the nl_socket_set_peer_port() or nl_socket_set_peer_groups() function.
    234  *
    235  * @note Because there is no indication on the message boundaries of the data
    236  *       being sent, the \c NL_CB_MSG_OUT callback handler will not be invoked
    237  *       for data that is being sent using this function.
    238  *
    239  * @see nl_socket_set_peer_port()
    240  * @see nl_socket_set_peer_groups()
    241  * @see nl_sendmsg()
    242  *
    243  * @return Number of bytes sent or a negative error code.
    244  */
    245 int nl_sendto(struct nl_sock *sk, void *buf, size_t size)
    246 {
    247 	int ret;
    248 
    249 	if (!buf)
    250 		return -NLE_INVAL;
    251 
    252 	if (sk->s_fd < 0)
    253 		return -NLE_BAD_SOCK;
    254 
    255 	ret = sendto(sk->s_fd, buf, size, 0, (struct sockaddr *)
    256 		     &sk->s_peer, sizeof(sk->s_peer));
    257 	if (ret < 0)
    258 		return -nl_syserr2nlerr(errno);
    259 
    260 	return ret;
    261 }
    262 
    263 /**
    264  * Transmit Netlink message using sendmsg()
    265  * @arg sk		Netlink socket (required)
    266  * @arg msg		Netlink message to be sent (required)
    267  * @arg hdr		sendmsg() message header (required)
    268  *
    269  * Transmits the message specified in \c hdr over the Netlink socket using the
    270  * sendmsg() system call.
    271  *
    272  * @attention
    273  * The `msg` argument will *not* be used to derive the message payload that
    274  * is being sent out. The `msg` argument is *only* passed on to the
    275  * `NL_CB_MSG_OUT` callback. The caller is responsible to initialize the
    276  * `hdr` struct properly and have it point to the message payload and
    277  * socket address.
    278  *
    279  * @note
    280  * This function uses `nlmsg_set_src()` to modify the `msg` argument prior to
    281  * invoking the `NL_CB_MSG_OUT` callback to provide the local port number.
    282  *
    283  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
    284  *
    285  * @attention
    286  * Think twice before using this function. It provides a low level access to
    287  * the Netlink socket. Among other limitations, it does not add credentials
    288  * even if enabled or respect the destination address specified in the `msg`
    289  * object.
    290  *
    291  * @see nl_socket_set_local_port()
    292  * @see nl_send_auto()
    293  * @see nl_send_iovec()
    294  *
    295  * @return Number of bytes sent on success or a negative error code.
    296  *
    297  * @lowlevel
    298  */
    299 int nl_sendmsg(struct nl_sock *sk, struct nl_msg *msg, struct msghdr *hdr)
    300 {
    301 	struct nl_cb *cb;
    302 	int ret;
    303 
    304 	if (sk->s_fd < 0)
    305 		return -NLE_BAD_SOCK;
    306 
    307 	nlmsg_set_src(msg, &sk->s_local);
    308 
    309 	cb = sk->s_cb;
    310 	if (cb->cb_set[NL_CB_MSG_OUT])
    311 		if ((ret = nl_cb_call(cb, NL_CB_MSG_OUT, msg)) != NL_OK)
    312 			return ret;
    313 
    314 	ret = sendmsg(sk->s_fd, hdr, 0);
    315 	if (ret < 0)
    316 		return -nl_syserr2nlerr(errno);
    317 
    318 	NL_DBG(4, "sent %d bytes\n", ret);
    319 	return ret;
    320 }
    321 
    322 
    323 /**
    324  * Transmit Netlink message (taking IO vector)
    325  * @arg sk		Netlink socket (required)
    326  * @arg msg		Netlink message to be sent (required)
    327  * @arg iov		IO vector to be sent (required)
    328  * @arg iovlen		Number of struct iovec to be sent (required)
    329  *
    330  * This function is identical to nl_send() except that instead of taking a
    331  * `struct nl_msg` object it takes an IO vector. Please see the description
    332  * of `nl_send()`.
    333  *
    334  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
    335  *
    336  * @see nl_send()
    337  *
    338  * @return Number of bytes sent on success or a negative error code.
    339  *
    340  * @lowlevel
    341  */
    342 int nl_send_iovec(struct nl_sock *sk, struct nl_msg *msg, struct iovec *iov, unsigned iovlen)
    343 {
    344 	struct sockaddr_nl *dst;
    345 	struct ucred *creds;
    346 	struct msghdr hdr = {
    347 		.msg_name = (void *) &sk->s_peer,
    348 		.msg_namelen = sizeof(struct sockaddr_nl),
    349 		.msg_iov = iov,
    350 		.msg_iovlen = iovlen,
    351 	};
    352 
    353 	/* Overwrite destination if specified in the message itself, defaults
    354 	 * to the peer address of the socket.
    355 	 */
    356 	dst = nlmsg_get_dst(msg);
    357 	if (dst->nl_family == AF_NETLINK)
    358 		hdr.msg_name = dst;
    359 
    360 	/* Add credentials if present. */
    361 	creds = nlmsg_get_creds(msg);
    362 	if (creds != NULL) {
    363 		char buf[CMSG_SPACE(sizeof(struct ucred))];
    364 		struct cmsghdr *cmsg;
    365 
    366 		hdr.msg_control = buf;
    367 		hdr.msg_controllen = sizeof(buf);
    368 
    369 		cmsg = CMSG_FIRSTHDR(&hdr);
    370 		cmsg->cmsg_level = SOL_SOCKET;
    371 		cmsg->cmsg_type = SCM_CREDENTIALS;
    372 		cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
    373 		memcpy(CMSG_DATA(cmsg), creds, sizeof(struct ucred));
    374 	}
    375 
    376 	return nl_sendmsg(sk, msg, &hdr);
    377 }
    378 
    379 /**
    380  * Transmit Netlink message
    381  * @arg sk		Netlink socket (required)
    382  * @arg msg		Netlink message (required)
    383  *
    384  * Transmits the Netlink message `msg` over the Netlink socket using the
    385  * `sendmsg()` system call. This function is based on `nl_send_iovec()` but
    386  * takes care of initializing a `struct iovec` based on the `msg` object.
    387  *
    388  * The message is addressed to the peer as specified in the socket by either
    389  * the nl_socket_set_peer_port() or nl_socket_set_peer_groups() function.
    390  * The peer address can be overwritten by specifying an address in the `msg`
    391  * object using nlmsg_set_dst().
    392  *
    393  * If present in the `msg`, credentials set by the nlmsg_set_creds() function
    394  * are added to the control buffer of the message.
    395  *
    396  * @par Overwriting Capability:
    397  * Calls to this function can be overwritten by providing an alternative using
    398  * the nl_cb_overwrite_send() function.
    399  *
    400  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
    401  *
    402  * @attention
    403  * Unlike `nl_send_auto()`, this function does *not* finalize the message in
    404  * terms of automatically adding needed flags or filling out port numbers.
    405  *
    406  * @see nl_send_auto()
    407  * @see nl_send_iovec()
    408  * @see nl_socket_set_peer_port()
    409  * @see nl_socket_set_peer_groups()
    410  * @see nlmsg_set_dst()
    411  * @see nlmsg_set_creds()
    412  * @see nl_cb_overwrite_send()
    413  *
    414  * @return Number of bytes sent on success or a negative error code.
    415 */
    416 int nl_send(struct nl_sock *sk, struct nl_msg *msg)
    417 {
    418 	struct nl_cb *cb = sk->s_cb;
    419 
    420 	if (cb->cb_send_ow)
    421 		return cb->cb_send_ow(sk, msg);
    422 	else {
    423 		struct iovec iov = {
    424 			.iov_base = (void *) nlmsg_hdr(msg),
    425 			.iov_len = nlmsg_hdr(msg)->nlmsg_len,
    426 		};
    427 
    428 		return nl_send_iovec(sk, msg, &iov, 1);
    429 	}
    430 }
    431 
    432 /**
    433  * Finalize Netlink message
    434  * @arg sk		Netlink socket (required)
    435  * @arg msg		Netlink message (required)
    436  *
    437  * This function finalizes a Netlink message by completing the message with
    438  * desirable flags and values depending on the socket configuration.
    439  *
    440  *  - If not yet filled out, the source address of the message (`nlmsg_pid`)
    441  *    will be set to the local port number of the socket.
    442  *  - If not yet specified, the next available sequence number is assigned
    443  *    to the message (`nlmsg_seq`).
    444  *  - If not yet specified, the protocol field of the message will be set to
    445  *    the protocol field of the socket.
    446  *  - The `NLM_F_REQUEST` Netlink message flag will be set.
    447  *  - The `NLM_F_ACK` flag will be set if Auto-ACK mode is enabled on the
    448  *    socket.
    449  */
    450 void nl_complete_msg(struct nl_sock *sk, struct nl_msg *msg)
    451 {
    452 	struct nlmsghdr *nlh;
    453 
    454 	nlh = nlmsg_hdr(msg);
    455 	if (nlh->nlmsg_pid == NL_AUTO_PORT)
    456 		nlh->nlmsg_pid = nl_socket_get_local_port(sk);
    457 
    458 	if (nlh->nlmsg_seq == NL_AUTO_SEQ)
    459 		nlh->nlmsg_seq = sk->s_seq_next++;
    460 
    461 	if (msg->nm_protocol == -1)
    462 		msg->nm_protocol = sk->s_proto;
    463 
    464 	nlh->nlmsg_flags |= NLM_F_REQUEST;
    465 
    466 	if (!(sk->s_flags & NL_NO_AUTO_ACK))
    467 		nlh->nlmsg_flags |= NLM_F_ACK;
    468 }
    469 
    470 /**
    471  * Finalize and transmit Netlink message
    472  * @arg sk		Netlink socket (required)
    473  * @arg msg		Netlink message (required)
    474  *
    475  * Finalizes the message by passing it to `nl_complete_msg()` and transmits it
    476  * by passing it to `nl_send()`.
    477  *
    478  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
    479  *
    480  * @see nl_complete_msg()
    481  * @see nl_send()
    482  *
    483  * @return Number of bytes sent or a negative error code.
    484  */
    485 int nl_send_auto(struct nl_sock *sk, struct nl_msg *msg)
    486 {
    487 	nl_complete_msg(sk, msg);
    488 
    489 	return nl_send(sk, msg);
    490 }
    491 
    492 /**
    493  * Finalize and transmit Netlink message and wait for ACK or error message
    494  * @arg sk		Netlink socket (required)
    495  * @arg msg		Netlink message (required)
    496  *
    497  * Passes the `msg` to `nl_send_auto()` to finalize and transmit it. Frees the
    498  * message and waits (sleeps) for the ACK or error message to be received.
    499  *
    500  * @attention
    501  * Disabling Auto-ACK (nl_socket_disable_auto_ack()) will cause this function
    502  * to return immediately after transmitting the message. However, the peer may
    503  * still be returning an error message in response to the request. It is the
    504  * responsibility of the caller to handle such messages.
    505  *
    506  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
    507  *
    508  * @attention
    509  * This function frees the `msg` object after transmitting it by calling
    510  * `nlmsg_free()`.
    511  *
    512  * @see nl_send_auto().
    513  * @see nl_wait_for_ack()
    514  *
    515  * @return 0 on success or a negative error code.
    516  */
    517 int nl_send_sync(struct nl_sock *sk, struct nl_msg *msg)
    518 {
    519 	int err;
    520 
    521 	err = nl_send_auto(sk, msg);
    522 	nlmsg_free(msg);
    523 	if (err < 0)
    524 		return err;
    525 
    526 	return wait_for_ack(sk);
    527 }
    528 
    529 /**
    530  * Construct and transmit a Netlink message
    531  * @arg sk		Netlink socket (required)
    532  * @arg type		Netlink message type (required)
    533  * @arg flags		Netlink message flags (optional)
    534  * @arg buf		Data buffer (optional)
    535  * @arg size		Size of data buffer (optional)
    536  *
    537  * Allocates a new Netlink message based on `type` and `flags`. If `buf`
    538  * points to payload of length `size` that payload will be appended to the
    539  * message.
    540  *
    541  * Sends out the message using `nl_send_auto()` and frees the message
    542  * afterwards.
    543  *
    544  * @see nl_send_auto()
    545  *
    546  * @return Number of characters sent on success or a negative error code.
    547  * @retval -NLE_NOMEM Unable to allocate Netlink message
    548  */
    549 int nl_send_simple(struct nl_sock *sk, int type, int flags, void *buf,
    550 		   size_t size)
    551 {
    552 	int err;
    553 	struct nl_msg *msg;
    554 
    555 	msg = nlmsg_alloc_simple(type, flags);
    556 	if (!msg)
    557 		return -NLE_NOMEM;
    558 
    559 	if (buf && size) {
    560 		err = nlmsg_append(msg, buf, size, NLMSG_ALIGNTO);
    561 		if (err < 0)
    562 			goto errout;
    563 	}
    564 
    565 	err = nl_send_auto(sk, msg);
    566 errout:
    567 	nlmsg_free(msg);
    568 
    569 	return err;
    570 }
    571 
    572 /** @} */
    573 
    574 /**
    575  * @name Receive
    576  * @{
    577  */
    578 
    579 /**
    580  * Receive data from netlink socket
    581  * @arg sk		Netlink socket (required)
    582  * @arg nla		Netlink socket structure to hold address of peer (required)
    583  * @arg buf		Destination pointer for message content (required)
    584  * @arg creds		Destination pointer for credentials (optional)
    585  *
    586  * Receives data from a connected netlink socket using recvmsg() and returns
    587  * the number of bytes read. The read data is stored in a newly allocated
    588  * buffer that is assigned to \c *buf. The peer's netlink address will be
    589  * stored in \c *nla.
    590  *
    591  * This function blocks until data is available to be read unless the socket
    592  * has been put into non-blocking mode using nl_socket_set_nonblocking() in
    593  * which case this function will return immediately with a return value of 0.
    594  *
    595  * The buffer size used when reading from the netlink socket and thus limiting
    596  * the maximum size of a netlink message that can be read defaults to the size
    597  * of a memory page (getpagesize()). The buffer size can be modified on a per
    598  * socket level using the function nl_socket_set_msg_buf_size().
    599  *
    600  * If message peeking is enabled using nl_socket_enable_msg_peek() the size of
    601  * the message to be read will be determined using the MSG_PEEK flag prior to
    602  * performing the actual read. This leads to an additional recvmsg() call for
    603  * every read operation which has performance implications and is not
    604  * recommended for high throughput protocols.
    605  *
    606  * An eventual interruption of the recvmsg() system call is automatically
    607  * handled by retrying the operation.
    608  *
    609  * If receiving of credentials has been enabled using the function
    610  * nl_socket_set_passcred(), this function will allocate a new struct ucred
    611  * filled with the received credentials and assign it to \c *creds. The caller
    612  * is responsible for freeing the buffer.
    613  *
    614  * @note The caller is responsible to free the returned data buffer and if
    615  *       enabled, the credentials buffer.
    616  *
    617  * @see nl_socket_set_nonblocking()
    618  * @see nl_socket_set_msg_buf_size()
    619  * @see nl_socket_enable_msg_peek()
    620  * @see nl_socket_set_passcred()
    621  *
    622  * @return Number of bytes read, 0 on EOF, 0 on no data event (non-blocking
    623  *         mode), or a negative error code.
    624  */
    625 int nl_recv(struct nl_sock *sk, struct sockaddr_nl *nla,
    626 	    unsigned char **buf, struct ucred **creds)
    627 {
    628 	ssize_t n;
    629 	int flags = 0;
    630 	static int page_size = 0;
    631 	struct iovec iov;
    632 	struct msghdr msg = {
    633 		.msg_name = (void *) nla,
    634 		.msg_namelen = sizeof(struct sockaddr_nl),
    635 		.msg_iov = &iov,
    636 		.msg_iovlen = 1,
    637 	};
    638 	struct ucred* tmpcreds = NULL;
    639 	int retval = 0;
    640 
    641 	if (!buf || !nla)
    642 		return -NLE_INVAL;
    643 
    644 	if (sk->s_flags & NL_MSG_PEEK)
    645 		flags |= MSG_PEEK | MSG_TRUNC;
    646 
    647 	if (page_size == 0)
    648 		page_size = getpagesize() * 4;
    649 
    650 	iov.iov_len = sk->s_bufsize ? : page_size;
    651 	iov.iov_base = malloc(iov.iov_len);
    652 
    653 	if (!iov.iov_base) {
    654 		retval = -NLE_NOMEM;
    655 		goto abort;
    656 	}
    657 
    658 	if (creds && (sk->s_flags & NL_SOCK_PASSCRED)) {
    659 		msg.msg_controllen = CMSG_SPACE(sizeof(struct ucred));
    660 		msg.msg_control = malloc(msg.msg_controllen);
    661 		if (!msg.msg_control) {
    662 			retval = -NLE_NOMEM;
    663 			goto abort;
    664 		}
    665 	}
    666 retry:
    667 
    668 	n = recvmsg(sk->s_fd, &msg, flags);
    669 	if (!n) {
    670 		retval = 0;
    671 		goto abort;
    672 	}
    673 	if (n < 0) {
    674 		if (errno == EINTR) {
    675 			NL_DBG(3, "recvmsg() returned EINTR, retrying\n");
    676 			goto retry;
    677 		}
    678 		retval = -nl_syserr2nlerr(errno);
    679 		goto abort;
    680 	}
    681 
    682 	if (msg.msg_flags & MSG_CTRUNC) {
    683 		void *tmp;
    684 		msg.msg_controllen *= 2;
    685 		tmp = realloc(msg.msg_control, msg.msg_controllen);
    686 		if (!tmp) {
    687 			retval = -NLE_NOMEM;
    688 			goto abort;
    689 		}
    690 		msg.msg_control = tmp;
    691 		goto retry;
    692 	}
    693 
    694 	if (iov.iov_len < n || (msg.msg_flags & MSG_TRUNC)) {
    695 		void *tmp;
    696 		/* Provided buffer is not long enough, enlarge it
    697 		 * to size of n (which should be total length of the message)
    698 		 * and try again. */
    699 		iov.iov_len = n;
    700 		tmp = realloc(iov.iov_base, iov.iov_len);
    701 		if (!tmp) {
    702 			retval = -NLE_NOMEM;
    703 			goto abort;
    704 		}
    705 		iov.iov_base = tmp;
    706 		flags = 0;
    707 		goto retry;
    708 	}
    709 
    710         if (flags != 0) {
    711 		/* Buffer is big enough, do the actual reading */
    712 		flags = 0;
    713 		goto retry;
    714 	}
    715 
    716 	if (msg.msg_namelen != sizeof(struct sockaddr_nl)) {
    717 		retval =  -NLE_NOADDR;
    718 		goto abort;
    719 	}
    720 
    721 	if (creds && (sk->s_flags & NL_SOCK_PASSCRED)) {
    722 		struct cmsghdr *cmsg;
    723 
    724 		for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
    725 			if (cmsg->cmsg_level != SOL_SOCKET)
    726 				continue;
    727 			if (cmsg->cmsg_type != SCM_CREDENTIALS)
    728 				continue;
    729 			tmpcreds = malloc(sizeof(*tmpcreds));
    730 			if (!tmpcreds) {
    731 				retval = -NLE_NOMEM;
    732 				goto abort;
    733 			}
    734 			memcpy(tmpcreds, CMSG_DATA(cmsg), sizeof(*tmpcreds));
    735 			break;
    736 		}
    737 	}
    738 
    739 	retval = n;
    740 abort:
    741 	free(msg.msg_control);
    742 
    743 	if (retval <= 0) {
    744 		free(iov.iov_base);
    745 		iov.iov_base = NULL;
    746 		free(tmpcreds);
    747 		tmpcreds = NULL;
    748 	} else
    749 		*buf = iov.iov_base;
    750 
    751 	if (creds)
    752 		*creds = tmpcreds;
    753 
    754 	return retval;
    755 }
    756 
    757 /** @cond SKIP */
    758 #define NL_CB_CALL(cb, type, msg) \
    759 do { \
    760 	err = nl_cb_call(cb, type, msg); \
    761 	switch (err) { \
    762 	case NL_OK: \
    763 		err = 0; \
    764 		break; \
    765 	case NL_SKIP: \
    766 		goto skip; \
    767 	case NL_STOP: \
    768 		goto stop; \
    769 	default: \
    770 		goto out; \
    771 	} \
    772 } while (0)
    773 /** @endcond */
    774 
    775 static int recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
    776 {
    777 	int n, err = 0, multipart = 0, interrupted = 0, nrecv = 0;
    778 	unsigned char *buf = NULL;
    779 	struct nlmsghdr *hdr;
    780 
    781 	/*
    782 	nla is passed on to not only to nl_recv() but may also be passed
    783 	to a function pointer provided by the caller which may or may not
    784 	initialize the variable. Thomas Graf.
    785 	*/
    786 	struct sockaddr_nl nla = {0};
    787 	struct nl_msg *msg = NULL;
    788 	struct ucred *creds = NULL;
    789 
    790 continue_reading:
    791 	NL_DBG(3, "Attempting to read from %p\n", sk);
    792 	if (cb->cb_recv_ow)
    793 		n = cb->cb_recv_ow(sk, &nla, &buf, &creds);
    794 	else
    795 		n = nl_recv(sk, &nla, &buf, &creds);
    796 
    797 	if (n <= 0)
    798 		return n;
    799 
    800 	NL_DBG(3, "recvmsgs(%p): Read %d bytes\n", sk, n);
    801 
    802 	hdr = (struct nlmsghdr *) buf;
    803 	while (nlmsg_ok(hdr, n)) {
    804 		NL_DBG(3, "recvmsgs(%p): Processing valid message...\n", sk);
    805 
    806 		nlmsg_free(msg);
    807 		msg = nlmsg_convert(hdr);
    808 		if (!msg) {
    809 			err = -NLE_NOMEM;
    810 			goto out;
    811 		}
    812 
    813 		nlmsg_set_proto(msg, sk->s_proto);
    814 		nlmsg_set_src(msg, &nla);
    815 		if (creds)
    816 			nlmsg_set_creds(msg, creds);
    817 
    818 		nrecv++;
    819 
    820 		/* Raw callback is the first, it gives the most control
    821 		 * to the user and he can do his very own parsing. */
    822 		if (cb->cb_set[NL_CB_MSG_IN])
    823 			NL_CB_CALL(cb, NL_CB_MSG_IN, msg);
    824 
    825 		/* Sequence number checking. The check may be done by
    826 		 * the user, otherwise a very simple check is applied
    827 		 * enforcing strict ordering */
    828 		if (cb->cb_set[NL_CB_SEQ_CHECK]) {
    829 			NL_CB_CALL(cb, NL_CB_SEQ_CHECK, msg);
    830 
    831 		/* Only do sequence checking if auto-ack mode is enabled */
    832 		} else if (!(sk->s_flags & NL_NO_AUTO_ACK)) {
    833 			if (hdr->nlmsg_seq != sk->s_seq_expect) {
    834 				if (cb->cb_set[NL_CB_INVALID])
    835 					NL_CB_CALL(cb, NL_CB_INVALID, msg);
    836 				else {
    837 					err = -NLE_SEQ_MISMATCH;
    838 					goto out;
    839 				}
    840 			}
    841 		}
    842 
    843 		if (hdr->nlmsg_type == NLMSG_DONE ||
    844 		    hdr->nlmsg_type == NLMSG_ERROR ||
    845 		    hdr->nlmsg_type == NLMSG_NOOP ||
    846 		    hdr->nlmsg_type == NLMSG_OVERRUN) {
    847 			/* We can't check for !NLM_F_MULTI since some netlink
    848 			 * users in the kernel are broken. */
    849 			sk->s_seq_expect++;
    850 			NL_DBG(3, "recvmsgs(%p): Increased expected " \
    851 			       "sequence number to %d\n",
    852 			       sk, sk->s_seq_expect);
    853 		}
    854 
    855 		if (hdr->nlmsg_flags & NLM_F_MULTI)
    856 			multipart = 1;
    857 
    858 		if (hdr->nlmsg_flags & NLM_F_DUMP_INTR) {
    859 			if (cb->cb_set[NL_CB_DUMP_INTR])
    860 				NL_CB_CALL(cb, NL_CB_DUMP_INTR, msg);
    861 			else {
    862 				/*
    863 				 * We have to continue reading to clear
    864 				 * all messages until a NLMSG_DONE is
    865 				 * received and report the inconsistency.
    866 				 */
    867 				interrupted = 1;
    868 			}
    869 		}
    870 
    871 		/* Other side wishes to see an ack for this message */
    872 		if (hdr->nlmsg_flags & NLM_F_ACK) {
    873 			if (cb->cb_set[NL_CB_SEND_ACK])
    874 				NL_CB_CALL(cb, NL_CB_SEND_ACK, msg);
    875 			else {
    876 				/* FIXME: implement */
    877 			}
    878 		}
    879 
    880 		/* messages terminates a multipart message, this is
    881 		 * usually the end of a message and therefore we slip
    882 		 * out of the loop by default. the user may overrule
    883 		 * this action by skipping this packet. */
    884 		if (hdr->nlmsg_type == NLMSG_DONE) {
    885 			multipart = 0;
    886 			if (cb->cb_set[NL_CB_FINISH])
    887 				NL_CB_CALL(cb, NL_CB_FINISH, msg);
    888 		}
    889 
    890 		/* Message to be ignored, the default action is to
    891 		 * skip this message if no callback is specified. The
    892 		 * user may overrule this action by returning
    893 		 * NL_PROCEED. */
    894 		else if (hdr->nlmsg_type == NLMSG_NOOP) {
    895 			if (cb->cb_set[NL_CB_SKIPPED])
    896 				NL_CB_CALL(cb, NL_CB_SKIPPED, msg);
    897 			else
    898 				goto skip;
    899 		}
    900 
    901 		/* Data got lost, report back to user. The default action is to
    902 		 * quit parsing. The user may overrule this action by retuning
    903 		 * NL_SKIP or NL_PROCEED (dangerous) */
    904 		else if (hdr->nlmsg_type == NLMSG_OVERRUN) {
    905 			if (cb->cb_set[NL_CB_OVERRUN])
    906 				NL_CB_CALL(cb, NL_CB_OVERRUN, msg);
    907 			else {
    908 				err = -NLE_MSG_OVERFLOW;
    909 				goto out;
    910 			}
    911 		}
    912 
    913 		/* Message carries a nlmsgerr */
    914 		else if (hdr->nlmsg_type == NLMSG_ERROR) {
    915 			struct nlmsgerr *e = nlmsg_data(hdr);
    916 
    917 			if (hdr->nlmsg_len < nlmsg_size(sizeof(*e))) {
    918 				/* Truncated error message, the default action
    919 				 * is to stop parsing. The user may overrule
    920 				 * this action by returning NL_SKIP or
    921 				 * NL_PROCEED (dangerous) */
    922 				if (cb->cb_set[NL_CB_INVALID])
    923 					NL_CB_CALL(cb, NL_CB_INVALID, msg);
    924 				else {
    925 					err = -NLE_MSG_TRUNC;
    926 					goto out;
    927 				}
    928 			} else if (e->error) {
    929 				/* Error message reported back from kernel. */
    930 				if (cb->cb_err) {
    931 					err = cb->cb_err(&nla, e,
    932 							   cb->cb_err_arg);
    933 					if (err < 0)
    934 						goto out;
    935 					else if (err == NL_SKIP)
    936 						goto skip;
    937 					else if (err == NL_STOP) {
    938 						err = -nl_syserr2nlerr(e->error);
    939 						goto out;
    940 					}
    941 				} else {
    942 					err = -nl_syserr2nlerr(e->error);
    943 					goto out;
    944 				}
    945 			} else if (cb->cb_set[NL_CB_ACK])
    946 				NL_CB_CALL(cb, NL_CB_ACK, msg);
    947 		} else {
    948 			/* Valid message (not checking for MULTIPART bit to
    949 			 * get along with broken kernels. NL_SKIP has no
    950 			 * effect on this.  */
    951 			if (cb->cb_set[NL_CB_VALID])
    952 				NL_CB_CALL(cb, NL_CB_VALID, msg);
    953 		}
    954 skip:
    955 		err = 0;
    956 		hdr = nlmsg_next(hdr, &n);
    957 	}
    958 
    959 	nlmsg_free(msg);
    960 	free(buf);
    961 	free(creds);
    962 	buf = NULL;
    963 	msg = NULL;
    964 	creds = NULL;
    965 
    966 	if (multipart) {
    967 		/* Multipart message not yet complete, continue reading */
    968 		goto continue_reading;
    969 	}
    970 stop:
    971 	err = 0;
    972 out:
    973 	nlmsg_free(msg);
    974 	free(buf);
    975 	free(creds);
    976 
    977 	if (interrupted)
    978 		err = -NLE_DUMP_INTR;
    979 
    980 	if (!err)
    981 		err = nrecv;
    982 
    983 	return err;
    984 }
    985 
    986 /**
    987  * Receive a set of messages from a netlink socket and report parsed messages
    988  * @arg sk		Netlink socket.
    989  * @arg cb		set of callbacks to control behaviour.
    990  *
    991  * This function is identical to nl_recvmsgs() to the point that it will
    992  * return the number of parsed messages instead of 0 on success.
    993  *
    994  * @see nl_recvmsgs()
    995  *
    996  * @return Number of received messages or a negative error code from nl_recv().
    997  */
    998 int nl_recvmsgs_report(struct nl_sock *sk, struct nl_cb *cb)
    999 {
   1000 	if (cb->cb_recvmsgs_ow)
   1001 		return cb->cb_recvmsgs_ow(sk, cb);
   1002 	else
   1003 		return recvmsgs(sk, cb);
   1004 }
   1005 
   1006 /**
   1007  * Receive a set of messages from a netlink socket.
   1008  * @arg sk		Netlink socket.
   1009  * @arg cb		set of callbacks to control behaviour.
   1010  *
   1011  * Repeatedly calls nl_recv() or the respective replacement if provided
   1012  * by the application (see nl_cb_overwrite_recv()) and parses the
   1013  * received data as netlink messages. Stops reading if one of the
   1014  * callbacks returns NL_STOP or nl_recv returns either 0 or a negative error code.
   1015  *
   1016  * A non-blocking sockets causes the function to return immediately if
   1017  * no data is available.
   1018  *
   1019  * @see nl_recvmsgs_report()
   1020  *
   1021  * @return 0 on success or a negative error code from nl_recv().
   1022  */
   1023 int nl_recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
   1024 {
   1025 	int err;
   1026 
   1027 	if ((err = nl_recvmsgs_report(sk, cb)) > 0)
   1028 		err = 0;
   1029 
   1030 	return err;
   1031 }
   1032 
   1033 /**
   1034  * Receive a set of message from a netlink socket using handlers in nl_sock.
   1035  * @arg sk		Netlink socket.
   1036  *
   1037  * Calls nl_recvmsgs() with the handlers configured in the netlink socket.
   1038  */
   1039 int nl_recvmsgs_default(struct nl_sock *sk)
   1040 {
   1041 	return nl_recvmsgs(sk, sk->s_cb);
   1042 
   1043 }
   1044 
   1045 static int ack_wait_handler(struct nl_msg *msg, void *arg)
   1046 {
   1047 	return NL_STOP;
   1048 }
   1049 
   1050 /**
   1051  * Wait for ACK.
   1052  * @arg sk		Netlink socket.
   1053  * @pre The netlink socket must be in blocking state.
   1054  *
   1055  * Waits until an ACK is received for the latest not yet acknowledged
   1056  * netlink message.
   1057  */
   1058 int nl_wait_for_ack(struct nl_sock *sk)
   1059 {
   1060 	int err;
   1061 	struct nl_cb *cb;
   1062 
   1063 	cb = nl_cb_clone(sk->s_cb);
   1064 	if (cb == NULL)
   1065 		return -NLE_NOMEM;
   1066 
   1067 	nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_wait_handler, NULL);
   1068 	err = nl_recvmsgs(sk, cb);
   1069 	nl_cb_put(cb);
   1070 
   1071 	return err;
   1072 }
   1073 
   1074 /** @cond SKIP */
   1075 struct pickup_param
   1076 {
   1077 	int (*parser)(struct nl_cache_ops *, struct sockaddr_nl *,
   1078 		      struct nlmsghdr *, struct nl_parser_param *);
   1079 	struct nl_object *result;
   1080 };
   1081 
   1082 static int __store_answer(struct nl_object *obj, struct nl_parser_param *p)
   1083 {
   1084 	struct pickup_param *pp = p->pp_arg;
   1085 	/*
   1086 	 * the parser will put() the object at the end, expecting the cache
   1087 	 * to take the reference.
   1088 	 */
   1089 	nl_object_get(obj);
   1090 	pp->result =  obj;
   1091 
   1092 	return 0;
   1093 }
   1094 
   1095 static int __pickup_answer(struct nl_msg *msg, void *arg)
   1096 {
   1097 	struct pickup_param *pp = arg;
   1098 	struct nl_parser_param parse_arg = {
   1099 		.pp_cb = __store_answer,
   1100 		.pp_arg = pp,
   1101 	};
   1102 
   1103 	return pp->parser(NULL, &msg->nm_src, msg->nm_nlh, &parse_arg);
   1104 }
   1105 
   1106 /** @endcond */
   1107 
   1108 /**
   1109  * Pickup netlink answer, parse is and return object
   1110  * @arg sk		Netlink socket
   1111  * @arg parser		Parser function to parse answer
   1112  * @arg result		Result pointer to return parsed object
   1113  *
   1114  * @return 0 on success or a negative error code.
   1115  */
   1116 int nl_pickup(struct nl_sock *sk,
   1117 	      int (*parser)(struct nl_cache_ops *, struct sockaddr_nl *,
   1118 			    struct nlmsghdr *, struct nl_parser_param *),
   1119 	      struct nl_object **result)
   1120 {
   1121 	struct nl_cb *cb;
   1122 	int err;
   1123 	struct pickup_param pp = {
   1124 		.parser = parser,
   1125 	};
   1126 
   1127 	cb = nl_cb_clone(sk->s_cb);
   1128 	if (cb == NULL)
   1129 		return -NLE_NOMEM;
   1130 
   1131 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, __pickup_answer, &pp);
   1132 
   1133 	err = nl_recvmsgs(sk, cb);
   1134 	if (err < 0)
   1135 		goto errout;
   1136 
   1137 	*result = pp.result;
   1138 errout:
   1139 	nl_cb_put(cb);
   1140 
   1141 	return err;
   1142 }
   1143 
   1144 /** @} */
   1145 
   1146 /**
   1147  * @name Deprecated
   1148  * @{
   1149  */
   1150 
   1151 /**
   1152  * @deprecated Please use nl_complete_msg()
   1153  */
   1154 void nl_auto_complete(struct nl_sock *sk, struct nl_msg *msg)
   1155 {
   1156 	nl_complete_msg(sk, msg);
   1157 }
   1158 
   1159 /**
   1160  * @deprecated Please use nl_send_auto()
   1161  */
   1162 int nl_send_auto_complete(struct nl_sock *sk, struct nl_msg *msg)
   1163 {
   1164 	return nl_send_auto(sk, msg);
   1165 }
   1166 
   1167 
   1168 /** @} */
   1169 
   1170 /** @} */
   1171 
   1172 /** @} */
   1173