* addrinfo.h: Removed and gave up to emulate getaddrinfo(3). Thus
[elisp/starttls.git] / starttls.c
index 99ba293..3666177 100644 (file)
 #include <openssl/x509.h>
 #include <openssl/ssl.h>
 
-#ifdef NEED_ADDRINFO_H
-#include "addrinfo.h"
-#endif
-
 #include <sys/time.h>
 #include <sys/socket.h>
 #include <sys/file.h>
@@ -135,13 +131,22 @@ tls_connect (hostname, service)
      const char *hostname, *service;
 {
   struct protoent *proto;
+  int server, false = 0, family, socktype;
+  struct sockaddr *addr;
+  struct sockaddr_in sin;
+  socklen_t addrlen;
+#ifdef HAVE_ADDRINFO
   struct addrinfo *in, hints;
-  int server, false = 0;
+#else
+  struct hostent *host;
+  struct servent serv;
+#endif
 
   proto = getprotobyname ("tcp");
   if (!proto)
     return -1;
 
+#ifdef HAVE_ADDRINFO
   memset (&hints, 0, sizeof (hints));
   hints.ai_family = AF_UNSPEC;
   hints.ai_socktype = SOCK_STREAM;
@@ -150,15 +155,36 @@ tls_connect (hostname, service)
   if (getaddrinfo (hostname, service, &hints, &in) < 0) 
     return -1;
 
-  server = socket (in->ai_family, in->ai_socktype, 0);
-  if (server < 0)
+  family = in->ai_family;
+  socktype = in->ai_socktype;
+  addr = in->ai_addr;
+  addrlen = in->ai_addrlen;
+  freeaddrinfo (in);
+#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, proto->p_name);
+  if (serv)
+    sin.sin_port = htons (serv->s_port);
+  else if (isdigit (service[0]))
+    sin.sin_port = htons (atoi (service));
+  family = sin.sin_family = AF_INET;
+  socktype = SOCK_STREAM;
+  addr = (struct sockaddr *)&sin;
+  addrlen = sizeof (sin);
+#endif
 
-  if (setsockopt (server, SOL_SOCKET, SO_KEEPALIVE,
-                 (const char *) &false, sizeof (false))) 
+  server = socket (family, socktype, 0);
+  if (server == -1)
     return -1;
 
-  if (connect (server, in->ai_addr, in->ai_addrlen) < 0)
+  setsockopt (server, SOL_SOCKET, SO_KEEPALIVE, (const char *) &false,
+             sizeof (false));
+
+  if (connect (server, addr, addrlen) < 0)
     {
       close (server);
       return -1;