a75641dcbf8402d7f36d82486ad02e7c593b303c
[privoxy.git] / jbsockets.c
1 const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.92 2011/03/27 13:57:41 fabiankeil Exp $";
2 /*********************************************************************
3  *
4  * File        :  $Source: /cvsroot/ijbswa/current/jbsockets.c,v $
5  *
6  * Purpose     :  Contains wrappers for system-specific sockets code,
7  *                so that the rest of Junkbuster can be more
8  *                OS-independent.  Contains #ifdefs to make this work
9  *                on many platforms.
10  *
11  * Copyright   :  Written by and Copyright (C) 2001-2011 the
12  *                Privoxy team. http://www.privoxy.org/
13  *
14  *                Based on the Internet Junkbuster originally written
15  *                by and Copyright (C) 1997 Anonymous Coders and 
16  *                Junkbusters Corporation.  http://www.junkbusters.com
17  *
18  *                This program is free software; you can redistribute it 
19  *                and/or modify it under the terms of the GNU General
20  *                Public License as published by the Free Software
21  *                Foundation; either version 2 of the License, or (at
22  *                your option) any later version.
23  *
24  *                This program is distributed in the hope that it will
25  *                be useful, but WITHOUT ANY WARRANTY; without even the
26  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
27  *                PARTICULAR PURPOSE.  See the GNU General Public
28  *                License for more details.
29  *
30  *                The GNU General Public License should be included with
31  *                this file.  If not, you can view it at
32  *                http://www.gnu.org/copyleft/gpl.html
33  *                or write to the Free Software Foundation, Inc., 59
34  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
35  *
36  *********************************************************************/
37
38
39 #include "config.h"
40
41 #include <stdlib.h>
42 #include <stdio.h>
43 #include <string.h>
44 #include <errno.h>
45 #include <fcntl.h>
46 #include <sys/types.h>
47
48 #ifdef _WIN32
49
50 #ifndef STRICT
51 #define STRICT
52 #endif
53 #include <windows.h>
54 #include <sys/timeb.h>
55 #include <io.h>
56
57 #else
58
59 #ifndef __OS2__
60 #include <unistd.h>
61 #endif
62 #include <sys/time.h>
63 #include <netinet/in.h>
64 #include <sys/ioctl.h>
65 #include <netdb.h>
66 #include <sys/socket.h>
67
68 #ifndef __BEOS__
69 #include <netinet/tcp.h>
70 #ifndef __OS2__
71 #include <arpa/inet.h>
72 #endif
73 #else
74 #include <socket.h>
75 #endif
76
77 #if defined(__EMX__) || defined (__OS2__)
78 #include <sys/select.h>  /* OS/2/EMX needs a little help with select */
79 #ifdef __OS2__
80 #include <nerrno.h>
81 #endif
82 #endif
83
84 #endif
85
86 #ifdef FEATURE_CONNECTION_KEEP_ALIVE
87 #ifdef HAVE_POLL
88 #ifdef __GLIBC__
89 #include <sys/poll.h>
90 #else
91 #include <poll.h>
92 #endif /* def __GLIBC__ */
93 #endif /* HAVE_POLL */
94 #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
95
96 #include "project.h"
97
98 /* For mutex semaphores only */
99 #include "jcc.h"
100
101 #include "jbsockets.h"
102 #include "filters.h"
103 #include "errlog.h"
104
105 /* Mac OSX doesn't define AI_NUMERICSESRV */
106 #ifndef AI_NUMERICSERV
107 #define AI_NUMERICSERV 0
108 #endif
109
110 const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION;
111
112 /*
113  * Maximum number of gethostbyname(_r) retries in case of
114  * soft errors (TRY_AGAIN).
115  * XXX: Does it make sense to make this a config option?
116  */
117 #define MAX_DNS_RETRIES 10
118
119 #define MAX_LISTEN_BACKLOG 128
120
121 #ifdef HAVE_RFC2553
122 static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client_state *csp);
123 #else
124 static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct client_state *csp);
125 #endif
126
127 /*********************************************************************
128  *
129  * Function    :  connect_to
130  *
131  * Description :  Open a socket and connect to it.  Will check
132  *                that this is allowed according to ACL.
133  *
134  * Parameters  :
135  *          1  :  host = hostname to connect to
136  *          2  :  portnum = port to connent on (XXX: should be unsigned)
137  *          3  :  csp = Current client state (buffers, headers, etc...)
138  *
139  * Returns     :  JB_INVALID_SOCKET => failure, else it is the socket
140  *                file descriptor.
141  *
142  *********************************************************************/
143 jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
144 {
145    jb_socket fd;
146    int forwarded_connect_retries = 0;
147
148    do
149    {
150 #ifdef HAVE_RFC2553
151       fd = rfc2553_connect_to(host, portnum, csp);
152 #else
153       fd = no_rfc2553_connect_to(host, portnum, csp);
154 #endif
155       if ((fd != JB_INVALID_SOCKET) || (errno != EINVAL))
156       {
157          break;
158       }
159       forwarded_connect_retries++;
160       log_error(LOG_LEVEL_ERROR,
161          "Attempt %d of %d to connect to %s failed. Trying again.",
162          forwarded_connect_retries, csp->config->forwarded_connect_retries, host);
163
164    } while (forwarded_connect_retries < csp->config->forwarded_connect_retries);
165
166    return fd;
167 }
168
169 #ifdef HAVE_RFC2553
170 /* Getaddrinfo implementation */
171 static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client_state *csp)
172 {
173    struct addrinfo hints, *result, *rp;
174    char service[6];
175    int retval;
176    jb_socket fd;
177    fd_set wfds;
178    struct timeval tv[1];
179 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
180    int   flags;
181 #endif
182    int connect_failed;
183    int socket_error;
184
185 #ifdef FEATURE_ACL
186    struct access_control_addr dst[1];
187 #endif /* def FEATURE_ACL */
188
189    /* Don't leak memory when retrying. */
190    freez(csp->error_message);
191    freez(csp->http->host_ip_addr_str);
192
193    retval = snprintf(service, sizeof(service), "%d", portnum);
194    if ((-1 == retval) || (sizeof(service) <= retval))
195    {
196       log_error(LOG_LEVEL_ERROR,
197          "Port number (%d) ASCII decimal representation doesn't fit into 6 bytes",
198          portnum);
199       csp->error_message = strdup("Invalid port number");
200       csp->http->host_ip_addr_str = strdup("unknown");
201       return(JB_INVALID_SOCKET);
202    }
203
204    memset((char *)&hints, 0, sizeof(hints));
205    hints.ai_family = AF_UNSPEC;
206    hints.ai_socktype = SOCK_STREAM;
207    hints.ai_flags = AI_NUMERICSERV; /* avoid service look-up */
208 #ifdef AI_ADDRCONFIG
209    hints.ai_flags |= AI_ADDRCONFIG;
210 #endif
211    if ((retval = getaddrinfo(host, service, &hints, &result)))
212    {
213       log_error(LOG_LEVEL_INFO,
214          "Can not resolve %s: %s", host, gai_strerror(retval));
215       /* XXX: Should find a better way to propagate this error. */
216       errno = EINVAL;
217       csp->error_message = strdup(gai_strerror(retval));
218       csp->http->host_ip_addr_str = strdup("unknown");
219       return(JB_INVALID_SOCKET);
220    }
221
222    csp->http->host_ip_addr_str = malloc(NI_MAXHOST);
223    if (NULL == csp->http->host_ip_addr_str)
224    {
225       log_error(LOG_LEVEL_ERROR,
226          "Out of memory while getting the server IP address.");
227       return JB_INVALID_SOCKET;
228    }
229
230    for (rp = result; rp != NULL; rp = rp->ai_next)
231    {
232
233 #ifdef FEATURE_ACL
234       memcpy(&dst->addr, rp->ai_addr, rp->ai_addrlen);
235
236       if (block_acl(dst, csp))
237       {
238 #ifdef __OS2__
239          socket_error = errno = SOCEPERM;
240 #else
241          socket_error = errno = EPERM;
242 #endif
243          continue;
244       }
245 #endif /* def FEATURE_ACL */
246
247       retval = getnameinfo(rp->ai_addr, rp->ai_addrlen,
248          csp->http->host_ip_addr_str, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
249       if (retval)
250       {
251          log_error(LOG_LEVEL_ERROR,
252             "Failed to get the host name from the socket structure: %s",
253             gai_strerror(retval));
254          continue;
255       }
256
257       fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
258 #ifdef _WIN32
259       if (fd == JB_INVALID_SOCKET)
260 #else
261       if (fd < 0)
262 #endif
263       {
264          continue;
265       }
266
267 #ifdef TCP_NODELAY
268       {  /* turn off TCP coalescence */
269          int mi = 1;
270          setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &mi, sizeof (int));
271       }
272 #endif /* def TCP_NODELAY */
273
274 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
275       if ((flags = fcntl(fd, F_GETFL, 0)) != -1)
276       {
277          flags |= O_NDELAY;
278          fcntl(fd, F_SETFL, flags);
279       }
280 #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
281
282       connect_failed = 0;
283       while (connect(fd, rp->ai_addr, rp->ai_addrlen) == JB_INVALID_SOCKET)
284       {
285 #ifdef __OS2__
286          errno = sock_errno();
287 #endif /* __OS2__ */
288
289 #ifdef _WIN32
290          if (errno == WSAEINPROGRESS)
291 #else /* ifndef _WIN32 */
292          if (errno == EINPROGRESS)
293 #endif /* ndef _WIN32 || __OS2__ */
294          {
295             break;
296          }
297
298          if (errno != EINTR)
299          {
300             close_socket(fd);
301             connect_failed = 1;
302             break;
303          }
304       }
305       if (connect_failed)
306       {
307          continue;
308       }
309
310 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
311       if (flags != -1)
312       {
313          flags &= ~O_NDELAY;
314          fcntl(fd, F_SETFL, flags);
315       }
316 #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
317
318       /* wait for connection to complete */
319       FD_ZERO(&wfds);
320       FD_SET(fd, &wfds);
321
322       tv->tv_sec  = 30;
323       tv->tv_usec = 0;
324
325       /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */
326       if ((select((int)fd + 1, NULL, &wfds, NULL, tv) > 0)
327          && FD_ISSET(fd, &wfds))
328       {
329          socklen_t optlen = sizeof(socket_error);
330          if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, &socket_error, &optlen))
331          {
332             if (!socket_error)
333             {
334                /* Connection established, no need to try other addresses. */
335                break;
336             }
337             log_error(LOG_LEVEL_CONNECT, "Could not connect to [%s]:%s: %s.",
338                csp->http->host_ip_addr_str, service, strerror(socket_error));
339          }
340          else
341          {
342             socket_error = errno;
343             log_error(LOG_LEVEL_ERROR, "Could not get the state of "
344                "the connection to [%s]:%s: %s; dropping connection.",
345                csp->http->host_ip_addr_str, service, strerror(errno));
346          }
347       }
348
349       /* Connection failed, try next address */
350       close_socket(fd);
351    }
352
353    freeaddrinfo(result);
354    if (!rp)
355    {
356       log_error(LOG_LEVEL_CONNECT, "Could not connect to [%s]:%s: %s.",
357          host, service, strerror(socket_error));
358       csp->error_message = strdup(strerror(socket_error));
359       return(JB_INVALID_SOCKET);
360    }
361    log_error(LOG_LEVEL_CONNECT, "Connected to %s[%s]:%s.",
362       host, csp->http->host_ip_addr_str, service);
363
364    return(fd);
365
366 }
367
368 #else /* ndef HAVE_RFC2553 */
369 /* Pre-getaddrinfo implementation */
370
371 static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct client_state *csp)
372 {
373    struct sockaddr_in inaddr;
374    jb_socket fd;
375    unsigned int addr;
376    fd_set wfds;
377    struct timeval tv[1];
378 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
379    int   flags;
380 #endif
381
382 #ifdef FEATURE_ACL
383    struct access_control_addr dst[1];
384 #endif /* def FEATURE_ACL */
385
386    /* Don't leak memory when retrying. */
387    freez(csp->http->host_ip_addr_str);
388
389    memset((char *)&inaddr, 0, sizeof inaddr);
390
391    if ((addr = resolve_hostname_to_ip(host)) == INADDR_NONE)
392    {
393       csp->http->host_ip_addr_str = strdup("unknown");
394       return(JB_INVALID_SOCKET);
395    }
396
397 #ifdef FEATURE_ACL
398    dst->addr = ntohl(addr);
399    dst->port = portnum;
400
401    if (block_acl(dst, csp))
402    {
403 #ifdef __OS2__
404       errno = SOCEPERM;
405 #else
406       errno = EPERM;
407 #endif
408       return(JB_INVALID_SOCKET);
409    }
410 #endif /* def FEATURE_ACL */
411
412    inaddr.sin_addr.s_addr = addr;
413    inaddr.sin_family      = AF_INET;
414    csp->http->host_ip_addr_str = strdup(inet_ntoa(inaddr.sin_addr));
415
416 #ifndef _WIN32
417    if (sizeof(inaddr.sin_port) == sizeof(short))
418 #endif /* ndef _WIN32 */
419    {
420       inaddr.sin_port = htons((unsigned short) portnum);
421    }
422 #ifndef _WIN32
423    else
424    {
425       inaddr.sin_port = htonl((unsigned long)portnum);
426    }
427 #endif /* ndef _WIN32 */
428
429    fd = socket(inaddr.sin_family, SOCK_STREAM, 0);
430 #ifdef _WIN32
431    if (fd == JB_INVALID_SOCKET)
432 #else
433    if (fd < 0)
434 #endif
435    {
436       return(JB_INVALID_SOCKET);
437    }
438
439 #ifdef TCP_NODELAY
440    {  /* turn off TCP coalescence */
441       int mi = 1;
442       setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &mi, sizeof (int));
443    }
444 #endif /* def TCP_NODELAY */
445
446 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
447    if ((flags = fcntl(fd, F_GETFL, 0)) != -1)
448    {
449       flags |= O_NDELAY;
450       fcntl(fd, F_SETFL, flags);
451    }
452 #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
453
454    while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET)
455    {
456 #ifdef _WIN32
457       if (errno == WSAEINPROGRESS)
458 #elif __OS2__ 
459       if (sock_errno() == EINPROGRESS)
460 #else /* ifndef _WIN32 */
461       if (errno == EINPROGRESS)
462 #endif /* ndef _WIN32 || __OS2__ */
463       {
464          break;
465       }
466
467 #ifdef __OS2__ 
468       if (sock_errno() != EINTR)
469 #else
470       if (errno != EINTR)
471 #endif /* __OS2__ */
472       {
473          close_socket(fd);
474          return(JB_INVALID_SOCKET);
475       }
476    }
477
478 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
479    if (flags != -1)
480    {
481       flags &= ~O_NDELAY;
482       fcntl(fd, F_SETFL, flags);
483    }
484 #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
485
486    /* wait for connection to complete */
487    FD_ZERO(&wfds);
488    FD_SET(fd, &wfds);
489
490    tv->tv_sec  = 30;
491    tv->tv_usec = 0;
492
493    /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */
494    if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0)
495    {
496       close_socket(fd);
497       return(JB_INVALID_SOCKET);
498    }
499    return(fd);
500
501 }
502 #endif /* ndef HAVE_RFC2553 */
503
504
505 /*********************************************************************
506  *
507  * Function    :  write_socket
508  *
509  * Description :  Write the contents of buf (for n bytes) to socket fd.
510  *
511  * Parameters  :
512  *          1  :  fd = file descriptor (aka. handle) of socket to write to.
513  *          2  :  buf = pointer to data to be written.
514  *          3  :  len = length of data to be written to the socket "fd".
515  *
516  * Returns     :  0 on success (entire buffer sent).
517  *                nonzero on error.
518  *
519  *********************************************************************/
520 #ifdef AMIGA
521 int write_socket(jb_socket fd, const char *buf, ssize_t len)
522 #else
523 int write_socket(jb_socket fd, const char *buf, size_t len)
524 #endif
525 {
526    if (len == 0)
527    {
528       return 0;
529    }
530
531    if (len < 0) /* constant condition - size_t isn't ever negative */ 
532    {
533       return 1;
534    }
535
536    log_error(LOG_LEVEL_WRITING, "to socket %d: %N", fd, len, buf);
537
538 #if defined(_WIN32)
539    return (send(fd, buf, (int)len, 0) != (int)len);
540 #elif defined(__BEOS__) || defined(AMIGA)
541    return (send(fd, buf, len, 0) != len);
542 #elif defined(__OS2__)
543    /*
544     * Break the data up into SOCKET_SEND_MAX chunks for sending...
545     * OS/2 seemed to complain when the chunks were too large.
546     */
547 #define SOCKET_SEND_MAX 65000
548    {
549       int send_len, send_rc = 0, i = 0;
550       while ((i < len) && (send_rc != -1))
551       {
552          if ((i + SOCKET_SEND_MAX) > len)
553             send_len = len - i;
554          else
555             send_len = SOCKET_SEND_MAX;
556          send_rc = send(fd,(char*)buf + i, send_len, 0);
557          if (send_rc == -1)
558             return 1;
559          i = i + send_len;
560       }
561       return 0;
562    }
563 #else
564    return (write(fd, buf, len) != len);
565 #endif
566
567 }
568
569
570 /*********************************************************************
571  *
572  * Function    :  read_socket
573  *
574  * Description :  Read from a TCP/IP socket in a platform independent way.
575  *
576  * Parameters  :
577  *          1  :  fd = file descriptor of the socket to read
578  *          2  :  buf = pointer to buffer where data will be written
579  *                Must be >= len bytes long.
580  *          3  :  len = maximum number of bytes to read
581  *
582  * Returns     :  On success, the number of bytes read is returned (zero
583  *                indicates end of file), and the file position is advanced
584  *                by this number.  It is not an error if this number is
585  *                smaller than the number of bytes requested; this may hap-
586  *                pen for example because fewer bytes are actually available
587  *                right now (maybe because we were close to end-of-file, or
588  *                because we are reading from a pipe, or from a terminal,
589  *                or because read() was interrupted by a signal).  On error,
590  *                -1 is returned, and errno is set appropriately.  In this
591  *                case it is left unspecified whether the file position (if
592  *                any) changes.
593  *
594  *********************************************************************/
595 int read_socket(jb_socket fd, char *buf, int len)
596 {
597    int ret;
598
599    if (len <= 0)
600    {
601       return(0);
602    }
603
604 #if defined(_WIN32)
605    ret = recv(fd, buf, len, 0);
606 #elif defined(__BEOS__) || defined(AMIGA) || defined(__OS2__)
607    ret = recv(fd, buf, (size_t)len, 0);
608 #else
609    ret = (int)read(fd, buf, (size_t)len);
610 #endif
611
612    if (ret > 0)
613    {
614       log_error(LOG_LEVEL_RECEIVED, "from socket %d: %N", fd, ret, buf);
615    }
616
617    return ret;
618 }
619
620
621 /*********************************************************************
622  *
623  * Function    :  data_is_available
624  *
625  * Description :  Waits for data to arrive on a socket.
626  *
627  * Parameters  :
628  *          1  :  fd = file descriptor of the socket to read
629  *          2  :  seconds_to_wait = number of seconds after which we give up.
630  *
631  * Returns     :  TRUE if data arrived in time,
632  *                FALSE otherwise.
633  *
634  *********************************************************************/
635 int data_is_available(jb_socket fd, int seconds_to_wait)
636 {
637    char buf[10];
638    fd_set rfds;
639    struct timeval timeout;
640    int n;
641
642    memset(&timeout, 0, sizeof(timeout));
643    timeout.tv_sec = seconds_to_wait;
644
645 #ifdef __OS2__
646    /* Copy and pasted from jcc.c ... */
647    memset(&rfds, 0, sizeof(fd_set));
648 #else
649    FD_ZERO(&rfds);
650 #endif
651    FD_SET(fd, &rfds);
652
653    n = select(fd+1, &rfds, NULL, NULL, &timeout);
654
655    /*
656     * XXX: Do we care about the different error conditions?
657     */
658    return ((n == 1) && (1 == recv(fd, buf, 1, MSG_PEEK)));
659 }
660
661
662 /*********************************************************************
663  *
664  * Function    :  close_socket
665  *
666  * Description :  Closes a TCP/IP socket
667  *
668  * Parameters  :
669  *          1  :  fd = file descriptor of socket to be closed
670  *
671  * Returns     :  void
672  *
673  *********************************************************************/
674 void close_socket(jb_socket fd)
675 {
676 #if defined(_WIN32) || defined(__BEOS__)
677    closesocket(fd);
678 #elif defined(AMIGA)
679    CloseSocket(fd); 
680 #elif defined(__OS2__)
681    soclose(fd);
682 #else
683    close(fd);
684 #endif
685
686 }
687
688
689 /*********************************************************************
690  *
691  * Function    :  bind_port
692  *
693  * Description :  Call socket, set socket options, and listen.
694  *                Called by listen_loop to "boot up" our proxy address.
695  *
696  * Parameters  :
697  *          1  :  hostnam = TCP/IP address to bind/listen to
698  *          2  :  portnum = port to listen on
699  *          3  :  pfd = pointer used to return file descriptor.
700  *
701  * Returns     :  if success, returns 0 and sets *pfd.
702  *                if failure, returns -3 if address is in use,
703  *                                    -2 if address unresolvable,
704  *                                    -1 otherwise
705  *********************************************************************/
706 int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
707 {
708 #ifdef HAVE_RFC2553
709    struct addrinfo hints;
710    struct addrinfo *result, *rp;
711    /*
712     * XXX: portnum should be a string to allow symbolic service
713     * names in the configuration file and to avoid the following
714     * int2string.
715     */
716    char servnam[6];
717    int retval;
718 #else
719    struct sockaddr_in inaddr;
720 #endif /* def HAVE_RFC2553 */
721    jb_socket fd;
722 #ifndef _WIN32
723    int one = 1;
724 #endif /* ndef _WIN32 */
725
726    *pfd = JB_INVALID_SOCKET;
727
728 #ifdef HAVE_RFC2553
729    retval = snprintf(servnam, sizeof(servnam), "%d", portnum);
730    if ((-1 == retval) || (sizeof(servnam) <= retval))
731    {
732       log_error(LOG_LEVEL_ERROR,
733          "Port number (%d) ASCII decimal representation doesn't fit into 6 bytes",
734          portnum);
735       return -1;
736    }
737
738    memset(&hints, 0, sizeof(struct addrinfo));
739    if (hostnam == NULL)
740    {
741       /*
742        * XXX: This is a hack. The right thing to do
743        * would be to bind to both AF_INET and AF_INET6.
744        * This will also fail if there is no AF_INET
745        * version available.
746        */
747       hints.ai_family = AF_INET;
748    }
749    else
750    {
751       hints.ai_family = AF_UNSPEC;
752    }
753    hints.ai_socktype = SOCK_STREAM;
754    hints.ai_flags = AI_PASSIVE;
755 #ifdef AI_ADDRCONFIG
756    hints.ai_flags |= AI_ADDRCONFIG;
757 #endif
758    hints.ai_protocol = 0; /* Realy any stream protocol or TCP only */
759    hints.ai_canonname = NULL;
760    hints.ai_addr = NULL;
761    hints.ai_next = NULL;
762
763    if ((retval = getaddrinfo(hostnam, servnam, &hints, &result)))
764    {
765       log_error(LOG_LEVEL_ERROR,
766          "Can not resolve %s: %s", hostnam, gai_strerror(retval));
767       return -2;
768    }
769 #else
770    memset((char *)&inaddr, '\0', sizeof inaddr);
771
772    inaddr.sin_family      = AF_INET;
773    inaddr.sin_addr.s_addr = resolve_hostname_to_ip(hostnam);
774
775    if (inaddr.sin_addr.s_addr == INADDR_NONE)
776    {
777       return(-2);
778    }
779
780 #ifndef _WIN32
781    if (sizeof(inaddr.sin_port) == sizeof(short))
782 #endif /* ndef _WIN32 */
783    {
784       inaddr.sin_port = htons((unsigned short) portnum);
785    }
786 #ifndef _WIN32
787    else
788    {
789       inaddr.sin_port = htonl((unsigned long) portnum);
790    }
791 #endif /* ndef _WIN32 */
792 #endif /* def HAVE_RFC2553 */
793
794 #ifdef HAVE_RFC2553
795    for (rp = result; rp != NULL; rp = rp->ai_next)
796    {
797       fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
798 #else
799    fd = socket(AF_INET, SOCK_STREAM, 0);
800 #endif /* def HAVE_RFC2553 */
801
802 #ifdef _WIN32
803    if (fd == JB_INVALID_SOCKET)
804 #else
805    if (fd < 0)
806 #endif
807    {
808 #ifdef HAVE_RFC2553
809       continue;
810 #else
811       return(-1);
812 #endif
813    }
814
815 #ifndef _WIN32
816    /*
817     * This is not needed for Win32 - in fact, it stops
818     * duplicate instances of Privoxy from being caught.
819     *
820     * On UNIX, we assume the user is sensible enough not
821     * to start Privoxy multiple times on the same IP.
822     * Without this, stopping and restarting Privoxy
823     * from a script fails.
824     * Note: SO_REUSEADDR is meant to only take over
825     * sockets which are *not* in listen state in Linux,
826     * e.g. sockets in TIME_WAIT. YMMV.
827     */
828    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
829 #endif /* ndef _WIN32 */
830
831 #ifdef HAVE_RFC2553
832    if (bind(fd, rp->ai_addr, rp->ai_addrlen) < 0)
833 #else
834    if (bind(fd, (struct sockaddr *)&inaddr, sizeof(inaddr)) < 0)
835 #endif
836    {
837 #ifdef _WIN32
838       errno = WSAGetLastError();
839       if (errno == WSAEADDRINUSE)
840 #else
841       if (errno == EADDRINUSE)
842 #endif
843       {
844 #ifdef HAVE_RFC2553
845          freeaddrinfo(result);
846 #endif
847          close_socket(fd);
848          return(-3);
849       }
850       else
851       {
852          close_socket(fd);
853 #ifndef HAVE_RFC2553
854          return(-1);
855       }
856    }
857 #else
858       }
859    }
860    else
861    {
862       /* bind() succeeded, escape from for-loop */
863       /*
864        * XXX: Support multiple listening sockets (e.g. localhost
865        * resolves to AF_INET and AF_INET6, but only the first address
866        * is used
867        */
868       break;
869    }
870    }
871
872    freeaddrinfo(result);
873    if (rp == NULL)
874    {
875       /* All bind()s failed */
876       return(-1);
877    }
878 #endif /* ndef HAVE_RFC2553 */
879
880    while (listen(fd, MAX_LISTEN_BACKLOG) == -1)
881    {
882       if (errno != EINTR)
883       {
884          return(-1);
885       }
886    }
887
888    *pfd = fd;
889    return 0;
890
891 }
892
893
894 /*********************************************************************
895  *
896  * Function    :  get_host_information
897  *
898  * Description :  Determines the IP address the client used to
899  *                reach us and the hostname associated with it.
900  *
901  *                XXX: Most of the code has been copy and pasted
902  *                from accept_connection() and not all of the
903  *                ifdefs paths have been tested afterwards.
904  *
905  * Parameters  :
906  *          1  :  afd = File descriptor returned from accept().
907  *          2  :  ip_address = Pointer to return the pointer to
908  *                             the ip address string.
909  *          3  :  hostname =   Pointer to return the pointer to
910  *                             the hostname or NULL if the caller
911  *                             isn't interested in it.
912  *
913  * Returns     :  void.
914  *
915  *********************************************************************/
916 void get_host_information(jb_socket afd, char **ip_address, char **hostname)
917 {
918 #ifdef HAVE_RFC2553
919    struct sockaddr_storage server;
920    int retval;
921 #else
922    struct sockaddr_in server;
923    struct hostent *host = NULL;
924 #endif /* HAVE_RFC2553 */
925 #if defined(_WIN32) || defined(__OS2__) || defined(__APPLE_CC__) || defined(AMIGA)
926    /* according to accept_connection() this fixes a warning. */
927    int s_length, s_length_provided;
928 #else
929    socklen_t s_length, s_length_provided;
930 #endif
931 #ifndef HAVE_RFC2553
932 #if defined(HAVE_GETHOSTBYADDR_R_8_ARGS) ||  defined(HAVE_GETHOSTBYADDR_R_7_ARGS) || defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
933    struct hostent result;
934 #if defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
935    struct hostent_data hdata;
936 #else
937    char hbuf[HOSTENT_BUFFER_SIZE];
938    int thd_err;
939 #endif /* def HAVE_GETHOSTBYADDR_R_5_ARGS */
940 #endif /* def HAVE_GETHOSTBYADDR_R_(8|7|5)_ARGS */
941 #endif /* ifndef HAVE_RFC2553 */
942    s_length = s_length_provided = sizeof(server);
943
944    if (NULL != hostname)
945    {
946       *hostname = NULL;
947    }
948    *ip_address = NULL;
949
950    if (!getsockname(afd, (struct sockaddr *) &server, &s_length))
951    {
952       if (s_length > s_length_provided)
953       {
954          log_error(LOG_LEVEL_ERROR, "getsockname() truncated server address");
955          return;
956       }
957 #ifdef HAVE_RFC2553
958       *ip_address = malloc(NI_MAXHOST);
959       if (NULL == *ip_address)
960       {
961          log_error(LOG_LEVEL_ERROR,
962             "Out of memory while getting the client's IP address.");
963          return;
964       }
965       retval = getnameinfo((struct sockaddr *) &server, s_length,
966          *ip_address, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
967       if (retval)
968       {
969          log_error(LOG_LEVEL_ERROR,
970             "Unable to print my own IP address: %s", gai_strerror(retval));
971          freez(*ip_address);
972          return;
973       }
974 #else
975       *ip_address = strdup(inet_ntoa(server.sin_addr));
976 #endif /* HAVE_RFC2553 */
977       if (NULL == hostname)
978       {
979          /*
980           * We're done here, the caller isn't
981           * interested in knowing the hostname.
982           */
983          return;
984       }
985
986 #ifdef HAVE_RFC2553
987       *hostname = malloc(NI_MAXHOST);
988       if (NULL == *hostname)
989       {
990          log_error(LOG_LEVEL_ERROR,
991             "Out of memory while getting the client's hostname.");
992          return;
993       }
994       retval = getnameinfo((struct sockaddr *) &server, s_length,
995          *hostname, NI_MAXHOST, NULL, 0, NI_NAMEREQD);
996       if (retval)
997       {
998          log_error(LOG_LEVEL_ERROR,
999             "Unable to resolve my own IP address: %s", gai_strerror(retval));
1000          freez(*hostname);
1001       }
1002 #else
1003 #if defined(HAVE_GETHOSTBYADDR_R_8_ARGS)
1004       gethostbyaddr_r((const char *)&server.sin_addr,
1005                       sizeof(server.sin_addr), AF_INET,
1006                       &result, hbuf, HOSTENT_BUFFER_SIZE,
1007                       &host, &thd_err);
1008 #elif defined(HAVE_GETHOSTBYADDR_R_7_ARGS)
1009       host = gethostbyaddr_r((const char *)&server.sin_addr,
1010                       sizeof(server.sin_addr), AF_INET,
1011                       &result, hbuf, HOSTENT_BUFFER_SIZE, &thd_err);
1012 #elif defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
1013       if (0 == gethostbyaddr_r((const char *)&server.sin_addr,
1014                                sizeof(server.sin_addr), AF_INET,
1015                                &result, &hdata))
1016       {
1017          host = &result;
1018       }
1019       else
1020       {
1021          host = NULL;
1022       }
1023 #elif defined(MUTEX_LOCKS_AVAILABLE)
1024       privoxy_mutex_lock(&resolver_mutex);
1025       host = gethostbyaddr((const char *)&server.sin_addr, 
1026                            sizeof(server.sin_addr), AF_INET);
1027       privoxy_mutex_unlock(&resolver_mutex);
1028 #else
1029       host = gethostbyaddr((const char *)&server.sin_addr, 
1030                            sizeof(server.sin_addr), AF_INET);
1031 #endif
1032       if (host == NULL)
1033       {
1034          log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %E\n");
1035       }
1036       else
1037       {
1038          *hostname = strdup(host->h_name);
1039       }
1040 #endif /* else def HAVE_RFC2553 */
1041    }
1042
1043    return;
1044 }
1045
1046
1047 /*********************************************************************
1048  *
1049  * Function    :  accept_connection
1050  *
1051  * Description :  Accepts a connection on a socket.  Socket must have
1052  *                been created using bind_port().
1053  *
1054  * Parameters  :
1055  *          1  :  csp = Client state, cfd, ip_addr_str, and 
1056  *                ip_addr_long will be set by this routine.
1057  *          2  :  fd  = file descriptor returned from bind_port
1058  *
1059  * Returns     :  when a connection is accepted, it returns 1 (TRUE).
1060  *                On an error it returns 0 (FALSE).
1061  *
1062  *********************************************************************/
1063 int accept_connection(struct client_state * csp, jb_socket fd)
1064 {
1065 #ifdef HAVE_RFC2553
1066    /* XXX: client is stored directly into csp->tcp_addr */
1067 #define client (csp->tcp_addr)
1068    int retval;
1069 #else
1070    struct sockaddr_in client;
1071 #endif
1072    jb_socket afd;
1073 #if defined(_WIN32) || defined(__OS2__) || defined(__APPLE_CC__) || defined(AMIGA)
1074    /* Wierdness - fix a warning. */
1075    int c_length;
1076 #else
1077    socklen_t c_length;
1078 #endif
1079
1080    c_length = sizeof(client);
1081
1082 #ifdef _WIN32
1083    afd = accept (fd, (struct sockaddr *) &client, &c_length);
1084    if (afd == JB_INVALID_SOCKET)
1085    {
1086       return 0;
1087    }
1088 #else
1089    do
1090    {
1091 #if defined(FEATURE_ACCEPT_FILTER) && defined(SO_ACCEPTFILTER)
1092       struct accept_filter_arg af_options;
1093       bzero(&af_options, sizeof(af_options));
1094       strlcpy(af_options.af_name, "httpready", sizeof(af_options.af_name));
1095       setsockopt(fd, SOL_SOCKET, SO_ACCEPTFILTER, &af_options, sizeof(af_options));
1096 #endif
1097       afd = accept (fd, (struct sockaddr *) &client, &c_length);
1098    } while (afd < 1 && errno == EINTR);
1099    if (afd < 0)
1100    {
1101       return 0;
1102    }
1103 #endif
1104
1105    csp->cfd = afd;
1106 #ifdef HAVE_RFC2553
1107    csp->ip_addr_str = malloc(NI_MAXHOST);
1108    if (NULL == csp->ip_addr_str)
1109    {
1110       log_error(LOG_LEVEL_ERROR,
1111          "Out of memory while getting the client's IP address.");
1112       return 0;
1113    }
1114    retval = getnameinfo((struct sockaddr *) &client, c_length,
1115          csp->ip_addr_str, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
1116    if (!csp->ip_addr_str || retval)
1117    {
1118       log_error(LOG_LEVEL_ERROR, "Can not save csp->ip_addr_str: %s",
1119             (csp->ip_addr_str) ? gai_strerror(retval) : "Insuffcient memory");
1120       freez(csp->ip_addr_str);
1121    }
1122 #undef client
1123 #else
1124    csp->ip_addr_str  = strdup(inet_ntoa(client.sin_addr));
1125    csp->ip_addr_long = ntohl(client.sin_addr.s_addr);
1126 #endif /* def HAVE_RFC2553 */
1127
1128    return 1;
1129
1130 }
1131
1132
1133 /*********************************************************************
1134  *
1135  * Function    :  resolve_hostname_to_ip
1136  *
1137  * Description :  Resolve a hostname to an internet tcp/ip address.
1138  *                NULL or an empty string resolve to INADDR_ANY.
1139  *
1140  * Parameters  :
1141  *          1  :  host = hostname to resolve
1142  *
1143  * Returns     :  INADDR_NONE => failure, INADDR_ANY or tcp/ip address if succesful.
1144  *
1145  *********************************************************************/
1146 unsigned long resolve_hostname_to_ip(const char *host)
1147 {
1148    struct sockaddr_in inaddr;
1149    struct hostent *hostp;
1150 #if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
1151    struct hostent result;
1152 #if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
1153    char hbuf[HOSTENT_BUFFER_SIZE];
1154    int thd_err;
1155 #else /* defined(HAVE_GETHOSTBYNAME_R_3_ARGS) */
1156    struct hostent_data hdata;
1157 #endif /* def HAVE_GETHOSTBYNAME_R_(6|5)_ARGS */
1158 #endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
1159
1160    if ((host == NULL) || (*host == '\0'))
1161    {
1162       return(INADDR_ANY);
1163    }
1164
1165    memset((char *) &inaddr, 0, sizeof inaddr);
1166
1167    if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1)
1168    {
1169       unsigned int dns_retries = 0;
1170 #if defined(HAVE_GETHOSTBYNAME_R_6_ARGS)
1171       while (gethostbyname_r(host, &result, hbuf,
1172                 HOSTENT_BUFFER_SIZE, &hostp, &thd_err)
1173              && (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))
1174       {   
1175          log_error(LOG_LEVEL_ERROR,
1176             "Timeout #%u while trying to resolve %s. Trying again.",
1177             dns_retries, host);
1178       }
1179 #elif defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
1180       while (NULL == (hostp = gethostbyname_r(host, &result,
1181                                  hbuf, HOSTENT_BUFFER_SIZE, &thd_err))
1182              && (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))
1183       {   
1184          log_error(LOG_LEVEL_ERROR,
1185             "Timeout #%u while trying to resolve %s. Trying again.",
1186             dns_retries, host);
1187       }
1188 #elif defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
1189       /*
1190        * XXX: Doesn't retry in case of soft errors.
1191        * Does this gethostbyname_r version set h_errno?
1192        */
1193       if (0 == gethostbyname_r(host, &result, &hdata))
1194       {
1195          hostp = &result;
1196       }
1197       else
1198       {
1199          hostp = NULL;
1200       }
1201 #elif defined(MUTEX_LOCKS_AVAILABLE)
1202       privoxy_mutex_lock(&resolver_mutex);
1203       while (NULL == (hostp = gethostbyname(host))
1204              && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))
1205       {   
1206          log_error(LOG_LEVEL_ERROR,
1207             "Timeout #%u while trying to resolve %s. Trying again.",
1208             dns_retries, host);
1209       }
1210       privoxy_mutex_unlock(&resolver_mutex);
1211 #else
1212       while (NULL == (hostp = gethostbyname(host))
1213              && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES))
1214       {
1215          log_error(LOG_LEVEL_ERROR,
1216             "Timeout #%u while trying to resolve %s. Trying again.",
1217             dns_retries, host);
1218       }
1219 #endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
1220       /*
1221        * On Mac OSX, if a domain exists but doesn't have a type A
1222        * record associated with it, the h_addr member of the struct
1223        * hostent returned by gethostbyname is NULL, even if h_length
1224        * is 4. Therefore the second test below.
1225        */
1226       if (hostp == NULL || hostp->h_addr == NULL)
1227       {
1228          errno = EINVAL;
1229          log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s", host);
1230          return(INADDR_NONE);
1231       }
1232       if (hostp->h_addrtype != AF_INET)
1233       {
1234 #ifdef _WIN32
1235          errno = WSAEPROTOTYPE;
1236 #else
1237          errno = EPROTOTYPE;
1238 #endif 
1239          log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host);
1240          return(INADDR_NONE);
1241       }
1242       memcpy(
1243          (char *) &inaddr.sin_addr,
1244          (char *) hostp->h_addr,
1245          sizeof(inaddr.sin_addr)
1246       );
1247    }
1248    return(inaddr.sin_addr.s_addr);
1249
1250 }
1251
1252
1253 #ifdef FEATURE_CONNECTION_KEEP_ALIVE
1254 /*********************************************************************
1255  *
1256  * Function    :  socket_is_still_alive
1257  *
1258  * Description :  Figures out whether or not a socket is still alive.
1259  *
1260  * Parameters  :
1261  *          1  :  sfd = The socket to check.
1262  *
1263  * Returns     :  TRUE for yes, otherwise FALSE.
1264  *
1265  *********************************************************************/
1266 int socket_is_still_alive(jb_socket sfd)
1267 {
1268    char buf[10];
1269    int no_data_waiting;
1270
1271 #ifdef HAVE_POLL
1272    int poll_result;
1273    struct pollfd poll_fd[1];
1274
1275    memset(poll_fd, 0, sizeof(poll_fd));
1276    poll_fd[0].fd = sfd;
1277    poll_fd[0].events = POLLIN;
1278
1279    poll_result = poll(poll_fd, 1, 0);
1280
1281    if (-1 == poll_result)
1282    {
1283       log_error(LOG_LEVEL_CONNECT, "Polling socket %d failed.", sfd);
1284       return FALSE;
1285    }
1286    no_data_waiting = !(poll_fd[0].revents & POLLIN);
1287 #else
1288    fd_set readable_fds;
1289    struct timeval timeout;
1290    int ret;
1291
1292    memset(&timeout, '\0', sizeof(timeout));
1293    FD_ZERO(&readable_fds);
1294    FD_SET(sfd, &readable_fds);
1295
1296    ret = select((int)sfd+1, &readable_fds, NULL, NULL, &timeout);
1297    if (ret < 0)
1298    {
1299       log_error(LOG_LEVEL_CONNECT, "select() on socket %d failed: %E", sfd);
1300       return FALSE;
1301    }
1302    no_data_waiting = !FD_ISSET(sfd, &readable_fds);
1303 #endif /* def HAVE_POLL */
1304
1305    return (no_data_waiting || (1 == recv(sfd, buf, 1, MSG_PEEK)));
1306 }
1307 #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
1308
1309
1310 /*
1311   Local Variables:
1312   tab-width: 3
1313   end:
1314 */