gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r5287 - libmicrohttpd/src/daemon


From: gnunet
Subject: [GNUnet-SVN] r5287 - libmicrohttpd/src/daemon
Date: Sun, 8 Jul 2007 23:20:21 -0600 (MDT)

Author: grothoff
Date: 2007-07-08 23:20:20 -0600 (Sun, 08 Jul 2007)
New Revision: 5287

Modified:
   libmicrohttpd/src/daemon/connection.c
   libmicrohttpd/src/daemon/daemon.c
   libmicrohttpd/src/daemon/daemontest_post.c
Log:
ipv6 support

Modified: libmicrohttpd/src/daemon/connection.c
===================================================================
--- libmicrohttpd/src/daemon/connection.c       2007-07-09 04:32:38 UTC (rev 
5286)
+++ libmicrohttpd/src/daemon/connection.c       2007-07-09 05:20:20 UTC (rev 
5287)
@@ -837,16 +837,18 @@
     connection->method = NULL;
     free(connection->url);
     connection->url = NULL;
-    free(connection->version);
-    connection->version = NULL;
     free(connection->write_buffer);
     connection->write_buffer = NULL;
     connection->write_buffer_size = 0;
-    if (connection->read_close != 0) {
+    if ( (connection->read_close != 0) ||
+        (0 != strcasecmp("HTTP/1.1",
+                         connection->version)) ) {
       /* closed for reading => close for good! */
       CLOSE(connection->socket_fd);
       connection->socket_fd = -1;
     }
+    free(connection->version);
+    connection->version = NULL;
   }
   return MHD_YES;
 }

Modified: libmicrohttpd/src/daemon/daemon.c
===================================================================
--- libmicrohttpd/src/daemon/daemon.c   2007-07-09 04:32:38 UTC (rev 5286)
+++ libmicrohttpd/src/daemon/daemon.c   2007-07-09 05:20:20 UTC (rev 5287)
@@ -209,16 +209,20 @@
 static int
 MHD_accept_connection(struct MHD_Daemon * daemon) {
   struct MHD_Connection * connection;
-  struct sockaddr addr;
+  struct sockaddr_in6 addr6;
+  struct sockaddr * addr = (struct sockaddr*) &addr6;
   socklen_t addrlen;
   int s;
 
-  addrlen = sizeof(struct sockaddr);
-  memset(&addr,
+
+  if (sizeof(struct sockaddr) > sizeof(struct sockaddr_in6))
+    abort(); /* fatal, serious error */
+  addrlen = sizeof(struct sockaddr_in6);
+  memset(addr,
         0,
-        sizeof(struct sockaddr));
+        sizeof(struct sockaddr_in6));
   s = ACCEPT(daemon->socket_fd,
-            &addr,
+            addr,
             &addrlen);
   if ( (s < 0) ||
        (addrlen <= 0) ) {
@@ -228,7 +232,7 @@
     return MHD_NO;
   }
   if (MHD_NO == daemon->apc(daemon->apc_cls,
-                           &addr,
+                           addr,
                            addrlen)) {
     CLOSE(s);
     return MHD_YES;
@@ -239,7 +243,7 @@
         sizeof(struct MHD_Connection));
   connection->addr = malloc(addrlen);
   memcpy(connection->addr,
-        &addr,
+        addr,
         addrlen);
   connection->addr_len = addrlen;
   connection->socket_fd = s;
@@ -463,18 +467,23 @@
                 MHD_AccessHandlerCallback dh,
                 void * dh_cls,
                 ...) {
+  const int on = 1;
   struct MHD_Daemon * retVal;
   int socket_fd;
-  struct sockaddr_in servaddr; 
-
+  struct sockaddr_in servaddr4;        
+  struct sockaddr_in6 servaddr6;       
+  const struct sockaddr * servaddr;
+  socklen_t addrlen;
+ 
   if ((options & MHD_USE_SSL) != 0)
     return NULL;
-  if ((options & MHD_USE_IPv6) != 0)
-    return NULL;
   if ( (port == 0) ||
        (dh == NULL) )
     return NULL;
-  socket_fd = SOCKET(AF_INET, SOCK_STREAM, 0);
+  if ((options & MHD_USE_IPv6) != 0)
+    socket_fd = SOCKET(PF_INET6, SOCK_STREAM, 0);
+  else
+    socket_fd = SOCKET(PF_INET, SOCK_STREAM, 0);
   if (socket_fd < 0) {
     if ((options & MHD_USE_DEBUG) != 0)
       fprintf(stderr,
@@ -482,15 +491,35 @@
              STRERROR(errno));
     return NULL;
   }
-  /* FIXME: setsockopt: SO_REUSEADDR? */
-  memset(&servaddr,
-        0,
-        sizeof(struct sockaddr_in));
-  servaddr.sin_family = AF_INET;
-  servaddr.sin_port = htons(port);
+  if ( (SETSOCKOPT(socket_fd,
+                  SOL_SOCKET,
+                  SO_REUSEADDR,
+                  &on,
+                  sizeof(on)) < 0) &&
+       (options & MHD_USE_DEBUG) != 0)
+    fprintf(stderr,
+           "setsockopt failed: %s\n",
+           STRERROR(errno));
+  if ((options & MHD_USE_IPv6) != 0) {
+    memset(&servaddr6,
+          0,
+          sizeof(struct sockaddr_in6));
+    servaddr6.sin6_family = AF_INET6;
+    servaddr6.sin6_port = htons(port);
+    servaddr = (struct sockaddr*) &servaddr6;
+    addrlen = sizeof(struct sockaddr_in6);
+  } else {
+    memset(&servaddr4,
+          0,
+          sizeof(struct sockaddr_in));
+    servaddr4.sin_family = AF_INET;
+    servaddr4.sin_port = htons(port);
+    servaddr = (struct sockaddr*) &servaddr4;
+    addrlen = sizeof(struct sockaddr_in);
+  }
   if (BIND(socket_fd,
-          (struct sockaddr *)&servaddr,
-          sizeof(struct sockaddr_in)) < 0) {
+          servaddr,
+          addrlen) < 0) {
     if ( (options & MHD_USE_DEBUG) != 0)
       fprintf(stderr,
              "Failed to bind to port %u: %s\n",

Modified: libmicrohttpd/src/daemon/daemontest_post.c
===================================================================
--- libmicrohttpd/src/daemon/daemontest_post.c  2007-07-09 04:32:38 UTC (rev 
5286)
+++ libmicrohttpd/src/daemon/daemontest_post.c  2007-07-09 05:20:20 UTC (rev 
5287)
@@ -402,7 +402,7 @@
     return 2;
   errorCount += testInternalPost();
   errorCount += testMultithreadedPost();
-  errorCount += testExternalPost();
+  errorCount += testExternalPost();  
   if (errorCount != 0)
     fprintf(stderr,
            "Error (code: %u)\n",





reply via email to

[Prev in Thread] Current Thread [Next in Thread]