Christian Grothoff 17 years ago
parent
commit
1e1ddd66fb
4 changed files with 53 additions and 5 deletions
  1. 1 0
      AUTHORS
  2. 4 0
      ChangeLog
  3. 21 1
      configure.ac
  4. 27 4
      src/daemon/daemon.c

+ 1 - 0
AUTHORS

@@ -12,6 +12,7 @@ Heikki Lindholm <[email protected]>
 Alex Sadovsky <[email protected]>
 Greg Schohn <[email protected]>
 Thomas Martin <[email protected]>
+Peter Ross <[email protected]>
 RuXu W <[email protected]>
 
 Documentation contributions also came from:

+ 4 - 0
ChangeLog

@@ -1,3 +1,7 @@
+Tue Sep 30 16:48:08 MDT 2008
+	 Make MHD useful to Cygwin users; detect IPv6 headers
+	 in configure.
+
 Sun Sep 28 14:57:46 MDT 2008
 	 Unescape URIs (convert "%ef%e4%45" to "$BCf9q(B").
 

+ 21 - 1
configure.ac

@@ -104,7 +104,6 @@ netbsd*)
      ;;
 *cygwin*)
      AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a Cygwin system])
-     AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
      AM_CONDITIONAL(HAVE_GNU_LD, false)    
      LDFLAGS="$LDFLAGS -no-undefined"
      ;;
@@ -140,6 +139,27 @@ AC_CHECK_HEADERS([fcntl.h math.h errno.h limits.h stdio.h locale.h sys/stat.h sy
 # Check for optional headers
 AC_CHECK_HEADERS([sys/select.h sys/types.h sys/time.h sys/msg.h netdb.h netinet/in.h time.h sys/socket.h sys/mman.h arpa/inet.h])
 
+# IPv6
+AC_MSG_CHECKING(for IPv6)
+AC_TRY_COMPILE([
+#if HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+],[
+int af=AF_INET6;
+int pf=PF_INET6;
+struct sockaddr_in6 sa;
+],[
+have_inet6=yes;
+AC_DEFINE([HAVE_INET6], [1], [Provides IPv6 headers])
+],
+have_inet6=no
+)
+AC_MSG_RESULT($have_inet6)
+
 # libcurl (required for testing)
 SAVE_LIBS=$LIBS
 LIBCURL_CHECK_CONFIG(,,curl=1,curl=0)

+ 27 - 4
src/daemon/daemon.c

@@ -341,8 +341,12 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
 {
   struct MHD_Connection *pos;
   struct MHD_Connection *connection;
-  struct sockaddr_in6 addr6;
-  struct sockaddr *addr = (struct sockaddr *) &addr6;
+#if HAVE_INET6
+  struct sockaddr_in6 addrstorage;
+#else
+  struct sockaddr_in addrstorage;
+#endif
+  struct sockaddr *addr = (struct sockaddr *) &addrstorage;
   socklen_t addrlen;
   unsigned int have;
   int s, res_thread_create;
@@ -350,10 +354,12 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
   static int on = 1;
 #endif
 
+#if HAVE_INET6
   if (sizeof (struct sockaddr) > sizeof (struct sockaddr_in6))
     abort ();                   /* fatal, serious error */
-  addrlen = sizeof (struct sockaddr_in6);
-  memset (addr, 0, sizeof (struct sockaddr_in6));
+#endif
+  addrlen = sizeof (addrstorage);
+  memset (addr, 0, sizeof (addrstorage));
 
   s = ACCEPT (daemon->socket_fd, addr, &addrlen);
 
@@ -393,6 +399,7 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
                                    sizeof (struct in_addr)))
                     have++;
                 }
+#if HAVE_INET6
               if (addrlen == sizeof (struct sockaddr_in6))
                 {
                   const struct sockaddr_in6 *a1 =
@@ -403,6 +410,7 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
                                    sizeof (struct in6_addr)))
                     have++;
                 }
+#endif
             }
           pos = pos->next;
         }
@@ -826,7 +834,9 @@ MHD_start_daemon_va (unsigned int options,
   struct MHD_Daemon *retVal;
   int socket_fd;
   struct sockaddr_in servaddr4;
+#if HAVE_INET6
   struct sockaddr_in6 servaddr6;
+#endif
   const struct sockaddr *servaddr = NULL;
   socklen_t addrlen;
   enum MHD_OPTION opt;
@@ -931,7 +941,16 @@ MHD_start_daemon_va (unsigned int options,
     }
 
   if ((options & MHD_USE_IPv6) != 0)
+#if HAVE_INET6
     socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0);
+#else
+    {
+#if HAVE_MESSAGES
+        FPRINTF (stderr, "AF_INET6 not supported\n");
+#endif
+        return NULL;
+    }
+#endif
   else
     socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0);
   if (socket_fd < 0)
@@ -954,12 +973,15 @@ MHD_start_daemon_va (unsigned int options,
     }
 
   /* check for user supplied sockaddr */
+#if HAVE_INET6
   if ((options & MHD_USE_IPv6) != 0)
     addrlen = sizeof (struct sockaddr_in6);
   else
+#endif
     addrlen = sizeof (struct sockaddr_in);
   if (NULL == servaddr)
     {
+#if HAVE_INET6
       if ((options & MHD_USE_IPv6) != 0)
         {
           memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
@@ -968,6 +990,7 @@ MHD_start_daemon_va (unsigned int options,
           servaddr = (struct sockaddr *) &servaddr6;
         }
       else
+#endif
         {
           memset (&servaddr4, 0, sizeof (struct sockaddr_in));
           servaddr4.sin_family = AF_INET;