* luci/sgi/webuci: fix boa IPv4 support, thanks Alina!
This commit is contained in:
parent
0942fcc70b
commit
8b55782ed8
3 changed files with 258 additions and 17 deletions
|
@ -36,7 +36,7 @@ $(BOA_DIR)/.configured: $(BOA_DIR)/.patched
|
|||
touch $@
|
||||
|
||||
boa-compile: $(BOA_DIR)/.configured
|
||||
$(MAKE) -C $(BOA_DIR)/src CC=$(CC) CFLAGS="$(CFLAGS) -DINET6 -DACCEPT_ON"
|
||||
$(MAKE) -C $(BOA_DIR)/src CC=$(CC) CFLAGS="$(CFLAGS) -DINET6 -DACCEPT_ON -DWHEN_DOES_THIS_APPLY"
|
||||
|
||||
%.o: %.c
|
||||
$(COMPILE) $(LUA_CFLAGS) -I$(BOA_DIR)/src $(FPIC) -c -o $@ $<
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
Index: boa-0.94.13/src/compat.h
|
||||
===================================================================
|
||||
--- boa-0.94.13.orig/src/compat.h 2002-07-23 17:50:29.000000000 +0200
|
||||
+++ boa-0.94.13/src/compat.h 2008-09-13 21:55:31.000000000 +0200
|
||||
@@ -70,8 +70,8 @@
|
||||
#endif
|
||||
|
||||
#ifdef INET6
|
||||
-#define SOCKADDR sockaddr_storage
|
||||
-#define S_FAMILY __s_family
|
||||
+#define SOCKADDR sockaddr_in6
|
||||
+#define S_FAMILY sin6_family
|
||||
#define SERVER_AF AF_INET6
|
||||
#else
|
||||
#define SOCKADDR sockaddr_in
|
||||
#define S_FAMILY sin_family
|
257
libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch
Normal file
257
libs/sgi-webuci/boa-patches/220-ipv6-vs-ipv4.patch
Normal file
|
@ -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");
|
Loading…
Reference in a new issue