Handle EPIPE as a common connection close event.
This commit is contained in:
parent
0267f49fb2
commit
475977242a
3 changed files with 13 additions and 3 deletions
|
@ -434,6 +434,15 @@ bgp_sock_err(sock *sk, int err)
|
|||
struct bgp_conn *conn = sk->data;
|
||||
struct bgp_proto *p = conn->bgp;
|
||||
|
||||
/*
|
||||
* This error hook may be called either asynchronously from main
|
||||
* loop, or synchronously from sk_send(). But sk_send() is called
|
||||
* only from bgp_tx() and bgp_kick_tx(), which are both called
|
||||
* asynchronously from main loop. Moreover, they end if err hook is
|
||||
* called. Therefore, we could suppose that it is always called
|
||||
* asynchronously.
|
||||
*/
|
||||
|
||||
bgp_store_error(p, conn, BE_SOCKET, err);
|
||||
|
||||
if (err)
|
||||
|
|
|
@ -594,7 +594,7 @@ bgp_kick_tx(void *vconn)
|
|||
struct bgp_conn *conn = vconn;
|
||||
|
||||
DBG("BGP: kicking TX\n");
|
||||
while (bgp_fire_tx(conn))
|
||||
while (bgp_fire_tx(conn) > 0)
|
||||
;
|
||||
}
|
||||
|
||||
|
@ -604,7 +604,7 @@ bgp_tx(sock *sk)
|
|||
struct bgp_conn *conn = sk->data;
|
||||
|
||||
DBG("BGP: TX hook\n");
|
||||
while (bgp_fire_tx(conn))
|
||||
while (bgp_fire_tx(conn) > 0)
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -1216,7 +1216,8 @@ sk_maybe_write(sock *s)
|
|||
if (errno != EINTR && errno != EAGAIN)
|
||||
{
|
||||
reset_tx_buffer(s);
|
||||
s->err_hook(s, errno);
|
||||
/* EPIPE is just a connection close notification during TX */
|
||||
s->err_hook(s, (errno != EPIPE) ? errno : 0);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue