mirror of
https://github.com/bol-van/zapret.git
synced 2025-04-19 13:32:58 +03:00
tpws: SO_ERROR clears error
This commit is contained in:
parent
a0637216b3
commit
06116faa56
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.
@ -93,13 +93,15 @@ static bool socks_send_rep_errno(uint8_t ver, int fd, int errn)
|
|||||||
}
|
}
|
||||||
static int get_so_error(int fd)
|
static int get_so_error(int fd)
|
||||||
{
|
{
|
||||||
|
// getsockopt(SO_ERROR) clears error
|
||||||
int errn;
|
int errn;
|
||||||
socklen_t optlen = sizeof(errn);
|
socklen_t optlen = sizeof(errn);
|
||||||
if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &errn, &optlen) == -1)
|
if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &errn, &optlen) == -1)
|
||||||
errn=errno;
|
errn=errno;
|
||||||
|
|
||||||
return errn;
|
return errn;
|
||||||
}
|
}
|
||||||
static bool proxy_remote_conn_ack(tproxy_conn_t *conn)
|
static bool proxy_remote_conn_ack(tproxy_conn_t *conn, int sock_err)
|
||||||
{
|
{
|
||||||
// if proxy mode acknowledge connection request
|
// if proxy mode acknowledge connection request
|
||||||
// conn = remote. conn->partner = local
|
// conn = remote. conn->partner = local
|
||||||
@ -110,10 +112,9 @@ 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=get_so_error(conn->fd);
|
|
||||||
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,sock_err);
|
||||||
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,sock_err,conn->fd,conn->partner->fd)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -707,7 +708,7 @@ static bool check_connection_attempt(tproxy_conn_t *conn, int efd)
|
|||||||
return false;
|
return false;
|
||||||
conn->state = CONN_AVAILABLE;
|
conn->state = CONN_AVAILABLE;
|
||||||
}
|
}
|
||||||
return proxy_remote_conn_ack(conn) && !errn;
|
return proxy_remote_conn_ack(conn,get_so_error(conn->fd)) && !errn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1325,7 +1326,7 @@ int event_loop(int listen_fd)
|
|||||||
default: se=NULL;
|
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));
|
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,errn);
|
||||||
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);
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user