5d0eb6a037acdbf9705b658d5c8d69b9e79fefa2
[project/luci.git] / libs / sgi-webuci / boa-patches / 220-ipv6-vs-ipv4.patch
1 diff -urN boa-0.94.13.orig/src/boa.c boa-0.94.13/src/boa.c
2 --- boa-0.94.13.orig/src/boa.c  2008-10-28 16:15:45.000000000 +0100
3 +++ boa-0.94.13/src/boa.c       2008-10-28 15:56:27.000000000 +0100
4 @@ -27,6 +27,12 @@
5  #include <sys/resource.h>
6  
7  /* globals */
8 +
9 +#ifdef INET6
10 +int server_addr_family;
11 +socklen_t server_addr_len;
12 +#endif
13 +
14  int backlog = SO_MAXCONN;
15  time_t start_time;
16  
17 @@ -164,14 +170,36 @@
18      return 0;
19  }
20  
21 +#ifdef INET6
22 +sa_family_t *get_addr_family(struct sockaddr *address)
23 +{
24 +    if(server_addr_family == AF_INET6) {
25 +        return &(((struct sockaddr_in6 *) address)->sin6_family);
26 +    }
27 +
28 +    return &(((struct sockaddr_in *) address)->sin_family);
29 +}
30 +#endif
31 +
32  static int create_server_socket(void)
33  {
34      int server_s;
35  
36 -    server_s = socket(SERVER_AF, SOCK_STREAM, IPPROTO_TCP);
37 +#ifdef INET6
38 +    server_addr_family = AF_INET6;
39 +    server_addr_len = sizeof(struct sockaddr_in6);
40 +    server_s = socket(server_addr_family, SOCK_STREAM, IPPROTO_TCP);
41      if (server_s == -1) {
42 -        DIE("unable to create socket");
43 +        server_addr_family = AF_INET;
44 +        server_addr_len = sizeof(struct sockaddr_in);
45 +#endif
46 +        server_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
47 +        if (server_s == -1) {
48 +            DIE("unable to create socket");
49 +        }
50 +#ifdef INET6
51      }
52 +#endif
53  
54      /* server socket is nonblocking */
55      if (set_nonblock_fd(server_s) == -1) {
56 diff -urN boa-0.94.13.orig/src/boa.h boa-0.94.13/src/boa.h
57 --- boa-0.94.13.orig/src/boa.h  2008-10-28 16:15:58.000000000 +0100
58 +++ boa-0.94.13/src/boa.h       2008-10-28 14:45:52.000000000 +0100
59 @@ -199,4 +199,12 @@
60  int plugin_handle(request * req);
61  struct httpd_plugin *plugin_lookup(request *req);
62  
63 +/* IPv6 */
64 +
65 +#ifdef INET6
66 +extern int server_addr_family;
67 +extern socklen_t server_addr_len;
68 +sa_family_t *get_addr_family(struct sockaddr *address);
69 +#endif
70 +
71  #endif
72 diff -urN boa-0.94.13.orig/src/compat.h boa-0.94.13/src/compat.h
73 --- boa-0.94.13.orig/src/compat.h       2002-06-06 07:02:28.000000000 +0200
74 +++ boa-0.94.13/src/compat.h    2008-10-28 15:31:16.000000000 +0100
75 @@ -71,11 +71,13 @@
76  
77  #ifdef INET6
78  #define SOCKADDR sockaddr_storage
79 -#define S_FAMILY __s_family
80 -#define SERVER_AF AF_INET6
81 +#define SOCKADDR_LEN server_addr_len
82 +#define S_FAMILY(address) (*get_addr_family((struct sockaddr *) (address)))
83 +#define SERVER_AF server_addr_family
84  #else
85  #define SOCKADDR sockaddr_in
86 -#define S_FAMILY sin_family
87 +#define SOCKADDR_LEN sizeof(struct sockaddr_in)
88 +#define S_FAMILY(address) ((*address).sin_family)
89  #define SERVER_AF AF_INET
90  #endif
91  
92 diff -urN boa-0.94.13.orig/src/ip.c boa-0.94.13/src/ip.c
93 --- boa-0.94.13.orig/src/ip.c   2002-01-21 03:19:16.000000000 +0100
94 +++ boa-0.94.13/src/ip.c        2008-10-28 15:52:05.000000000 +0100
95 @@ -44,52 +44,64 @@
96  
97  #include "boa.h"
98  #include <arpa/inet.h>          /* inet_ntoa */
99 +#include <netinet/in.h>
100  
101  /* Binds to the existing server_s, based on the configuration string
102     in server_ip.  IPv6 version doesn't pay attention to server_ip yet.  */
103  int bind_server(int server_s, char *server_ip)
104  {
105 +       struct sockaddr *server_sockaddr;
106 +    struct sockaddr_in server_sockaddr4;
107 +
108  #ifdef INET6
109 -    struct sockaddr_in6 server_sockaddr;
110 -    server_sockaddr.sin6_family = AF_INET6;
111 -    memcpy(&server_sockaddr.sin6_addr, &in6addr_any, sizeof (in6addr_any));
112 -    server_sockaddr.sin6_port = htons(server_port);
113 -#else
114 -    struct sockaddr_in server_sockaddr;
115 -    memset(&server_sockaddr, 0, sizeof server_sockaddr);
116 +    struct sockaddr_in6 server_sockaddr6;
117 +    if(SERVER_AF == AF_INET6) {
118 +        server_sockaddr6.sin6_family = AF_INET6;
119 +        memcpy(&server_sockaddr6.sin6_addr, &in6addr_any, sizeof (in6addr_any));
120 +        server_sockaddr6.sin6_port = htons(server_port);
121 +        server_sockaddr = (struct sockaddr *) &server_sockaddr6;
122 +    } else {
123 +#endif
124 +        memset(&server_sockaddr4, 0, SOCKADDR_LEN);
125  #ifdef HAVE_SIN_LEN             /* uncomment for BSDs */
126 -    server_sockaddr.sin_len = sizeof server_sockaddr;
127 +        server_sockaddr4.sin_len = SOCKADDR_LEN;
128  #endif
129 -    server_sockaddr.sin_family = AF_INET;
130 -    if (server_ip != NULL) {
131 -        inet_aton(server_ip, &server_sockaddr.sin_addr);
132 -    } else {
133 -        server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
134 +        server_sockaddr4.sin_family = AF_INET;
135 +        if (server_ip != NULL) {
136 +            inet_aton(server_ip, &server_sockaddr4.sin_addr);
137 +        } else {
138 +            server_sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY);
139 +        }
140 +        server_sockaddr4.sin_port = htons(server_port);
141 +        server_sockaddr = (struct sockaddr *) &server_sockaddr4;
142 +#ifdef INET6
143      }
144 -    server_sockaddr.sin_port = htons(server_port);
145  #endif
146  
147 -    return bind(server_s, (struct sockaddr *) &server_sockaddr,
148 -                sizeof (server_sockaddr));
149 +    return bind(server_s, server_sockaddr, SOCKADDR_LEN);
150  }
151  
152  char *ascii_sockaddr(struct SOCKADDR *s, char *dest, int len)
153  {
154  #ifdef INET6
155 -    if (getnameinfo((struct sockaddr *) s,
156 -                    sizeof(struct SOCKADDR),
157 -                    dest, len, NULL, 0, NI_NUMERICHOST)) {
158 -        fprintf(stderr, "[IPv6] getnameinfo failed\n");
159 -        *dest = '\0';
160 -    }
161 +    if(SERVER_AF == AF_INET6) {
162 +        if (getnameinfo((struct sockaddr *) s,
163 +                        SOCKADDR_LEN,
164 +                        dest, len, NULL, 0, NI_NUMERICHOST)) {
165 +            fprintf(stderr, "[IPv6] getnameinfo failed\n");
166 +            *dest = '\0';
167 +        }
168  #ifdef WHEN_DOES_THIS_APPLY
169 -    if ((s->__ss_family == AF_INET6) &&
170 -        IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *) s)->sin6_addr))) {
171 -        memmove(dest, dest+7, NI_MAXHOST);
172 -    }
173 +        if (((((struct sockaddr_in6 *) s)->sin6_family) == AF_INET6) &&
174 +            IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *) s)->sin6_addr))) {
175 +            memmove(dest, dest+7, NI_MAXHOST);
176 +        }
177  #endif
178 -#else
179 -    memmove(dest, inet_ntoa(s->sin_addr), len);
180 +    } else {
181 +#endif
182 +        memmove(dest, inet_ntoa(((struct sockaddr_in *) s)->sin_addr), len);
183 +#ifdef INET6
184 +    }
185  #endif
186      return dest;
187  }
188 @@ -98,17 +110,21 @@
189  {
190      int p = -1;
191  #ifdef INET6
192 -    char serv[NI_MAXSERV];
193 +    if(SERVER_AF == AF_INET6) {
194 +       char serv[NI_MAXSERV];
195  
196 -    if (getnameinfo((struct sockaddr *) s,
197 -                    sizeof(struct SOCKADDR),
198 -                    NULL, 0, serv, sizeof(serv), NI_NUMERICSERV)) {
199 -        fprintf(stderr, "[IPv6] getnameinfo failed\n");
200 +        if (getnameinfo((struct sockaddr *) s,
201 +                        SOCKADDR_LEN,
202 +                        NULL, 0, serv, sizeof(serv), NI_NUMERICSERV)) {
203 +            fprintf(stderr, "[IPv6] getnameinfo failed\n");
204 +        } else {
205 +            p = atoi(serv);
206 +        }
207      } else {
208 -        p = atoi(serv);
209 +#endif
210 +        p = ntohs(((struct sockaddr_in *) s)->sin_port);
211 +#ifdef INET6
212      }
213 -#else
214 -    p = ntohs(s->sin_port);
215  #endif
216      return p;
217  }
218 diff -urN boa-0.94.13.orig/src/mmap_cache.c boa-0.94.13/src/mmap_cache.c
219 --- boa-0.94.13.orig/src/mmap_cache.c   2002-03-24 23:35:34.000000000 +0100
220 +++ boa-0.94.13/src/mmap_cache.c        2008-10-28 14:55:16.000000000 +0100
221 @@ -67,7 +67,7 @@
222  
223      m = mmap(0, s->st_size, PROT_READ, MAP_OPTIONS, data_fd, 0);
224  
225 -    if ((int) m == -1) {
226 +    if ((ssize_t) m == -1) {
227          /* boa_perror(req,"mmap"); */
228          return NULL;
229      }
230 diff -urN boa-0.94.13.orig/src/request.c boa-0.94.13/src/request.c
231 --- boa-0.94.13.orig/src/request.c      2008-10-28 16:16:03.000000000 +0100
232 +++ boa-0.94.13/src/request.c   2008-10-28 15:17:20.000000000 +0100
233 @@ -75,12 +75,12 @@
234      int fd;                     /* socket */
235      struct SOCKADDR remote_addr; /* address */
236      struct SOCKADDR salocal;
237 -    int remote_addrlen = sizeof (struct SOCKADDR);
238 +    int remote_addrlen = SOCKADDR_LEN;
239      request *conn;              /* connection */
240 -    size_t len;
241 +    socklen_t len;
242      static int system_bufsize = 0; /* Default size of SNDBUF given by system */
243  
244 -    remote_addr.S_FAMILY = 0xdead;
245 +    S_FAMILY(&remote_addr) = 0xdead;
246      fd = accept(server_s, (struct sockaddr *) &remote_addr,
247                  &remote_addrlen);
248  
249 @@ -133,7 +133,7 @@
250      }
251  #endif
252  
253 -    len = sizeof(salocal);
254 +    len = SOCKADDR_LEN;
255  
256      if (getsockname(fd, (struct sockaddr *) &salocal, &len) != 0) {
257          WARN("getsockname");