Kernel socket missing err_hook fix
Thanks to Tim Weippert for bugreport.
This commit is contained in:
parent
79e2293ab2
commit
ccd2a3eda2
3 changed files with 15 additions and 1 deletions
|
@ -911,6 +911,12 @@ krt_sock_hook(sock *sk, int size UNUSED)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_sock_err_hook(sock *sk, int e UNUSED)
|
||||||
|
{
|
||||||
|
krt_sock_hook(sk, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static sock *
|
static sock *
|
||||||
krt_sock_open(pool *pool, void *data, int table_id)
|
krt_sock_open(pool *pool, void *data, int table_id)
|
||||||
{
|
{
|
||||||
|
@ -932,6 +938,7 @@ krt_sock_open(pool *pool, void *data, int table_id)
|
||||||
sk = sk_new(pool);
|
sk = sk_new(pool);
|
||||||
sk->type = SK_MAGIC;
|
sk->type = SK_MAGIC;
|
||||||
sk->rx_hook = krt_sock_hook;
|
sk->rx_hook = krt_sock_hook;
|
||||||
|
sk->err_hook = krt_sock_err_hook;
|
||||||
sk->fd = fd;
|
sk->fd = fd;
|
||||||
sk->data = data;
|
sk->data = data;
|
||||||
|
|
||||||
|
|
|
@ -1525,6 +1525,12 @@ nl_async_hook(sock *sk, int size UNUSED)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nl_async_err_hook(sock *sk, int e UNUSED)
|
||||||
|
{
|
||||||
|
nl_async_hook(sk, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nl_open_async(void)
|
nl_open_async(void)
|
||||||
{
|
{
|
||||||
|
@ -1563,6 +1569,7 @@ nl_open_async(void)
|
||||||
sk = nl_async_sk = sk_new(krt_pool);
|
sk = nl_async_sk = sk_new(krt_pool);
|
||||||
sk->type = SK_MAGIC;
|
sk->type = SK_MAGIC;
|
||||||
sk->rx_hook = nl_async_hook;
|
sk->rx_hook = nl_async_hook;
|
||||||
|
sk->err_hook = nl_async_err_hook;
|
||||||
sk->fd = fd;
|
sk->fd = fd;
|
||||||
if (sk_open(sk) < 0)
|
if (sk_open(sk) < 0)
|
||||||
bug("Netlink: sk_open failed");
|
bug("Netlink: sk_open failed");
|
||||||
|
|
|
@ -1857,7 +1857,7 @@ void
|
||||||
sk_err(sock *s, int revents)
|
sk_err(sock *s, int revents)
|
||||||
{
|
{
|
||||||
int se = 0, sse = sizeof(se);
|
int se = 0, sse = sizeof(se);
|
||||||
if (revents & POLLERR)
|
if ((s->type != SK_MAGIC) && (revents & POLLERR))
|
||||||
if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &se, &sse) < 0)
|
if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &se, &sse) < 0)
|
||||||
{
|
{
|
||||||
log(L_ERR "IO: Socket error: SO_ERROR: %m");
|
log(L_ERR "IO: Socket error: SO_ERROR: %m");
|
||||||
|
|
Loading…
Reference in a new issue