#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
+#include <netinet/tcp.h>
#ifdef HAVE_NETINET_IP_VAR_H
# include <netinet/ip_var.h>
#ifndef CS
# define CS (char *)
+# define CCS (const char *)
#endif
#define udn 2 /* Unix domain socket number */
#define skn 2 /* Potential number of sockets */
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
{
int i;
int port = 0;
int count;
int on = 1;
int timeout = 5;
-int initial_pause = 0;
+int initial_pause = 0, tfo = 0;
int use_ipv4 = 1;
int use_ipv6 = 1;
int debug = 0;
"\n\t-noipv6 disable ipv6"
"\n\t-oP file write PID to file"
"\n\t-t n n seconds timeout"
+ "\n\t-tfo enable TCP Fast Open"
);
exit(0);
}
while (na < argc && argv[na][0] == '-')
{
if (strcmp(argv[na], "-d") == 0) debug = 1;
+ else if (strcmp(argv[na], "-tfo") == 0) tfo = 1;
else if (strcmp(argv[na], "-t") == 0)
{
if (tmo_noerror = ((timeout = atoi(argv[++na])) < 0)) timeout = -timeout;
if (initial_pause > 0)
{
if (debug)
- printf("%d: Inital pause of %d seconds\n", time(NULL), initial_pause);
+ printf("%ld: Inital pause of %d seconds\n", (long)time(NULL), initial_pause);
else
printf("Inital pause of %d seconds\n", initial_pause);
while (initial_pause > 0)
if (port == 0) /* Unix domain */
{
- if (debug) printf("%d: Creating Unix domain socket\n", time(NULL));
+ if (debug) printf("%ld: Creating Unix domain socket\n", (long) time(NULL));
listen_socket[udn] = socket(PF_UNIX, SOCK_STREAM, 0);
if (listen_socket[udn] < 0)
{
printf("IPv6 socket creation failed: %s\n", strerror(errno));
exit(1);
}
-
+#if defined(TCP_FASTOPEN) && !defined(__APPLE__)
+ if (tfo)
+ {
+ int backlog = 5;
+ if (setsockopt(listen_socket[v6n], IPPROTO_TCP, TCP_FASTOPEN,
+ &backlog, sizeof(backlog)))
+ if (debug) printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno));
+ }
+#endif
/* If this is an IPv6 wildcard socket, set IPV6_V6ONLY if that option is
available. */
printf("IPv4 socket creation failed: %s\n", strerror(errno));
exit(1);
}
+#if defined(TCP_FASTOPEN) && !defined(__APPLE__)
+ if (tfo)
+ {
+ int backlog = 5;
+ if (setsockopt(listen_socket[v4n], IPPROTO_TCP, TCP_FASTOPEN,
+ &backlog, sizeof(backlog)))
+ if (debug) printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno));
+ }
+#endif
}
}
sin6.sin6_addr = anyaddr6;
if (bind(listen_socket[i], (struct sockaddr *)&sin6, sizeof(sin6)) < 0)
{
- printf("IPv6 socket bind() failed: %s\n", strerror(errno));
+ printf("IPv6 socket bind(port %d) failed: %s\n", port, strerror(errno));
exit(1);
}
}
sin4.sin_addr.s_addr = (S_ADDR_TYPE)INADDR_ANY;
sin4.sin_port = htons(port);
if (bind(listen_socket[i], (struct sockaddr *)&sin4, sizeof(sin4)) < 0)
- {
if (listen_socket[v6n] < 0 || errno != EADDRINUSE)
{
- printf("IPv4 socket bind() failed: %s\n", strerror(errno));
+ printf("IPv4 socket bind(port %d) failed: %s\n", port, strerror(errno));
exit(1);
}
else
close(listen_socket[i]);
listen_socket[i] = -1;
}
- }
}
}
}
output anything, because it will mess up the test output, which will be
different for systems that do this and those that don't. */
-for (i = 0; i <= skn; i++)
+for (i = 0; i <= skn; i++) if (listen_socket[i] >= 0)
{
- if (listen_socket[i] >= 0 && listen(listen_socket[i], 5) < 0)
- {
+ if (listen(listen_socket[i], 5) < 0)
if (i != v4n || listen_socket[v6n] < 0 || errno != EADDRINUSE)
{
printf("listen() failed: %s\n", strerror(errno));
exit(1);
}
- }
+
+#if defined(TCP_FASTOPEN) && defined(__APPLE__)
+ if ( tfo
+ && setsockopt(listen_socket[v4n], IPPROTO_TCP, TCP_FASTOPEN, &on, sizeof(on))
+ && debug)
+ printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno));
+#endif
}
{ end = "\n"; ss += 3; len -= 3; }
fwrite(ss, 1, len, out);
- if (*end) fprintf(out, end);
+ if (*end) fputs(end, out);
}
else if (isdigit((unsigned char)ss[0]))
n = dlen < sizeof(buffer) ? dlen : sizeof(buffer);
if ((n = read(dup_accept_socket, CS buffer, n)) == 0)
{
- printf("Unxpected EOF read from client\n");
+ printf("Unexpected EOF read from client\n");
s = s->next;
goto END_OFF;
}
while (dlen-- > 0)
if (fgetc(in) == EOF)
{
- printf("Unxpected EOF read from client\n");
+ printf("Unexpected EOF read from client\n");
s = s->next;
goto END_OFF;
}
alarm(0);
n += offset;
- printit(buffer, n);
+ printit(CS buffer, n);
if (data) do
{
}
}
- if (sscanf(buffer, "<Content-length: %d", &content_length.left)) content_length.in_use = TRUE;
- if (content_length.in_use && content_length.left <= 0) shutdown(dup_accept_socket, SHUT_RD);
+ if (sscanf(CCS buffer, "<Content-length: %d", &content_length.left))
+ content_length.in_use = TRUE;
+ if (content_length.in_use && content_length.left <= 0)
+ shutdown(dup_accept_socket, SHUT_RD);
}
}