common driver structs for routers
[exim.git] / test / src / server.c
index 719350c15b47237d64264f0986356891aa9d741a..8fda1d4b00ae62e27945898e0a1543669527ba79 100644 (file)
@@ -159,7 +159,8 @@ putchar('\n');
 #define udn 2    /* Unix domain socket number */
 #define skn 2    /* Potential number of sockets */
 
 #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 i;
 int port = 0;
@@ -267,7 +268,7 @@ if (na < argc) connection_count = atoi(argv[na]);
 if (initial_pause > 0)
   {
   if (debug)
 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)
   else
     printf("Inital pause of %d seconds\n", initial_pause);
   while (initial_pause > 0)
@@ -278,7 +279,7 @@ if (initial_pause > 0)
 
 if (port == 0)  /* Unix domain */
   {
 
 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)
     {
   listen_socket[udn] = socket(PF_UNIX, SOCK_STREAM, 0);
   if (listen_socket[udn] < 0)
     {
@@ -298,7 +299,7 @@ else
       printf("IPv6 socket creation failed: %s\n", strerror(errno));
       exit(1);
       }
       printf("IPv6 socket creation failed: %s\n", strerror(errno));
       exit(1);
       }
-#ifdef TCP_FASTOPEN
+#if defined(TCP_FASTOPEN) && !defined(__APPLE__)
     if (tfo)
       {
       int backlog = 5;
     if (tfo)
       {
       int backlog = 5;
@@ -330,7 +331,7 @@ else
       printf("IPv4 socket creation failed: %s\n", strerror(errno));
       exit(1);
       }
       printf("IPv4 socket creation failed: %s\n", strerror(errno));
       exit(1);
       }
-#ifdef TCP_FASTOPEN
+#if defined(TCP_FASTOPEN) && !defined(__APPLE__)
     if (tfo)
       {
       int backlog = 5;
     if (tfo)
       {
       int backlog = 5;
@@ -438,16 +439,21 @@ error because it means that the IPv6 socket will handle IPv4 connections. Don't
 output anything, because it will mess up the test output, which will be
 different for systems that do this and those that don't. */
 
 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 (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
   }
 
 
   }
 
 
@@ -519,6 +525,11 @@ s = script;
 
 for (count = 0; count < connection_count; count++)
   {
 
 for (count = 0; count < connection_count; count++)
   {
+  struct {
+    int left;
+    BOOL in_use;
+  } content_length = { 0, FALSE };
+
   alarm(timeout);
   if (port <= 0)
     {
   alarm(timeout);
   if (port <= 0)
     {
@@ -640,7 +651,7 @@ for (count = 0; count < connection_count; count++)
         { end = "\n"; ss += 3; len -= 3; }
 
       fwrite(ss, 1, len, out);
         { 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]))
       }
 
     else if (isdigit((unsigned char)ss[0]))
@@ -729,6 +740,7 @@ for (count = 0; count < connection_count; count++)
 
        alarm(timeout);
        n = read(dup_accept_socket, CS buffer+offset, s->len - offset);
 
        alarm(timeout);
        n = read(dup_accept_socket, CS buffer+offset, s->len - offset);
+       if (content_length.in_use) content_length.left -= n;
        if (n == 0)
          {
          printf("%sxpected EOF read from client\n",
        if (n == 0)
          {
          printf("%sxpected EOF read from client\n",
@@ -746,8 +758,9 @@ for (count = 0; count < connection_count; count++)
        if (data) do
          {
          n = (read(dup_accept_socket, &c, 1) == 1 && c == '.');
        if (data) do
          {
          n = (read(dup_accept_socket, &c, 1) == 1 && c == '.');
+         if (content_length.in_use) content_length.left--;
          while (c != '\n' && read(dup_accept_socket, &c, 1) == 1)
          while (c != '\n' && read(dup_accept_socket, &c, 1) == 1)
-           ;
+            if (content_length.in_use) content_length.left--;
          } while (!n);
        else if (memcmp(ss, buffer, n) != 0)
          {
          } while (!n);
        else if (memcmp(ss, buffer, n) != 0)
          {
@@ -770,7 +783,8 @@ for (count = 0; count < connection_count; count++)
            goto END_OFF;
            }
          alarm(0);
            goto END_OFF;
            }
          alarm(0);
-         n = (int)strlen(CS buffer);
+         n = strlen(CS buffer);
+         if (content_length.in_use) content_length.left -= (n - offset);
          while (n > 0 && isspace(buffer[n-1])) n--;
          buffer[n] = 0;
          printf("%s\n", buffer);
          while (n > 0 && isspace(buffer[n-1])) n--;
          buffer[n] = 0;
          printf("%s\n", buffer);
@@ -784,6 +798,11 @@ for (count = 0; count < connection_count; count++)
          break;
          }
        }
          break;
          }
        }
+
+       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);
       }
     }
 
       }
     }