* Makefile.am (starttls_SOURCES): Add gnutls.c if USE_GNUTLS
[elisp/starttls.git] / starttls.c
index ba867f7..2cf7ced 100644 (file)
@@ -49,7 +49,6 @@
 #define _GNU_SOURCE
 #include "getopt.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 +81,70 @@ do_tls_negotiate(sig)
 }
 
 int
+socket_connect (hostname, service)
+     const char *hostname, *service;
+{
+  int server, false = 0;
+#ifdef HAVE_ADDRINFO
+  struct addrinfo *in, *in0, hints;
+#else
+  struct hostent *host;
+  struct servent *serv;
+  struct sockaddr_in sin;
+#endif
+
+#ifdef HAVE_ADDRINFO
+  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;
+#else
+  memset (&sin, 0, sizeof (sin));
+  host = gethostbyname (hostname);
+  if (!host)
+    return -1;
+  memcpy (&sin.sin_addr, host->h_addr, host->h_length);
+  serv = getservbyname (service, "tcp");
+  if (serv)
+    sin.sin_port = serv->s_port;
+  else if (isdigit (service[0]))
+    sin.sin_port = htons (atoi (service));
+  sin.sin_family = AF_INET;
+  server = socket (sin.sin_family, SOCK_STREAM, 0);
+  if (server == -1)
+    return -1;
+
+  if (connect (server, (struct sockaddr *)&sin, sizeof (sin)) < 0)
+    {
+      close (server);
+      return -1;
+    }
+#endif
+
+  setsockopt (server, SOL_SOCKET, SO_KEEPALIVE, (const char *) &false,
+             sizeof (false));
+
+  return server;
+}
+
+int
 main (argc, argv) 
   int argc;
   char **argv;
@@ -131,10 +194,10 @@ main (argc, argv)
       return 1;
     }
 
-  tls_fd = tls_connect (argv[optind], argv[optind+1]);
+  tls_fd = socket_connect (argv[optind], argv[optind+1]);
   if (tls_fd < 0)
     {
-      perror ("tls_connect");
+      perror ("socket_connect");
       return 1;
     }