258 lines
8.1 KiB
Diff
258 lines
8.1 KiB
Diff
|
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 <sys/resource.h>
|
||
|
|
||
|
/* 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 <arpa/inet.h> /* inet_ntoa */
|
||
|
+#include <netinet/in.h>
|
||
|
|
||
|
/* 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");
|