#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>
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;
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;