]> andersk Git - moira.git/blobdiff - lib/mr_connect.c
Punt on the "NONE" stuff; the TNS folks decided they liked empty fields more.
[moira.git] / lib / mr_connect.c
index 5077a5ce6d58d037be6ff2b474b228166f2b85c4..526a63fa6a1ae1af5602ff7e78d4085b8bc76498 100644 (file)
 
 #ifdef HAVE_HESIOD
 #include <hesiod.h>
+#ifdef _WIN32
+/* This is declared in wshelper's resolv.h, but the definition of
+ * the putlong macro conflicts with Moira's
+ */
+struct hostent * WINAPI rgethostbyname(char *name);
+#endif
 #endif
 
 RCSID("$Header$");
@@ -140,8 +146,13 @@ int mr_connect_internal(char *server, char *port)
   char *host = NULL;
   int fd = SOCKET_ERROR;
   int ok = 0;
+  int on = 1; /* Value variable for setsockopt() */
 
+#if defined(_WIN32) && defined(HAVE_HESIOD)
+  shost = rgethostbyname(server);
+#else
   shost = gethostbyname(server);
+#endif
   if (!shost)
     goto cleanup;
 
@@ -177,6 +188,9 @@ int mr_connect_internal(char *server, char *port)
   if (fd < 0)
     goto cleanup;
 
+  if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(int)) < 0)
+    goto cleanup;
+
   if (connect(fd, (struct sockaddr *)&target, sizeof(target)) < 0)
     goto cleanup;
 
@@ -259,6 +273,7 @@ int mr_listen(char *port)
   int s, on = 1;
 
   memset(&sin, 0, sizeof(sin));
+  sin.sin_family = AF_INET;
   if (port[0] == '#')
     sin.sin_port = atoi(port + 1);
   else
@@ -268,9 +283,19 @@ int mr_listen(char *port)
       if (s)
        sin.sin_port = s->s_port;
       else
+#ifndef HAVE_HESIOD
        return -1;
+#else
+      {
+        s = hes_getservbyname(port, "tcp");
+       if (s)
+         sin.sin_port = s->s_port;
+       else
+         return -1;
+      }
+#endif /* HAVE_HESIOD */
     }
-
+  
   s = socket(AF_INET, SOCK_STREAM, 0);
   if (s < 0)
     return -1;
This page took 0.117153 seconds and 4 git commands to generate.