ifplugd: use a larger netlink buffer

function                                             old     new   delta
check_existence_through_netlink                      310     321     +11

Signed-off-by: Tito Ragusa <farmatito@tiscali.it>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Tito Ragusa 2013-08-04 18:08:40 +02:00 committed by Denys Vlasenko
parent cc1c9ca6f8
commit da331d779c

View File

@ -451,20 +451,24 @@ static smallint detect_link(void)
static NOINLINE int check_existence_through_netlink(void) static NOINLINE int check_existence_through_netlink(void)
{ {
int iface_len; int iface_len;
char replybuf[1024]; /* Buffer was 1K, but on linux-3.9.9 it was reported to be too small.
* netlink.h: "limit to 8K to avoid MSG_TRUNC when PAGE_SIZE is very large".
* Note: on error returns (-1) we exit, no need to free replybuf.
*/
enum { BUF_SIZE = 8 * 1024 };
char *replybuf = xmalloc(BUF_SIZE);
iface_len = strlen(G.iface); iface_len = strlen(G.iface);
while (1) { while (1) {
struct nlmsghdr *mhdr; struct nlmsghdr *mhdr;
ssize_t bytes; ssize_t bytes;
bytes = recv(netlink_fd, &replybuf, sizeof(replybuf), MSG_DONTWAIT); bytes = recv(netlink_fd, replybuf, BUF_SIZE, MSG_DONTWAIT);
if (bytes < 0) { if (bytes < 0) {
if (errno == EAGAIN) if (errno == EAGAIN)
return G.iface_exists; goto ret;
if (errno == EINTR) if (errno == EINTR)
continue; continue;
bb_perror_msg("netlink: recv"); bb_perror_msg("netlink: recv");
return -1; return -1;
} }
@ -507,6 +511,8 @@ static NOINLINE int check_existence_through_netlink(void)
} }
} }
ret:
free(replybuf);
return G.iface_exists; return G.iface_exists;
} }