Handle EPIPE as a common connection close event.

This commit is contained in:
Ondrej Zajicek 2010-05-14 16:54:39 +02:00
parent 0267f49fb2
commit 475977242a
3 changed files with 13 additions and 3 deletions

View file

@ -434,6 +434,15 @@ bgp_sock_err(sock *sk, int err)
struct bgp_conn *conn = sk->data; struct bgp_conn *conn = sk->data;
struct bgp_proto *p = conn->bgp; 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); bgp_store_error(p, conn, BE_SOCKET, err);
if (err) if (err)

View file

@ -594,7 +594,7 @@ bgp_kick_tx(void *vconn)
struct bgp_conn *conn = vconn; struct bgp_conn *conn = vconn;
DBG("BGP: kicking TX\n"); 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; struct bgp_conn *conn = sk->data;
DBG("BGP: TX hook\n"); DBG("BGP: TX hook\n");
while (bgp_fire_tx(conn)) while (bgp_fire_tx(conn) > 0)
; ;
} }

View file

@ -1216,7 +1216,8 @@ sk_maybe_write(sock *s)
if (errno != EINTR && errno != EAGAIN) if (errno != EINTR && errno != EAGAIN)
{ {
reset_tx_buffer(s); 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 -1;
} }
return 0; return 0;