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:
parent
cc1c9ca6f8
commit
da331d779c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user