commit 2a85058539eef04393603379a11f6ce6d940866a
parent 1ffad3105c9891c514fb332a4dad9453af6e5488
Author: Christian Grothoff <christian@grothoff.org>
Date: Mon, 9 Jul 2007 05:20:20 +0000
ipv6 support
Diffstat:
3 files changed, 55 insertions(+), 24 deletions(-)
diff --git a/src/daemon/connection.c b/src/daemon/connection.c
@@ -837,16 +837,18 @@ MHD_connection_handle_write(struct MHD_Connection * connection) {
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;
}
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c
@@ -209,16 +209,20 @@ MHD_handle_connection(void * data) {
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 @@ MHD_accept_connection(struct MHD_Daemon * daemon) {
return MHD_NO;
}
if (MHD_NO == daemon->apc(daemon->apc_cls,
- &addr,
+ addr,
addrlen)) {
CLOSE(s);
return MHD_YES;
@@ -239,7 +243,7 @@ MHD_accept_connection(struct MHD_Daemon * daemon) {
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_start_daemon(unsigned int options,
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 @@ MHD_start_daemon(unsigned int options,
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",
diff --git a/src/daemon/daemontest_post.c b/src/daemon/daemontest_post.c
@@ -402,7 +402,7 @@ int main(int argc,
return 2;
errorCount += testInternalPost();
errorCount += testMultithreadedPost();
- errorCount += testExternalPost();
+ errorCount += testExternalPost();
if (errorCount != 0)
fprintf(stderr,
"Error (code: %u)\n",