On Wed, 25 Oct 2017 20:59:01 -0600
David Ahern [off-list ref] wrote:
On 10/25/17 7:41 PM, Hangbin Liu wrote:
quoted
+static int rtnl_recvmsg(int fd, struct msghdr *msg, char **answer)
+{
+ struct iovec *iov = msg->msg_iov;
+ char *buf;
+ int len;
+
+ iov->iov_base = NULL;
+ iov->iov_len = 0;
+
+ len = __rtnl_recvmsg(fd, msg, MSG_PEEK | MSG_TRUNC);
+ if (len < 0)
+ return len;
+
+ buf = malloc(len);
+ if (!buf) {
+ fprintf(stderr, "malloc error: not enough buffer\n");
+ return -ENOMEM;
+ }
+
+ iov->iov_base = buf;
+ iov->iov_len = len;
+
+ len = __rtnl_recvmsg(fd, msg, 0);
+ if (len < 0) {
+ free(buf);
+ return len;
+ }
The kernel needs a flag that says "give me the message of the buffer is
large enough; if not just PEEK and tell me the length." That would avoid
the double call in most cases.
Actually this has little impact because old code was doing implicit zero
of whole buffer, new code does not.