diff options
Diffstat (limited to 'libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch')
-rw-r--r-- | libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch b/libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch new file mode 100644 index 000000000..5d0eb6a03 --- /dev/null +++ b/libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch @@ -0,0 +1,257 @@ +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"); |