flm01/openwrt/packages/luci/libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch

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");