On Thu, 28 Sep 2017 21:33:45 +0800
Hangbin Liu <ha...@redhat.com> wrote:

>  
> +static int __rtnl_recvmsg(int fd, struct msghdr *msg, int flags)
> +{
> +     int len;
> +
> +     do {
> +             len = recvmsg(fd, msg, flags);
> +     } while (len < 0 && (errno == EINTR || errno == EAGAIN));
> +
> +     if (len < 0) {
> +             fprintf(stderr, "netlink receive error %s (%d)\n",
> +                     strerror(errno), errno);
> +             return -errno;
> +     }
> +
> +     if (len == 0) {
> +             fprintf(stderr, "EOF on netlink\n");
> +             return -ENODATA;
> +     }
> +
> +     return len;
> +}
> +
> +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;
> +     }
> +
> +     if (answer)
> +             *answer = buf;
> +     else
> +             free(buf);
> +
> +     return len;
> +}

Doubling the number of system calls per message is not going to make
users with 5,000,000 routes or 1000 vlans, or 10,000 tunnels happy.
Please rethink this.

Reply via email to