* Use gnulib.
[elisp/starttls.git] / starttls.c
index ba867f7..a3ddf94 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdbool.h>
 
 #include <unistd.h>
 
 #ifdef HAVE_POLL_H
 #include <sys/poll.h>
 #endif
-#define _GNU_SOURCE
 #include "getopt.h"
+#include "getaddrinfo.h"
+#include "gettext.h"
+#include "inet_ntop.h"
+#include "strdup.h"
 
-extern int tls_connect (const char *, const char *);
 extern void tls_negotiate (int, const char *, const char *);
 extern int tls_write(int, const char *, int);
 extern int tls_read(int, char *, int);
@@ -82,6 +85,41 @@ do_tls_negotiate(sig)
 }
 
 int
+tcp_connect (hostname, service)
+     const char *hostname, *service;
+{
+  int server, _false = 0;
+  struct addrinfo *in, *in0, hints;
+
+  memset (&hints, 0, sizeof (hints));
+  hints.ai_family = AF_UNSPEC;
+  hints.ai_socktype = SOCK_STREAM;
+  if (getaddrinfo (hostname, service, &hints, &in0))
+    return -1;
+
+  for (in = in0; in; in = in->ai_next)
+    {
+      server = socket (in->ai_family, in->ai_socktype, in->ai_protocol);
+      if (server < 0)
+       continue;
+      if (connect (server, in->ai_addr, in->ai_addrlen) < 0)
+       {
+         server = -1;
+         continue;
+       }
+      break;
+  }
+
+  if (server < 0)
+    return -1;
+
+  setsockopt (server, SOL_SOCKET, SO_KEEPALIVE, (const char *) &_false,
+             sizeof (_false));
+
+  return server;
+}
+
+int
 main (argc, argv) 
   int argc;
   char **argv;
@@ -120,21 +158,21 @@ main (argc, argv)
          opt_key_file = optarg;
          break;
        default:
-         usage (basename (argv[0]));
+         usage (argv[0]);
          return 1;
        }
     }
 
   if (optind+2 != argc)
     {
-      usage (basename (argv[0]));
+      usage (argv[0]);
       return 1;
     }
 
-  tls_fd = tls_connect (argv[optind], argv[optind+1]);
+  tls_fd = tcp_connect (argv[optind], argv[optind+1]);
   if (tls_fd < 0)
     {
-      perror ("tls_connect");
+      perror ("tcp_connect");
       return 1;
     }