tpws: display SO_ERROR on EPOLLHUP/EPOLLERR in debug=1

This commit is contained in:
bol-van 2020-01-23 14:52:59 +03:00
parent ad5c9e8675
commit a0637216b3
9 changed files with 19 additions and 6 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -91,6 +91,14 @@ static bool socks_send_rep_errno(uint8_t ver, int fd, int errn)
{ {
return ver==5 ? socks5_send_rep_errno(fd,errn) : socks4_send_rep_errno(fd, errn); return ver==5 ? socks5_send_rep_errno(fd,errn) : socks4_send_rep_errno(fd, errn);
} }
static int get_so_error(int fd)
{
int errn;
socklen_t optlen = sizeof(errn);
if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &errn, &optlen) == -1)
errn=errno;
return errn;
}
static bool proxy_remote_conn_ack(tproxy_conn_t *conn) static bool proxy_remote_conn_ack(tproxy_conn_t *conn)
{ {
// if proxy mode acknowledge connection request // if proxy mode acknowledge connection request
@ -102,10 +110,7 @@ static bool proxy_remote_conn_ack(tproxy_conn_t *conn)
case CONN_TYPE_SOCKS: case CONN_TYPE_SOCKS:
if (conn->partner->socks_state==S_WAIT_CONNECTION) if (conn->partner->socks_state==S_WAIT_CONNECTION)
{ {
int errn; int errn=get_so_error(conn->fd);
socklen_t optlen = sizeof(errn);
if(getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &errn, &optlen) == -1)
errn=errno;
conn->partner->socks_state=S_TCP; conn->partner->socks_state=S_TCP;
bres = socks_send_rep_errno(conn->partner->socks_ver,conn->partner->fd, errn); bres = socks_send_rep_errno(conn->partner->socks_ver,conn->partner->fd, errn);
DBGPRINT("socks connection acknowledgement. bres=%d remote_errn=%d remote_fd=%d local_fd=%d",bres,errn,conn->fd,conn->partner->fd) DBGPRINT("socks connection acknowledgement. bres=%d remote_errn=%d remote_fd=%d local_fd=%d",bres,errn,conn->fd,conn->partner->fd)
@ -1310,8 +1315,16 @@ int event_loop(int listen_fd)
{ {
if (events[i].events & (EPOLLHUP|EPOLLERR)) if (events[i].events & (EPOLLHUP|EPOLLERR))
{ {
if (events[i].events & EPOLLERR) DBGPRINT("EPOLLERR") int errn = get_so_error(conn->fd);
if (events[i].events & EPOLLHUP) DBGPRINT("EPOLLHUP") const char *se;
switch (events[i].events & (EPOLLHUP|EPOLLERR))
{
case EPOLLERR: se="EPOLLERR"; break;
case EPOLLHUP: se="EPOLLHUP"; break;
case EPOLLHUP|EPOLLERR: se="EPOLLERR EPOLLHUP"; break;
default: se=NULL;
}
VPRINT("Socket fd=%d (partner_fd=%d, remote=%d) %s so_error=%d (%s)",conn->fd,conn->partner ? conn->partner->fd : 0,conn->remote,se,errn,strerror(errn));
proxy_remote_conn_ack(conn); proxy_remote_conn_ack(conn);
read_all_and_buffer(conn,3); read_all_and_buffer(conn,3);
conn_close_with_partner_check(&conn_list,&close_list,conn); conn_close_with_partner_check(&conn_list,&close_list,conn);