Hi,

Attahced is a patch against libevent-1.3b for Cygwin - or cases where
getaddrinfo() and/or getnameinfo() are not present.

The patch addresses 3 issue :

1] compile error in test/regress_http.c when getaddrinfo() is not
present.  Changed this to use a similar workaround to the one already in
http.c.  Since this workaround is now used twice I dumped it in a
seperate header called fake_getaddrinfo.h

2] a runtime problem with fake_getaddrinfo - worked around by adding an
extra port argument to fake_getaddrinfo (not sure if this is the right
solution but it worked for me).

3] a runtime problem in cases where getnameinfo() in which we were
dropping out of name_from_addr() without doing anything and this was
casuing a segfault.

Colm
diff -Naur --exclude-from exclude libevent-1.3b_base/fake_getaddrinfo.h 
libevent-1.3b/fake_getaddrinfo.h
--- libevent-1.3b_base/fake_getaddrinfo.h       1970-01-01 00:00:00.000000000 
+0000
+++ libevent-1.3b/fake_getaddrinfo.h    2007-06-16 03:32:38.515625000 +0100
@@ -0,0 +1,42 @@
+
+struct addrinfo {
+       int ai_family;
+       int ai_socktype;
+       int ai_protocol;
+       size_t ai_addrlen;
+       struct sockaddr *ai_addr;
+       struct addrinfo *ai_next;
+};
+static int
+fake_getaddrinfo(const char *hostname, struct addrinfo *ai, in_port_t port)
+{
+       struct hostent *he;
+        struct in_addr **ap;
+        struct sockaddr_in *sa_in;
+
+       he = gethostbyname(hostname);
+       if (!he)
+               return (-1);
+       ai->ai_family = he->h_addrtype;
+       ai->ai_socktype = SOCK_STREAM;
+       ai->ai_protocol = 0;
+       //ai->ai_addrlen = he->h_length;
+       ai->ai_addrlen = sizeof(struct sockaddr_in);
+       if (NULL == (ai->ai_addr = malloc(ai->ai_addrlen)))
+               return (-1);
+
+        sa_in = (struct sockaddr_in *)ai->ai_addr;
+        memset(sa_in, 0, sizeof(struct sockaddr_in));
+        sa_in->sin_family = PF_INET;
+        sa_in->sin_port = htons(port);
+        ap = (struct in_addr **)he->h_addr_list;
+        memcpy(&sa_in->sin_addr, *ap, sizeof(struct in_addr));
+
+       ai->ai_next = NULL;
+       return (0);
+}
+static void
+fake_freeaddrinfo(struct addrinfo *ai)
+{
+       free(ai->ai_addr);
+}
diff -Naur --exclude-from exclude libevent-1.3b_base/http.c libevent-1.3b/http.c
--- libevent-1.3b_base/http.c   2007-03-04 04:05:04.000000000 +0000
+++ libevent-1.3b/http.c        2007-06-16 03:45:02.437500000 +0100
@@ -80,36 +80,7 @@
 #include "http-internal.h"
 
 #ifndef HAVE_GETADDRINFO
-struct addrinfo {
-       int ai_family;
-       int ai_socktype;
-       int ai_protocol;
-       size_t ai_addrlen;
-       struct sockaddr *ai_addr;
-       struct addrinfo *ai_next;
-};
-static int
-fake_getaddrinfo(const char *hostname, struct addrinfo *ai)
-{
-       struct hostent *he;
-       he = gethostbyname(hostname);
-       if (!he)
-               return (-1);
-       ai->ai_family = he->h_addrtype;
-       ai->ai_socktype = SOCK_STREAM;
-       ai->ai_protocol = 0;
-       ai->ai_addrlen = he->h_length;
-       if (NULL == (ai->ai_addr = malloc(ai->ai_addrlen)))
-               return (-1);
-       memcpy(ai->ai_addr, &he->h_addr_list[0], ai->ai_addrlen);
-       ai->ai_next = NULL;
-       return (0);
-}
-static void
-fake_freeaddrinfo(struct addrinfo *ai)
-{
-       free(ai->ai_addr);
-}
+#include "fake_getaddrinfo.h"
 #endif
 
 #ifndef MIN
@@ -2190,12 +2161,17 @@
                else
                        event_errx(1, "getnameinfo failed: %s", 
gai_strerror(ni_result));
        }
- 
-       *phost = ntop;
-       *pport = strport;
 #else
-       // XXXX
+       char ntop[1025];
+       char strport[32];
+       struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+
+       snprintf(strport, sizeof(strport), "%d", ntohs(sin->sin_port));
+       strcpy(ntop, inet_ntoa(sin->sin_addr));
 #endif
+
+       *phost = ntop;
+       *pport = strport;
 }
 
 /* Either connect or bind */
@@ -2279,7 +2255,8 @@
                return (-1);
         }
 #else
-       if (fake_getaddrinfo(address, &ai) < 0) {
+        memset(&ai, 0, sizeof (ai));
+       if (fake_getaddrinfo(address, &ai, port) < 0) {
                event_warn("fake_getaddrinfo");
                return (-1);
        }
diff -Naur --exclude-from exclude libevent-1.3b_base/test/regress_http.c 
libevent-1.3b/test/regress_http.c
--- libevent-1.3b_base/test/regress_http.c      2007-02-16 00:49:03.000000000 
+0000
+++ libevent-1.3b/test/regress_http.c   2007-06-16 03:32:33.765625000 +0100
@@ -44,6 +44,7 @@
 #include <sys/socket.h>
 #include <sys/signal.h>
 #include <unistd.h>
+#include <netinet/in.h>
 #endif
 #include <netdb.h>
 #include <fcntl.h>
@@ -57,6 +58,10 @@
 #include "log.h"
 #include "http-internal.h"
 
+#ifndef HAVE_GETADDRINFO
+#include "fake_getaddrinfo.h"
+#endif
+
 extern int pair[];
 extern int test_ok;
 
@@ -97,9 +102,10 @@
 {
        /* Stupid code for connecting */
        struct addrinfo ai, *aitop;
-       char strport[NI_MAXSERV];
        int fd;
-       
+
+#ifdef HAVE_GETADDRINFO
+       char strport[NI_MAXSERV];
        memset(&ai, 0, sizeof (ai));
        ai.ai_family = AF_INET;
        ai.ai_socktype = SOCK_STREAM;
@@ -108,6 +114,14 @@
                event_warn("getaddrinfo");
                return (-1);
        }
+#else
+        memset(&ai, 0, sizeof (ai));
+        if (fake_getaddrinfo(address, &ai, port) < 0) {
+                event_warn("fake_getaddrinfo");
+                return (-1);
+        }
+        aitop = &ai;
+#endif
         
        fd = socket(AF_INET, SOCK_STREAM, 0);
        if (fd == -1)
@@ -116,7 +130,11 @@
        if (connect(fd, aitop->ai_addr, aitop->ai_addrlen) == -1)
                event_err(1, "connect failed");
 
+#ifdef HAVE_GETADDRINFO
        freeaddrinfo(aitop);
+#else
+       fake_freeaddrinfo(aitop);
+#endif
 
        return (fd);
 }
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to