+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