Typo: PRE_PRERELEASE -> PCRE_PRERELEASE
[exim.git] / test / src / client.c
index ccd6f419cf6981733536337c66bb79e6fb75c095..58ab56d4ce40dd5801c8fff802c17f5ab668f7e0 100644 (file)
@@ -1,5 +1,3 @@
-/* $Cambridge: exim/test/src/client.c,v 1.2 2006/10/16 13:42:19 ph10 Exp $ */
-
 /* A little hacked up program that makes a TCP/IP call and reads a script to
 drive it, for testing Exim server code running as a daemon. It's got a bit
 messy with the addition of support for either OpenSSL or GnuTLS. The code for
@@ -363,13 +361,14 @@ return session;
 *                 Main Program                   *
 *************************************************/
 
-/* Usage: client
-          <IP address>
-          <port>
-          [<outgoing interface>]
-          [<cert file>]
-          [<key file>]
-*/
+const char * const HELP_MESSAGE = "\n\
+Usage: client\n\
+          <IP address>\n\
+          <port>\n\
+          [<outgoing interface>]\n\
+          [<cert file>]\n\
+          [<key file>]\n\
+\n";
 
 int main(int argc, char **argv)
 {
@@ -379,12 +378,14 @@ char *interface = NULL;
 char *address = NULL;
 char *certfile = NULL;
 char *keyfile = NULL;
+char *end = NULL;
 int argi = 1;
 int host_af, port, s_len, rc, sock, save_errno;
 int timeout = 1;
 int tls_active = 0;
 int sent_starttls = 0;
 int tls_on_connect = 0;
+long tmplong;
 
 #if HAVE_IPV6
 struct sockaddr_in6 s_in6;
@@ -405,6 +406,13 @@ unsigned char *inptr = inbuffer;
 
 while (argc >= argi + 1 && argv[argi][0] == '-')
   {
+  if (strcmp(argv[argi], "-help") == 0 ||
+      strcmp(argv[argi], "--help") == 0 ||
+      strcmp(argv[argi], "-h") == 0)
+    {
+    printf(HELP_MESSAGE);
+    exit(0);
+    }
   if (strcmp(argv[argi], "-tls-on-connect") == 0)
     {
     tls_on_connect = 1;
@@ -412,12 +420,30 @@ while (argc >= argi + 1 && argv[argi][0] == '-')
     }
   else if (argv[argi][1] == 't' && isdigit(argv[argi][2]))
     {
-    timeout = atoi(argv[argi]+1);
+    tmplong = strtol(argv[argi]+2, &end, 10);
+    if (end == argv[argi]+2 || *end)
+      {
+      fprintf(stderr, "Failed to parse seconds from option <%s>\n",
+        argv[argi]);
+      exit(1);
+      }
+    if (tmplong > 10000L)
+      {
+      fprintf(stderr, "Unreasonably long wait of %d seconds requested\n",
+        tmplong);
+      exit(1);
+      }
+    if (tmplong < 0L)
+      {
+      fprintf(stderr, "Timeout must not be negative (%d)\n", tmplong);
+      exit(1);
+      }
+    timeout = (int) tmplong;
     argi++;
     }
   else
     {
-    printf("Unrecognized option %s\n", argv[argi]);
+    fprintf(stderr, "Unrecognized option %s\n", argv[argi]);
     exit(1);
     }
   }
@@ -426,7 +452,7 @@ while (argc >= argi + 1 && argv[argi][0] == '-')
 
 if (argc < argi+1)
   {
-  printf("No IP address given\n");
+  fprintf(stderr, "No IP address given\n");
   exit(1);
   }
 
@@ -437,7 +463,7 @@ host_af = (strchr(address, ':') != NULL)? AF_INET6 : AF_INET;
 
 if (argc < argi+1)
   {
-  printf("No port number given\n");
+  fprintf(stderr, "No port number given\n");
   exit(1);
   }