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
5 #include <sys/resource.h>
10 +int server_addr_family;
11 +socklen_t server_addr_len;
14 int backlog = SO_MAXCONN;
22 +sa_family_t *get_addr_family(struct sockaddr *address)
24 + if(server_addr_family == AF_INET6) {
25 + return &(((struct sockaddr_in6 *) address)->sin6_family);
28 + return &(((struct sockaddr_in *) address)->sin_family);
32 static int create_server_socket(void)
36 - server_s = socket(SERVER_AF, SOCK_STREAM, IPPROTO_TCP);
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);
42 - DIE("unable to create socket");
43 + server_addr_family = AF_INET;
44 + server_addr_len = sizeof(struct sockaddr_in);
46 + server_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
47 + if (server_s == -1) {
48 + DIE("unable to create socket");
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
60 int plugin_handle(request * req);
61 struct httpd_plugin *plugin_lookup(request *req);
66 +extern int server_addr_family;
67 +extern socklen_t server_addr_len;
68 +sa_family_t *get_addr_family(struct sockaddr *address);
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
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
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
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
98 #include <arpa/inet.h> /* inet_ntoa */
99 +#include <netinet/in.h>
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)
105 + struct sockaddr *server_sockaddr;
106 + struct sockaddr_in server_sockaddr4;
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);
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;
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;
129 - server_sockaddr.sin_family = AF_INET;
130 - if (server_ip != NULL) {
131 - inet_aton(server_ip, &server_sockaddr.sin_addr);
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);
138 + server_sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY);
140 + server_sockaddr4.sin_port = htons(server_port);
141 + server_sockaddr = (struct sockaddr *) &server_sockaddr4;
144 - server_sockaddr.sin_port = htons(server_port);
147 - return bind(server_s, (struct sockaddr *) &server_sockaddr,
148 - sizeof (server_sockaddr));
149 + return bind(server_s, server_sockaddr, SOCKADDR_LEN);
152 char *ascii_sockaddr(struct SOCKADDR *s, char *dest, int len)
155 - if (getnameinfo((struct sockaddr *) s,
156 - sizeof(struct SOCKADDR),
157 - dest, len, NULL, 0, NI_NUMERICHOST)) {
158 - fprintf(stderr, "[IPv6] getnameinfo failed\n");
161 + if(SERVER_AF == AF_INET6) {
162 + if (getnameinfo((struct sockaddr *) s,
164 + dest, len, NULL, 0, NI_NUMERICHOST)) {
165 + fprintf(stderr, "[IPv6] getnameinfo failed\n");
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);
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);
179 - memmove(dest, inet_ntoa(s->sin_addr), len);
182 + memmove(dest, inet_ntoa(((struct sockaddr_in *) s)->sin_addr), len);
192 - char serv[NI_MAXSERV];
193 + if(SERVER_AF == AF_INET6) {
194 + char serv[NI_MAXSERV];
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,
202 + NULL, 0, serv, sizeof(serv), NI_NUMERICSERV)) {
203 + fprintf(stderr, "[IPv6] getnameinfo failed\n");
210 + p = ntohs(((struct sockaddr_in *) s)->sin_port);
214 - p = ntohs(s->sin_port);
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
223 m = mmap(0, s->st_size, PROT_READ, MAP_OPTIONS, data_fd, 0);
225 - if ((int) m == -1) {
226 + if ((ssize_t) m == -1) {
227 /* boa_perror(req,"mmap"); */
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
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 */
242 static int system_bufsize = 0; /* Default size of SNDBUF given by system */
244 - remote_addr.S_FAMILY = 0xdead;
245 + S_FAMILY(&remote_addr) = 0xdead;
246 fd = accept(server_s, (struct sockaddr *) &remote_addr,
253 - len = sizeof(salocal);
254 + len = SOCKADDR_LEN;
256 if (getsockname(fd, (struct sockaddr *) &salocal, &len) != 0) {