aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tcp_input.c8
-rw-r--r--src/tcp_subr.c10
-rw-r--r--src/tcp_timer.c2
-rw-r--r--src/util.c32
4 files changed, 31 insertions, 21 deletions
diff --git a/src/tcp_input.c b/src/tcp_input.c
index 5f5701a..0fe0075 100644
--- a/src/tcp_input.c
+++ b/src/tcp_input.c
@@ -449,8 +449,8 @@ findso:
* Reset idle time and keep-alive timer.
*/
tp->t_idle = 0;
- if (slirp_do_keepalive)
- tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
+ if (tp->t_state < TCPS_ESTABLISHED)
+ tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
else
tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE;
@@ -1139,8 +1139,8 @@ findso:
* specification, but if we don't get a FIN
* we'll hang forever.
*/
- if (so->so_state & SS_FCANTRCVMORE) {
- tp->t_timer[TCPT_2MSL] = TCP_MAXIDLE;
+ if (so->so_state & (SS_FCANTRCVMORE | SS_NOFDREF)) {
+ tp->t_timer[TCPT_2MSL] = TCP_LINGERTIME;
}
tp->t_state = TCPS_FIN_WAIT_2;
}
diff --git a/src/tcp_subr.c b/src/tcp_subr.c
index c474a2d..8251c76 100644
--- a/src/tcp_subr.c
+++ b/src/tcp_subr.c
@@ -362,6 +362,16 @@ void tcp_sockclosed(struct tcpcb *tp)
case TCPS_CLOSE_WAIT:
tp->t_state = TCPS_LAST_ACK;
break;
+ case TCPS_FIN_WAIT_2:
+ /*
+ * If we can't receive any more
+ * data, then closing user can proceed.
+ * Starting the timer is contrary to the
+ * specification, but if we don't get a FIN
+ * we'll hang forever.
+ */
+ tp->t_timer[TCPT_2MSL] = TCP_LINGERTIME;
+ break;
}
tcp_output(tp);
}
diff --git a/src/tcp_timer.c b/src/tcp_timer.c
index aeb610f..1d4bcc1 100644
--- a/src/tcp_timer.c
+++ b/src/tcp_timer.c
@@ -126,7 +126,7 @@ static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer)
* control block. Otherwise, check again in a bit.
*/
case TCPT_2MSL:
- if (tp->t_state != TCPS_TIME_WAIT && tp->t_idle <= TCP_MAXIDLE)
+ if (tp->t_state != TCPS_TIME_WAIT && tp->t_idle <= TCP_LINGERTIME)
tp->t_timer[TCPT_2MSL] = TCPTV_KEEPINTVL;
else
tp = tcp_close(tp);
diff --git a/src/util.c b/src/util.c
index eb302fb..95d3219 100644
--- a/src/util.c
+++ b/src/util.c
@@ -252,7 +252,7 @@ int slirp_ioctlsocket_wrap(slirp_os_socket fd, int req, void *val)
{
int ret;
ret = ioctlsocket(fd, req, val);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -263,7 +263,7 @@ int slirp_closesocket_wrap(slirp_os_socket fd)
{
int ret;
ret = closesocket(fd);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -274,7 +274,7 @@ int slirp_connect_wrap(slirp_os_socket sockfd, const struct sockaddr *addr, int
{
int ret;
ret = connect(sockfd, addr, addrlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -285,7 +285,7 @@ int slirp_listen_wrap(slirp_os_socket sockfd, int backlog)
{
int ret;
ret = listen(sockfd, backlog);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -296,7 +296,7 @@ int slirp_bind_wrap(slirp_os_socket sockfd, const struct sockaddr *addr, int add
{
int ret;
ret = bind(sockfd, addr, addrlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -307,7 +307,7 @@ slirp_os_socket slirp_socket_wrap(int domain, int type, int protocol)
{
slirp_os_socket ret;
ret = socket(domain, type, protocol);
- if (ret < 0) {
+ if (ret == INVALID_SOCKET) {
errno = win32_socket_error();
}
return ret;
@@ -318,7 +318,7 @@ slirp_os_socket slirp_accept_wrap(slirp_os_socket sockfd, struct sockaddr *addr,
{
slirp_os_socket ret;
ret = accept(sockfd, addr, addrlen);
- if (ret < 0) {
+ if (ret == INVALID_SOCKET) {
errno = win32_socket_error();
}
return ret;
@@ -329,7 +329,7 @@ int slirp_shutdown_wrap(slirp_os_socket sockfd, int how)
{
int ret;
ret = shutdown(sockfd, how);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -341,7 +341,7 @@ int slirp_getsockopt_wrap(slirp_os_socket sockfd, int level, int optname, void *
{
int ret;
ret = getsockopt(sockfd, level, optname, optval, optlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -353,7 +353,7 @@ int slirp_setsockopt_wrap(slirp_os_socket sockfd, int level, int optname,
{
int ret;
ret = setsockopt(sockfd, level, optname, optval, optlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -364,7 +364,7 @@ int slirp_getpeername_wrap(slirp_os_socket sockfd, struct sockaddr *addr, int *a
{
int ret;
ret = getpeername(sockfd, addr, addrlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -375,7 +375,7 @@ int slirp_getsockname_wrap(slirp_os_socket sockfd, struct sockaddr *addr, int *a
{
int ret;
ret = getsockname(sockfd, addr, addrlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -387,7 +387,7 @@ slirp_ssize_t slirp_send_wrap(slirp_os_socket sockfd, const void *buf, size_t le
int ret;
ret = send(sockfd, buf, len, flags);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -399,7 +399,7 @@ slirp_ssize_t slirp_sendto_wrap(slirp_os_socket sockfd, const void *buf, size_t
{
int ret;
ret = sendto(sockfd, buf, len, flags, addr, addrlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -410,7 +410,7 @@ slirp_ssize_t slirp_recv_wrap(slirp_os_socket sockfd, void *buf, size_t len, int
{
int ret;
ret = recv(sockfd, buf, len, flags);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;
@@ -422,7 +422,7 @@ slirp_ssize_t slirp_recvfrom_wrap(slirp_os_socket sockfd, void *buf, size_t len,
{
int ret;
ret = recvfrom(sockfd, buf, len, flags, addr, addrlen);
- if (ret < 0) {
+ if (ret == SOCKET_ERROR) {
errno = win32_socket_error();
}
return ret;