#endif
if (server_socket == -1) {
save_errno = errno;
- dbprintf(_("stream_server: socket() failed: %s\n"),
+ g_debug(_("stream_server: socket() failed: %s"),
strerror(save_errno));
errno = save_errno;
return -1;
aclose(server_socket);
errno = EMFILE; /* out of range */
save_errno = errno;
- dbprintf(_("stream_server: socket out of range: %d\n"),
+ g_debug(_("stream_server: socket out of range: %d"),
server_socket);
errno = save_errno;
return -1;
r = setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR,
(void *)&on, (socklen_t_equiv)sizeof(on));
if (r < 0) {
- dbprintf(_("stream_server: setsockopt(SO_REUSEADDR) failed: %s\n"),
+ g_debug(_("stream_server: setsockopt(SO_REUSEADDR) failed: %s"),
strerror(errno));
}
#endif
if (bind_portrange(server_socket, &server, (in_port_t)portrange[0],
(in_port_t)portrange[1], "tcp") == 0)
goto out;
- dbprintf(_("stream_server: Could not bind to port in range: %d - %d.\n"),
+ g_debug(_("stream_server: Could not bind to port in range: %d - %d."),
portrange[0], portrange[1]);
} else {
socklen = SS_LEN(&server);
if (bind(server_socket, (struct sockaddr *)&server, socklen) == 0)
goto out;
- dbprintf(_("stream_server: Could not bind to any port: %s\n"),
+ g_debug(_("stream_server: Could not bind to any port: %s"),
strerror(errno));
}
if (retries >= BIND_CYCLE_RETRIES)
break;
- dbprintf(_("stream_server: Retrying entire range after 10 second delay.\n"));
+ g_debug(_("stream_server: Retrying entire range after 10 second delay."));
sleep(15);
}
save_errno = errno;
- dbprintf(_("stream_server: bind(in6addr_any) failed: %s\n"),
+ g_debug(_("stream_server: bind(in6addr_any) failed: %s"),
strerror(save_errno));
aclose(server_socket);
errno = save_errno;
len = SIZEOF(server);
if(getsockname(server_socket, (struct sockaddr *)&server, &len) == -1) {
save_errno = errno;
- dbprintf(_("stream_server: getsockname() failed: %s\n"),
+ g_debug(_("stream_server: getsockname() failed: %s"),
strerror(save_errno));
aclose(server_socket);
errno = save_errno;
(void *)&on, (socklen_t_equiv)sizeof(on));
if(r == -1) {
save_errno = errno;
- dbprintf(_("stream_server: setsockopt(SO_KEEPALIVE) failed: %s\n"),
+ g_debug(_("stream_server: setsockopt(SO_KEEPALIVE) failed: %s"),
strerror(save_errno));
aclose(server_socket);
errno = save_errno;
#endif
*portp = SU_GET_PORT(&server);
- dbprintf(_("stream_server: waiting for connection: %s\n"),
+ g_debug(_("stream_server: waiting for connection: %s"),
str_sockaddr(&server));
return server_socket;
}
result = resolve_hostname(hostname, SOCK_STREAM, &res, NULL);
if(result != 0) {
- dbprintf(_("resolve_hostname(%s): %s\n"), hostname, gai_strerror(result));
+ g_debug(_("resolve_hostname(%s): %s"), hostname, gai_strerror(result));
errno = EHOSTUNREACH;
return -1;
}
if(!res) {
- dbprintf(_("resolve_hostname(%s): no results\n"), hostname);
+ g_debug(_("resolve_hostname(%s): no results"), hostname);
errno = EHOSTUNREACH;
return -1;
}
if (client_socket > 0)
goto out;
- dbprintf(_("stream_client: Could not bind to port in range %d-%d.\n"),
+ g_debug(_("stream_client: Could not bind to port in range %d-%d."),
portrange[0], portrange[1]);
errno = save_errno;
static sockaddr_union addr;
static socklen_t_equiv addrlen;
+static gboolean
+stream_accept_prolong(
+ gpointer data)
+{
+ time_t *tp = data;
+ return time(NULL) <= *tp;
+}
+
int
stream_accept(
int server_socket,
size_t sendsize,
size_t recvsize)
{
- SELECT_ARG_TYPE readset;
- struct timeval tv;
- int nfound, connected_socket;
+ time_t timeout_time;
+ int connected_socket;
int save_errno;
- int ntries = 0;
in_port_t port;
assert(server_socket >= 0);
- do {
- ntries++;
- memset(&tv, 0, SIZEOF(tv));
- tv.tv_sec = timeout;
- memset(&readset, 0, SIZEOF(readset));
- FD_ZERO(&readset);
- FD_SET(server_socket, &readset);
- nfound = select(server_socket+1, &readset, NULL, NULL, &tv);
- if(nfound <= 0 || !FD_ISSET(server_socket, &readset)) {
- save_errno = errno;
- if(nfound < 0) {
- dbprintf(_("stream_accept: select() failed: %s\n"),
- strerror(save_errno));
- } else if(nfound == 0) {
- dbprintf(plural(_("stream_accept: timeout after %d second\n"),
- _("stream_accept: timeout after %d seconds\n"),
- timeout),
- timeout);
- errno = ETIMEDOUT;
- return -1;
- } else if (!FD_ISSET(server_socket, &readset)) {
- int i;
-
- for(i = 0; i < server_socket + 1; i++) {
- if(FD_ISSET(i, &readset)) {
- dbprintf(_("stream_accept: got fd %d instead of %d\n"),
- i,
- server_socket);
- }
- }
- save_errno = EBADF;
- }
- if (ntries > 5) {
- errno = save_errno;
- return -1;
- }
- }
- } while (nfound <= 0);
+ /* set the time we want to stop accepting */
+ timeout_time = time(NULL) + timeout;
while(1) {
addrlen = (socklen_t_equiv)sizeof(sockaddr_union);
- connected_socket = accept(server_socket,
+ connected_socket = interruptible_accept(server_socket,
(struct sockaddr *)&addr,
- &addrlen);
+ &addrlen, stream_accept_prolong,
+ &timeout_time);
if(connected_socket < 0) {
+ if (errno == 0) {
+ g_debug(plural(_("stream_accept: timeout after %d second"),
+ _("stream_accept: timeout after %d seconds"),
+ timeout),
+ timeout);
+ errno = ETIMEDOUT;
+ return -1;
+ }
break;
}
- dbprintf(_("stream_accept: connection from %s\n"),
+ g_debug(_("stream_accept: connection from %s"),
str_sockaddr(&addr));
/*
* Make certain we got an inet connection and that it is not
try_socksize(connected_socket, SO_RCVBUF, recvsize);
return connected_socket;
} else {
- dbprintf(_("remote port is %u: ignored\n"),
+ g_debug(_("remote port is %u: ignored"),
(unsigned int)port);
}
} else {
#ifdef WORKING_IPV6
- dbprintf(_("family is %d instead of %d(AF_INET)"
- " or %d(AF_INET6): ignored\n"),
+ g_debug(_("family is %d instead of %d(AF_INET)"
+ " or %d(AF_INET6): ignored"),
SU_GET_FAMILY(&addr),
AF_INET, AF_INET6);
#else
- dbprintf(_("family is %d instead of %d(AF_INET)"
- ": ignored\n"),
+ g_debug(_("family is %d instead of %d(AF_INET)"
+ ": ignored"),
SU_GET_FAMILY(&addr),
AF_INET);
#endif
}
save_errno = errno;
- dbprintf(_("stream_accept: accept() failed: %s\n"),
+ g_debug(_("stream_accept: accept() failed: %s"),
strerror(save_errno));
errno = save_errno;
return -1;
isize -= 1024;
}
if(isize > 1024) {
- dbprintf(_("try_socksize: %s buffer size is %d\n"),
+ g_debug(_("try_socksize: %s buffer size is %d"),
(which == SO_SNDBUF) ? _("send") : _("receive"),
isize);
} else {
- dbprintf(_("try_socksize: could not allocate %s buffer of %zu\n"),
+ g_debug(_("try_socksize: could not allocate %s buffer of %zu"),
(which == SO_SNDBUF) ? _("send") : _("receive"),
origsize);
}