diff -urN boa-0.94.13.orig/src/boa.c boa-0.94.13/src/boa.c --- boa-0.94.13.orig/src/boa.c 2008-10-28 16:15:45.000000000 +0100 +++ boa-0.94.13/src/boa.c 2008-10-28 15:56:27.000000000 +0100 @@ -27,6 +27,12 @@ #include /* globals */ + +#ifdef INET6 +int server_addr_family; +socklen_t server_addr_len; +#endif + int backlog = SO_MAXCONN; time_t start_time; @@ -164,14 +170,36 @@ return 0; } +#ifdef INET6 +sa_family_t *get_addr_family(struct sockaddr *address) +{ + if(server_addr_family == AF_INET6) { + return &(((struct sockaddr_in6 *) address)->sin6_family); + } + + return &(((struct sockaddr_in *) address)->sin_family); +} +#endif + static int create_server_socket(void) { int server_s; - server_s = socket(SERVER_AF, SOCK_STREAM, IPPROTO_TCP); +#ifdef INET6 + server_addr_family = AF_INET6; + server_addr_len = sizeof(struct sockaddr_in6); + server_s = socket(server_addr_family, SOCK_STREAM, IPPROTO_TCP); if (server_s == -1) { - DIE("unable to create socket"); + server_addr_family = AF_INET; + server_addr_len = sizeof(struct sockaddr_in); +#endif + server_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (server_s == -1) { + DIE("unable to create socket"); + } +#ifdef INET6 } +#endif /* server socket is nonblocking */ if (set_nonblock_fd(server_s) == -1) { diff -urN boa-0.94.13.orig/src/boa.h boa-0.94.13/src/boa.h --- boa-0.94.13.orig/src/boa.h 2008-10-28 16:15:58.000000000 +0100 +++ boa-0.94.13/src/boa.h 2008-10-28 14:45:52.000000000 +0100 @@ -199,4 +199,12 @@ int plugin_handle(request * req); struct httpd_plugin *plugin_lookup(request *req); +/* IPv6 */ + +#ifdef INET6 +extern int server_addr_family; +extern socklen_t server_addr_len; +sa_family_t *get_addr_family(struct sockaddr *address); +#endif + #endif diff -urN boa-0.94.13.orig/src/compat.h boa-0.94.13/src/compat.h --- boa-0.94.13.orig/src/compat.h 2002-06-06 07:02:28.000000000 +0200 +++ boa-0.94.13/src/compat.h 2008-10-28 15:31:16.000000000 +0100 @@ -71,11 +71,13 @@ #ifdef INET6 #define SOCKADDR sockaddr_storage -#define S_FAMILY __s_family -#define SERVER_AF AF_INET6 +#define SOCKADDR_LEN server_addr_len +#define S_FAMILY(address) (*get_addr_family((struct sockaddr *) (address))) +#define SERVER_AF server_addr_family #else #define SOCKADDR sockaddr_in -#define S_FAMILY sin_family +#define SOCKADDR_LEN sizeof(struct sockaddr_in) +#define S_FAMILY(address) ((*address).sin_family) #define SERVER_AF AF_INET #endif diff -urN boa-0.94.13.orig/src/ip.c boa-0.94.13/src/ip.c --- boa-0.94.13.orig/src/ip.c 2002-01-21 03:19:16.000000000 +0100 +++ boa-0.94.13/src/ip.c 2008-10-28 15:52:05.000000000 +0100 @@ -44,52 +44,64 @@ #include "boa.h" #include /* inet_ntoa */ +#include /* Binds to the existing server_s, based on the configuration string in server_ip. IPv6 version doesn't pay attention to server_ip yet. */ int bind_server(int server_s, char *server_ip) { + struct sockaddr *server_sockaddr; + struct sockaddr_in server_sockaddr4; + #ifdef INET6 - struct sockaddr_in6 server_sockaddr; - server_sockaddr.sin6_family = AF_INET6; - memcpy(&server_sockaddr.sin6_addr, &in6addr_any, sizeof (in6addr_any)); - server_sockaddr.sin6_port = htons(server_port); -#else - struct sockaddr_in server_sockaddr; - memset(&server_sockaddr, 0, sizeof server_sockaddr); + struct sockaddr_in6 server_sockaddr6; + if(SERVER_AF == AF_INET6) { + server_sockaddr6.sin6_family = AF_INET6; + memcpy(&server_sockaddr6.sin6_addr, &in6addr_any, sizeof (in6addr_any)); + server_sockaddr6.sin6_port = htons(server_port); + server_sockaddr = (struct sockaddr *) &server_sockaddr6; + } else { +#endif + memset(&server_sockaddr4, 0, SOCKADDR_LEN); #ifdef HAVE_SIN_LEN /* uncomment for BSDs */ - server_sockaddr.sin_len = sizeof server_sockaddr; + server_sockaddr4.sin_len = SOCKADDR_LEN; #endif - server_sockaddr.sin_family = AF_INET; - if (server_ip != NULL) { - inet_aton(server_ip, &server_sockaddr.sin_addr); - } else { - server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); + server_sockaddr4.sin_family = AF_INET; + if (server_ip != NULL) { + inet_aton(server_ip, &server_sockaddr4.sin_addr); + } else { + server_sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY); + } + server_sockaddr4.sin_port = htons(server_port); + server_sockaddr = (struct sockaddr *) &server_sockaddr4; +#ifdef INET6 } - server_sockaddr.sin_port = htons(server_port); #endif - return bind(server_s, (struct sockaddr *) &server_sockaddr, - sizeof (server_sockaddr)); + return bind(server_s, server_sockaddr, SOCKADDR_LEN); } char *ascii_sockaddr(struct SOCKADDR *s, char *dest, int len) { #ifdef INET6 - if (getnameinfo((struct sockaddr *) s, - sizeof(struct SOCKADDR), - dest, len, NULL, 0, NI_NUMERICHOST)) { - fprintf(stderr, "[IPv6] getnameinfo failed\n"); - *dest = '\0'; - } + if(SERVER_AF == AF_INET6) { + if (getnameinfo((struct sockaddr *) s, + SOCKADDR_LEN, + dest, len, NULL, 0, NI_NUMERICHOST)) { + fprintf(stderr, "[IPv6] getnameinfo failed\n"); + *dest = '\0'; + } #ifdef WHEN_DOES_THIS_APPLY - if ((s->__ss_family == AF_INET6) && - IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *) s)->sin6_addr))) { - memmove(dest, dest+7, NI_MAXHOST); - } + if (((((struct sockaddr_in6 *) s)->sin6_family) == AF_INET6) && + IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *) s)->sin6_addr))) { + memmove(dest, dest+7, NI_MAXHOST); + } #endif -#else - memmove(dest, inet_ntoa(s->sin_addr), len); + } else { +#endif + memmove(dest, inet_ntoa(((struct sockaddr_in *) s)->sin_addr), len); +#ifdef INET6 + } #endif return dest; } @@ -98,17 +110,21 @@ { int p = -1; #ifdef INET6 - char serv[NI_MAXSERV]; + if(SERVER_AF == AF_INET6) { + char serv[NI_MAXSERV]; - if (getnameinfo((struct sockaddr *) s, - sizeof(struct SOCKADDR), - NULL, 0, serv, sizeof(serv), NI_NUMERICSERV)) { - fprintf(stderr, "[IPv6] getnameinfo failed\n"); + if (getnameinfo((struct sockaddr *) s, + SOCKADDR_LEN, + NULL, 0, serv, sizeof(serv), NI_NUMERICSERV)) { + fprintf(stderr, "[IPv6] getnameinfo failed\n"); + } else { + p = atoi(serv); + } } else { - p = atoi(serv); +#endif + p = ntohs(((struct sockaddr_in *) s)->sin_port); +#ifdef INET6 } -#else - p = ntohs(s->sin_port); #endif return p; } diff -urN boa-0.94.13.orig/src/mmap_cache.c boa-0.94.13/src/mmap_cache.c --- boa-0.94.13.orig/src/mmap_cache.c 2002-03-24 23:35:34.000000000 +0100 +++ boa-0.94.13/src/mmap_cache.c 2008-10-28 14:55:16.000000000 +0100 @@ -67,7 +67,7 @@ m = mmap(0, s->st_size, PROT_READ, MAP_OPTIONS, data_fd, 0); - if ((int) m == -1) { + if ((ssize_t) m == -1) { /* boa_perror(req,"mmap"); */ return NULL; } diff -urN boa-0.94.13.orig/src/request.c boa-0.94.13/src/request.c --- boa-0.94.13.orig/src/request.c 2008-10-28 16:16:03.000000000 +0100 +++ boa-0.94.13/src/request.c 2008-10-28 15:17:20.000000000 +0100 @@ -75,12 +75,12 @@ int fd; /* socket */ struct SOCKADDR remote_addr; /* address */ struct SOCKADDR salocal; - int remote_addrlen = sizeof (struct SOCKADDR); + int remote_addrlen = SOCKADDR_LEN; request *conn; /* connection */ - size_t len; + socklen_t len; static int system_bufsize = 0; /* Default size of SNDBUF given by system */ - remote_addr.S_FAMILY = 0xdead; + S_FAMILY(&remote_addr) = 0xdead; fd = accept(server_s, (struct sockaddr *) &remote_addr, &remote_addrlen); @@ -133,7 +133,7 @@ } #endif - len = sizeof(salocal); + len = SOCKADDR_LEN; if (getsockname(fd, (struct sockaddr *) &salocal, &len) != 0) { WARN("getsockname");