]> sjero.net Git - wget/blob - src/connect.c
Guard inclusion of some headers.
[wget] / src / connect.c
1 /* Establishing and handling network connections.
2    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
4    Foundation, Inc.
5
6 This file is part of GNU Wget.
7
8 GNU Wget is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11  (at your option) any later version.
12
13 GNU Wget is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
20
21 Additional permission under GNU GPL version 3 section 7
22
23 If you modify this program, or any covered work, by linking or
24 combining it with the OpenSSL project's OpenSSL library (or a
25 modified version of that library), containing parts covered by the
26 terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
27 grants you additional permission to convey the resulting work.
28 Corresponding Source for a non-source form of such a combination
29 shall include the source code for the parts of OpenSSL used as well
30 as that of the covered work.  */
31
32 #include "wget.h"
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <unistd.h>
37 #include <assert.h>
38
39 #ifdef HAVE_SYS_SOCKET_H
40 # include <sys/socket.h>
41 #endif /* def HAVE_SYS_SOCKET_H */
42
43 #ifdef HAVE_SYS_SELECT_H
44 # include <sys/select.h>
45 #endif /* def HAVE_SYS_SELECT_H */
46
47 #ifndef WINDOWS
48 # ifdef __VMS
49 #  include "vms_ip.h"
50 # else /* def __VMS */
51 #  include <netdb.h>
52 # endif /* def __VMS [else] */
53 # include <netinet/in.h>
54 # ifndef __BEOS__
55 #  include <arpa/inet.h>
56 # endif
57 #endif /* not WINDOWS */
58
59 #include <errno.h>
60 #include <string.h>
61 #include <sys/time.h>
62 #include "utils.h"
63 #include "host.h"
64 #include "connect.h"
65 #include "hash.h"
66
67 /* Apparently needed for Interix: */
68 #ifdef HAVE_STDINT_H
69 # include <stdint.h>
70 #endif
71
72 /* Define sockaddr_storage where unavailable (presumably on IPv4-only
73    hosts).  */
74
75 #ifndef ENABLE_IPV6
76 # ifndef HAVE_STRUCT_SOCKADDR_STORAGE
77 #  define sockaddr_storage sockaddr_in
78 # endif
79 #endif /* ENABLE_IPV6 */
80
81 /* Fill SA as per the data in IP and PORT.  SA shoult point to struct
82    sockaddr_storage if ENABLE_IPV6 is defined, to struct sockaddr_in
83    otherwise.  */
84
85 static void
86 sockaddr_set_data (struct sockaddr *sa, const ip_address *ip, int port)
87 {
88   switch (ip->family)
89     {
90     case AF_INET:
91       {
92         struct sockaddr_in *sin = (struct sockaddr_in *)sa;
93         xzero (*sin);
94         sin->sin_family = AF_INET;
95         sin->sin_port = htons (port);
96         sin->sin_addr = ip->data.d4;
97         break;
98       }
99 #ifdef ENABLE_IPV6
100     case AF_INET6:
101       {
102         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
103         xzero (*sin6);
104         sin6->sin6_family = AF_INET6;
105         sin6->sin6_port = htons (port);
106         sin6->sin6_addr = ip->data.d6;
107 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
108         sin6->sin6_scope_id = ip->ipv6_scope;
109 #endif
110         break;
111       }
112 #endif /* ENABLE_IPV6 */
113     default:
114       abort ();
115     }
116 }
117
118 /* Get the data of SA, specifically the IP address and the port.  If
119    you're not interested in one or the other information, pass NULL as
120    the pointer.  */
121
122 static void
123 sockaddr_get_data (const struct sockaddr *sa, ip_address *ip, int *port)
124 {
125   switch (sa->sa_family)
126     {
127     case AF_INET:
128       {
129         struct sockaddr_in *sin = (struct sockaddr_in *)sa;
130         if (ip)
131           {
132             ip->family = AF_INET;
133             ip->data.d4 = sin->sin_addr;
134           }
135         if (port)
136           *port = ntohs (sin->sin_port);
137         break;
138       }
139 #ifdef ENABLE_IPV6
140     case AF_INET6:
141       {
142         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
143         if (ip)
144           {
145             ip->family = AF_INET6;
146             ip->data.d6 = sin6->sin6_addr;
147 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
148             ip->ipv6_scope = sin6->sin6_scope_id;
149 #endif
150           }
151         if (port)
152           *port = ntohs (sin6->sin6_port);
153         break;
154       }
155 #endif
156     default:
157       abort ();
158     }
159 }
160
161 /* Return the size of the sockaddr structure depending on its
162    family.  */
163
164 static socklen_t
165 sockaddr_size (const struct sockaddr *sa)
166 {
167   switch (sa->sa_family)
168     {
169     case AF_INET:
170       return sizeof (struct sockaddr_in);
171 #ifdef ENABLE_IPV6
172     case AF_INET6:
173       return sizeof (struct sockaddr_in6);
174 #endif
175     default:
176       abort ();
177     }
178 }
179 \f
180 /* Resolve the bind address specified via --bind-address and store it
181    to SA.  The resolved value is stored in a static variable and
182    reused after the first invocation of this function.
183
184    Returns true on success, false on failure.  */
185
186 static bool
187 resolve_bind_address (struct sockaddr *sa)
188 {
189   struct address_list *al;
190
191   /* Make sure this is called only once.  opt.bind_address doesn't
192      change during a Wget run.  */
193   static bool called, should_bind;
194   static ip_address ip;
195   if (called)
196     {
197       if (should_bind)
198         sockaddr_set_data (sa, &ip, 0);
199       return should_bind;
200     }
201   called = true;
202
203   al = lookup_host (opt.bind_address, LH_BIND | LH_SILENT);
204   if (!al)
205     {
206       /* #### We should be able to print the error message here. */
207       logprintf (LOG_NOTQUIET,
208                  _("%s: unable to resolve bind address %s; disabling bind.\n"),
209                  exec_name, quote (opt.bind_address));
210       should_bind = false;
211       return false;
212     }
213
214   /* Pick the first address in the list and use it as bind address.
215      Perhaps we should try multiple addresses in succession, but I
216      don't think that's necessary in practice.  */
217   ip = *address_list_address_at (al, 0);
218   address_list_release (al);
219
220   sockaddr_set_data (sa, &ip, 0);
221   should_bind = true;
222   return true;
223 }
224 \f
225 struct cwt_context {
226   int fd;
227   const struct sockaddr *addr;
228   socklen_t addrlen;
229   int result;
230 };
231
232 static void
233 connect_with_timeout_callback (void *arg)
234 {
235   struct cwt_context *ctx = (struct cwt_context *)arg;
236   ctx->result = connect (ctx->fd, ctx->addr, ctx->addrlen);
237 }
238
239 /* Like connect, but specifies a timeout.  If connecting takes longer
240    than TIMEOUT seconds, -1 is returned and errno is set to
241    ETIMEDOUT.  */
242
243 static int
244 connect_with_timeout (int fd, const struct sockaddr *addr, socklen_t addrlen,
245                       double timeout)
246 {
247   struct cwt_context ctx;
248   ctx.fd = fd;
249   ctx.addr = addr;
250   ctx.addrlen = addrlen;
251
252   if (run_with_timeout (timeout, connect_with_timeout_callback, &ctx))
253     {
254       errno = ETIMEDOUT;
255       return -1;
256     }
257   if (ctx.result == -1 && errno == EINTR)
258     errno = ETIMEDOUT;
259   return ctx.result;
260 }
261 \f
262 /* Connect via TCP to the specified address and port.
263
264    If PRINT is non-NULL, it is the host name to print that we're
265    connecting to.  */
266
267 int
268 connect_to_ip (const ip_address *ip, int port, const char *print)
269 {
270   struct sockaddr_storage ss;
271   struct sockaddr *sa = (struct sockaddr *)&ss;
272   int sock;
273
274   /* If PRINT is non-NULL, print the "Connecting to..." line, with
275      PRINT being the host name we're connecting to.  */
276   if (print)
277     {
278       const char *txt_addr = print_address (ip);
279       if (0 != strcmp (print, txt_addr))
280         {
281                                   char *str = NULL, *name;
282
283           if (opt.enable_iri && (name = idn_decode ((char *) print)) != NULL)
284             {
285               int len = strlen (print) + strlen (name) + 4;
286               str = xmalloc (len);
287               snprintf (str, len, "%s (%s)", name, print);
288               str[len-1] = '\0';
289               xfree (name);
290             }
291
292           logprintf (LOG_VERBOSE, _("Connecting to %s|%s|:%d... "),
293                      str ? str : escnonprint_uri (print), txt_addr, port);
294
295                                         if (str)
296                                           xfree (str);
297         }
298       else
299        {
300            if (ip->family == AF_INET)
301                logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port);
302            else if (ip->family == AF_INET6)
303                logprintf (LOG_VERBOSE, _("Connecting to [%s]:%d... "), txt_addr, port);
304        }
305     }
306
307   /* Store the sockaddr info to SA.  */
308   sockaddr_set_data (sa, ip, port);
309
310   /* Create the socket of the family appropriate for the address.  */
311   sock = socket (sa->sa_family, SOCK_STREAM, 0);
312   if (sock < 0)
313     goto err;
314
315 #if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
316   if (opt.ipv6_only) {
317     int on = 1;
318     /* In case of error, we will go on anyway... */
319     int err = setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on));
320     IF_DEBUG
321       if (err < 0)
322         DEBUGP (("Failed setting IPV6_V6ONLY: %s", strerror (errno)));
323   }
324 #endif
325
326   /* For very small rate limits, set the buffer size (and hence,
327      hopefully, the kernel's TCP window size) to the per-second limit.
328      That way we should never have to sleep for more than 1s between
329      network reads.  */
330   if (opt.limit_rate && opt.limit_rate < 8192)
331     {
332       int bufsize = opt.limit_rate;
333       if (bufsize < 512)
334         bufsize = 512;          /* avoid pathologically small values */
335 #ifdef SO_RCVBUF
336       setsockopt (sock, SOL_SOCKET, SO_RCVBUF,
337                   (void *)&bufsize, (socklen_t)sizeof (bufsize));
338 #endif
339       /* When we add limit_rate support for writing, which is useful
340          for POST, we should also set SO_SNDBUF here.  */
341     }
342
343   if (opt.bind_address)
344     {
345       /* Bind the client side of the socket to the requested
346          address.  */
347       struct sockaddr_storage bind_ss;
348       struct sockaddr *bind_sa = (struct sockaddr *)&bind_ss;
349       if (resolve_bind_address (bind_sa))
350         {
351           if (bind (sock, bind_sa, sockaddr_size (bind_sa)) < 0)
352             goto err;
353         }
354     }
355
356   /* Connect the socket to the remote endpoint.  */
357   if (connect_with_timeout (sock, sa, sockaddr_size (sa),
358                             opt.connect_timeout) < 0)
359     goto err;
360
361   /* Success. */
362   assert (sock >= 0);
363   if (print)
364     logprintf (LOG_VERBOSE, _("connected.\n"));
365   DEBUGP (("Created socket %d.\n", sock));
366   return sock;
367
368  err:
369   {
370     /* Protect errno from possible modifications by close and
371        logprintf.  */
372     int save_errno = errno;
373     if (sock >= 0)
374       fd_close (sock);
375     if (print)
376       logprintf (LOG_VERBOSE, _("failed: %s.\n"), strerror (errno));
377     errno = save_errno;
378     return -1;
379   }
380 }
381
382 /* Connect via TCP to a remote host on the specified port.
383
384    HOST is resolved as an Internet host name.  If HOST resolves to
385    more than one IP address, they are tried in the order returned by
386    DNS until connecting to one of them succeeds.  */
387
388 int
389 connect_to_host (const char *host, int port)
390 {
391   int i, start, end;
392   int sock;
393
394   struct address_list *al = lookup_host (host, 0);
395
396  retry:
397   if (!al)
398     {
399       logprintf (LOG_NOTQUIET,
400                  _("%s: unable to resolve host address %s\n"),
401                  exec_name, quote (host));
402       return E_HOST;
403     }
404
405   address_list_get_bounds (al, &start, &end);
406   for (i = start; i < end; i++)
407     {
408       const ip_address *ip = address_list_address_at (al, i);
409       sock = connect_to_ip (ip, port, host);
410       if (sock >= 0)
411         {
412           /* Success. */
413           address_list_set_connected (al);
414           address_list_release (al);
415           return sock;
416         }
417
418       /* The attempt to connect has failed.  Continue with the loop
419          and try next address. */
420
421       address_list_set_faulty (al, i);
422     }
423
424   /* Failed to connect to any of the addresses in AL. */
425
426   if (address_list_connected_p (al))
427     {
428       /* We connected to AL before, but cannot do so now.  That might
429          indicate that our DNS cache entry for HOST has expired.  */
430       address_list_release (al);
431       al = lookup_host (host, LH_REFRESH);
432       goto retry;
433     }
434   address_list_release (al);
435
436   return -1;
437 }
438 \f
439 /* Create a socket, bind it to local interface BIND_ADDRESS on port
440    *PORT, set up a listen backlog, and return the resulting socket, or
441    -1 in case of error.
442
443    BIND_ADDRESS is the address of the interface to bind to.  If it is
444    NULL, the socket is bound to the default address.  PORT should
445    point to the port number that will be used for the binding.  If
446    that number is 0, the system will choose a suitable port, and the
447    chosen value will be written to *PORT.
448
449    Calling accept() on such a socket waits for and accepts incoming
450    TCP connections.  */
451
452 int
453 bind_local (const ip_address *bind_address, int *port)
454 {
455   int sock;
456   struct sockaddr_storage ss;
457   struct sockaddr *sa = (struct sockaddr *)&ss;
458
459   /* For setting options with setsockopt. */
460   int setopt_val = 1;
461   void *setopt_ptr = (void *)&setopt_val;
462   socklen_t setopt_size = sizeof (setopt_val);
463
464   sock = socket (bind_address->family, SOCK_STREAM, 0);
465   if (sock < 0)
466     return -1;
467
468 #ifdef SO_REUSEADDR
469   setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, setopt_ptr, setopt_size);
470 #endif
471
472   xzero (ss);
473   sockaddr_set_data (sa, bind_address, *port);
474   if (bind (sock, sa, sockaddr_size (sa)) < 0)
475     {
476       fd_close (sock);
477       return -1;
478     }
479   DEBUGP (("Local socket fd %d bound.\n", sock));
480
481   /* If *PORT is 0, find out which port we've bound to.  */
482   if (*port == 0)
483     {
484       socklen_t addrlen = sockaddr_size (sa);
485       if (getsockname (sock, sa, &addrlen) < 0)
486         {
487           /* If we can't find out the socket's local address ("name"),
488              something is seriously wrong with the socket, and it's
489              unusable for us anyway because we must know the chosen
490              port.  */
491           fd_close (sock);
492           return -1;
493         }
494       sockaddr_get_data (sa, NULL, port);
495       DEBUGP (("binding to address %s using port %i.\n",
496                print_address (bind_address), *port));
497     }
498   if (listen (sock, 1) < 0)
499     {
500       fd_close (sock);
501       return -1;
502     }
503   return sock;
504 }
505
506 /* Like a call to accept(), but with the added check for timeout.
507
508    In other words, accept a client connection on LOCAL_SOCK, and
509    return the new socket used for communication with the client.
510    LOCAL_SOCK should have been bound, e.g. using bind_local().
511
512    The caller is blocked until a connection is established.  If no
513    connection is established for opt.connect_timeout seconds, the
514    function exits with an error status.  */
515
516 int
517 accept_connection (int local_sock)
518 {
519   int sock;
520
521   /* We don't need the values provided by accept, but accept
522      apparently requires them to be present.  */
523   struct sockaddr_storage ss;
524   struct sockaddr *sa = (struct sockaddr *)&ss;
525   socklen_t addrlen = sizeof (ss);
526
527   if (opt.connect_timeout)
528     {
529       int test = select_fd (local_sock, opt.connect_timeout, WAIT_FOR_READ);
530       if (test == 0)
531         errno = ETIMEDOUT;
532       if (test <= 0)
533         return -1;
534     }
535   sock = accept (local_sock, sa, &addrlen);
536   DEBUGP (("Accepted client at socket %d.\n", sock));
537   return sock;
538 }
539
540 /* Get the IP address associated with the connection on FD and store
541    it to IP.  Return true on success, false otherwise.
542
543    If ENDPOINT is ENDPOINT_LOCAL, it returns the address of the local
544    (client) side of the socket.  Else if ENDPOINT is ENDPOINT_PEER, it
545    returns the address of the remote (peer's) side of the socket.  */
546
547 bool
548 socket_ip_address (int sock, ip_address *ip, int endpoint)
549 {
550   struct sockaddr_storage storage;
551   struct sockaddr *sockaddr = (struct sockaddr *) &storage;
552   socklen_t addrlen = sizeof (storage);
553   int ret;
554
555   memset (sockaddr, 0, addrlen);
556   if (endpoint == ENDPOINT_LOCAL)
557     ret = getsockname (sock, sockaddr, &addrlen);
558   else if (endpoint == ENDPOINT_PEER)
559     ret = getpeername (sock, sockaddr, &addrlen);
560   else
561     abort ();
562   if (ret < 0)
563     return false;
564
565   ip->family = sockaddr->sa_family;
566   switch (sockaddr->sa_family)
567     {
568 #ifdef ENABLE_IPV6
569     case AF_INET6:
570       {
571         struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&storage;
572         ip->data.d6 = sa6->sin6_addr;
573 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
574         ip->ipv6_scope = sa6->sin6_scope_id;
575 #endif
576         DEBUGP (("conaddr is: %s\n", print_address (ip)));
577         return true;
578       }
579 #endif
580     case AF_INET:
581       {
582         struct sockaddr_in *sa = (struct sockaddr_in *)&storage;
583         ip->data.d4 = sa->sin_addr;
584         DEBUGP (("conaddr is: %s\n", print_address (ip)));
585         return true;
586       }
587     default:
588       abort ();
589     }
590 }
591
592 /* Get the socket family of connection on FD and store
593    Return family type on success, -1 otherwise.
594
595    If ENDPOINT is ENDPOINT_LOCAL, it returns the sock family of the local
596    (client) side of the socket.  Else if ENDPOINT is ENDPOINT_PEER, it
597    returns the sock family of the remote (peer's) side of the socket.  */
598
599 int
600 socket_family (int sock, int endpoint)
601 {
602   struct sockaddr_storage storage;
603   struct sockaddr *sockaddr = (struct sockaddr *) &storage;
604   socklen_t addrlen = sizeof (storage);
605   int ret;
606
607   memset (sockaddr, 0, addrlen);
608
609   if (endpoint == ENDPOINT_LOCAL)
610     ret = getsockname (sock, sockaddr, &addrlen);
611   else if (endpoint == ENDPOINT_PEER)
612     ret = getpeername (sock, sockaddr, &addrlen);
613   else
614     abort ();
615
616   if (ret < 0)
617     return -1;
618
619   return sockaddr->sa_family;
620 }
621
622 /* Return true if the error from the connect code can be considered
623    retryable.  Wget normally retries after errors, but the exception
624    are the "unsupported protocol" type errors (possible on IPv4/IPv6
625    dual family systems) and "connection refused".  */
626
627 bool
628 retryable_socket_connect_error (int err)
629 {
630   /* Have to guard against some of these values not being defined.
631      Cannot use a switch statement because some of the values might be
632      equal.  */
633   if (false
634 #ifdef EAFNOSUPPORT
635       || err == EAFNOSUPPORT
636 #endif
637 #ifdef EPFNOSUPPORT
638       || err == EPFNOSUPPORT
639 #endif
640 #ifdef ESOCKTNOSUPPORT          /* no, "sockt" is not a typo! */
641       || err == ESOCKTNOSUPPORT
642 #endif
643 #ifdef EPROTONOSUPPORT
644       || err == EPROTONOSUPPORT
645 #endif
646 #ifdef ENOPROTOOPT
647       || err == ENOPROTOOPT
648 #endif
649       /* Apparently, older versions of Linux and BSD used EINVAL
650          instead of EAFNOSUPPORT and such.  */
651       || err == EINVAL
652       )
653     return false;
654
655   if (!opt.retry_connrefused)
656     if (err == ECONNREFUSED
657 #ifdef ENETUNREACH
658         || err == ENETUNREACH   /* network is unreachable */
659 #endif
660 #ifdef EHOSTUNREACH
661         || err == EHOSTUNREACH  /* host is unreachable */
662 #endif
663         )
664       return false;
665
666   return true;
667 }
668
669 /* Wait for a single descriptor to become available, timing out after
670    MAXTIME seconds.  Returns 1 if FD is available, 0 for timeout and
671    -1 for error.  The argument WAIT_FOR can be a combination of
672    WAIT_FOR_READ and WAIT_FOR_WRITE.
673
674    This is a mere convenience wrapper around the select call, and
675    should be taken as such (for example, it doesn't implement Wget's
676    0-timeout-means-no-timeout semantics.)  */
677
678 int
679 select_fd (int fd, double maxtime, int wait_for)
680 {
681   fd_set fdset;
682   fd_set *rd = NULL, *wr = NULL;
683   struct timeval tmout;
684   int result;
685
686   FD_ZERO (&fdset);
687   FD_SET (fd, &fdset);
688   if (wait_for & WAIT_FOR_READ)
689     rd = &fdset;
690   if (wait_for & WAIT_FOR_WRITE)
691     wr = &fdset;
692
693   tmout.tv_sec = (long) maxtime;
694   tmout.tv_usec = 1000000 * (maxtime - (long) maxtime);
695
696   do
697   {
698     result = select (fd + 1, rd, wr, NULL, &tmout);
699 #ifdef WINDOWS
700     /* gnulib select() converts blocking sockets to nonblocking in windows.
701        wget uses blocking sockets so we must convert them back to blocking.  */
702     set_windows_fd_as_blocking_socket (fd);
703 #endif
704   }
705   while (result < 0 && errno == EINTR);
706
707   return result;
708 }
709
710 /* Return true iff the connection to the remote site established
711    through SOCK is still open.
712
713    Specifically, this function returns true if SOCK is not ready for
714    reading.  This is because, when the connection closes, the socket
715    is ready for reading because EOF is about to be delivered.  A side
716    effect of this method is that sockets that have pending data are
717    considered non-open.  This is actually a good thing for callers of
718    this function, where such pending data can only be unwanted
719    leftover from a previous request.  */
720
721 bool
722 test_socket_open (int sock)
723 {
724   fd_set check_set;
725   struct timeval to;
726   int ret = 0;
727
728   /* Check if we still have a valid (non-EOF) connection.  From Andrew
729    * Maholski's code in the Unix Socket FAQ.  */
730
731   FD_ZERO (&check_set);
732   FD_SET (sock, &check_set);
733
734   /* Wait one microsecond */
735   to.tv_sec = 0;
736   to.tv_usec = 1;
737
738   ret = select (sock + 1, &check_set, NULL, NULL, &to);
739 #ifdef WINDOWS
740 /* gnulib select() converts blocking sockets to nonblocking in windows.
741 wget uses blocking sockets so we must convert them back to blocking
742 */
743   set_windows_fd_as_blocking_socket ( sock );
744 #endif
745
746   if ( !ret )
747     /* We got a timeout, it means we're still connected. */
748     return true;
749   else
750     /* Read now would not wait, it means we have either pending data
751        or EOF/error. */
752     return false;
753 }
754 \f
755 /* Basic socket operations, mostly EINTR wrappers.  */
756
757 static int
758 sock_read (int fd, char *buf, int bufsize)
759 {
760   int res;
761   do
762     res = read (fd, buf, bufsize);
763   while (res == -1 && errno == EINTR);
764   return res;
765 }
766
767 static int
768 sock_write (int fd, char *buf, int bufsize)
769 {
770   int res;
771   do
772     res = write (fd, buf, bufsize);
773   while (res == -1 && errno == EINTR);
774   return res;
775 }
776
777 static int
778 sock_poll (int fd, double timeout, int wait_for)
779 {
780   return select_fd (fd, timeout, wait_for);
781 }
782
783 static int
784 sock_peek (int fd, char *buf, int bufsize)
785 {
786   int res;
787   do
788     res = recv (fd, buf, bufsize, MSG_PEEK);
789   while (res == -1 && errno == EINTR);
790   return res;
791 }
792
793 static void
794 sock_close (int fd)
795 {
796   close (fd);
797   DEBUGP (("Closed fd %d\n", fd));
798 }
799 #undef read
800 #undef write
801 #undef close
802 \f
803 /* Reading and writing from the network.  We build around the socket
804    (file descriptor) API, but support "extended" operations for things
805    that are not mere file descriptors under the hood, such as SSL
806    sockets.
807
808    That way the user code can call fd_read(fd, ...) and we'll run read
809    or SSL_read or whatever is necessary.  */
810
811 static struct hash_table *transport_map;
812 static unsigned int transport_map_modified_tick;
813
814 struct transport_info {
815   struct transport_implementation *imp;
816   void *ctx;
817 };
818
819 /* Register the transport layer operations that will be used when
820    reading, writing, and polling FD.
821
822    This should be used for transport layers like SSL that piggyback on
823    sockets.  FD should otherwise be a real socket, on which you can
824    call getpeername, etc.  */
825
826 void
827 fd_register_transport (int fd, struct transport_implementation *imp, void *ctx)
828 {
829   struct transport_info *info;
830
831   /* The file descriptor must be non-negative to be registered.
832      Negative values are ignored by fd_close(), and -1 cannot be used as
833      hash key.  */
834   assert (fd >= 0);
835
836   info = xnew (struct transport_info);
837   info->imp = imp;
838   info->ctx = ctx;
839   if (!transport_map)
840     transport_map = hash_table_new (0, NULL, NULL);
841   hash_table_put (transport_map, (void *)(intptr_t) fd, info);
842   ++transport_map_modified_tick;
843 }
844
845 /* Return context of the transport registered with
846    fd_register_transport.  This assumes fd_register_transport was
847    previously called on FD.  */
848
849 void *
850 fd_transport_context (int fd)
851 {
852   struct transport_info *info = hash_table_get (transport_map, (void *)(intptr_t) fd);
853   return info->ctx;
854 }
855
856 /* When fd_read/fd_write are called multiple times in a loop, they should
857    remember the INFO pointer instead of fetching it every time.  It is
858    not enough to compare FD to LAST_FD because FD might have been
859    closed and reopened.  modified_tick ensures that changes to
860    transport_map will not be unnoticed.
861
862    This is a macro because we want the static storage variables to be
863    per-function.  */
864
865 #define LAZY_RETRIEVE_INFO(info) do {                                   \
866   static struct transport_info *last_info;                              \
867   static int last_fd = -1;                                              \
868   static unsigned int last_tick;                                        \
869   if (!transport_map)                                                   \
870     info = NULL;                                                        \
871   else if (last_fd == fd && last_tick == transport_map_modified_tick)   \
872     info = last_info;                                                   \
873   else                                                                  \
874     {                                                                   \
875       info = hash_table_get (transport_map, (void *)(intptr_t) fd);     \
876       last_fd = fd;                                                     \
877       last_info = info;                                                 \
878       last_tick = transport_map_modified_tick;                          \
879     }                                                                   \
880 } while (0)
881
882 static bool
883 poll_internal (int fd, struct transport_info *info, int wf, double timeout)
884 {
885   if (timeout == -1)
886     timeout = opt.read_timeout;
887   if (timeout)
888     {
889       int test;
890       if (info && info->imp->poller)
891         test = info->imp->poller (fd, timeout, wf, info->ctx);
892       else
893         test = sock_poll (fd, timeout, wf);
894       if (test == 0)
895         errno = ETIMEDOUT;
896       if (test <= 0)
897         return false;
898     }
899   return true;
900 }
901
902 /* Read no more than BUFSIZE bytes of data from FD, storing them to
903    BUF.  If TIMEOUT is non-zero, the operation aborts if no data is
904    received after that many seconds.  If TIMEOUT is -1, the value of
905    opt.timeout is used for TIMEOUT.  */
906
907 int
908 fd_read (int fd, char *buf, int bufsize, double timeout)
909 {
910   struct transport_info *info;
911   LAZY_RETRIEVE_INFO (info);
912   if (!poll_internal (fd, info, WAIT_FOR_READ, timeout))
913     return -1;
914   if (info && info->imp->reader)
915     return info->imp->reader (fd, buf, bufsize, info->ctx);
916   else
917     return sock_read (fd, buf, bufsize);
918 }
919
920 /* Like fd_read, except it provides a "preview" of the data that will
921    be read by subsequent calls to fd_read.  Specifically, it copies no
922    more than BUFSIZE bytes of the currently available data to BUF and
923    returns the number of bytes copied.  Return values and timeout
924    semantics are the same as those of fd_read.
925
926    CAVEAT: Do not assume that the first subsequent call to fd_read
927    will retrieve the same amount of data.  Reading can return more or
928    less data, depending on the TCP implementation and other
929    circumstances.  However, barring an error, it can be expected that
930    all the peeked data will eventually be read by fd_read.  */
931
932 int
933 fd_peek (int fd, char *buf, int bufsize, double timeout)
934 {
935   struct transport_info *info;
936   LAZY_RETRIEVE_INFO (info);
937   if (!poll_internal (fd, info, WAIT_FOR_READ, timeout))
938     return -1;
939   if (info && info->imp->peeker)
940     return info->imp->peeker (fd, buf, bufsize, info->ctx);
941   else
942     return sock_peek (fd, buf, bufsize);
943 }
944
945 /* Write the entire contents of BUF to FD.  If TIMEOUT is non-zero,
946    the operation aborts if no data is received after that many
947    seconds.  If TIMEOUT is -1, the value of opt.timeout is used for
948    TIMEOUT.  */
949
950 int
951 fd_write (int fd, char *buf, int bufsize, double timeout)
952 {
953   int res;
954   struct transport_info *info;
955   LAZY_RETRIEVE_INFO (info);
956
957   /* `write' may write less than LEN bytes, thus the loop keeps trying
958      it until all was written, or an error occurred.  */
959   res = 0;
960   while (bufsize > 0)
961     {
962       if (!poll_internal (fd, info, WAIT_FOR_WRITE, timeout))
963         return -1;
964       if (info && info->imp->writer)
965         res = info->imp->writer (fd, buf, bufsize, info->ctx);
966       else
967         res = sock_write (fd, buf, bufsize);
968       if (res <= 0)
969         break;
970       buf += res;
971       bufsize -= res;
972     }
973   return res;
974 }
975
976 /* Report the most recent error(s) on FD.  This should only be called
977    after fd_* functions, such as fd_read and fd_write, and only if
978    they return a negative result.  For errors coming from other calls
979    such as setsockopt or fopen, strerror should continue to be
980    used.
981
982    If the transport doesn't support error messages or doesn't supply
983    one, strerror(errno) is returned.  The returned error message
984    should not be used after fd_close has been called.  */
985
986 const char *
987 fd_errstr (int fd)
988 {
989   /* Don't bother with LAZY_RETRIEVE_INFO, as this will only be called
990      in case of error, never in a tight loop.  */
991   struct transport_info *info = NULL;
992   if (transport_map)
993     info = hash_table_get (transport_map, (void *)(intptr_t) fd);
994
995   if (info && info->imp->errstr)
996     {
997       const char *err = info->imp->errstr (fd, info->ctx);
998       if (err)
999         return err;
1000       /* else, fall through and print the system error. */
1001     }
1002   return strerror (errno);
1003 }
1004
1005 /* Close the file descriptor FD.  */
1006
1007 void
1008 fd_close (int fd)
1009 {
1010   struct transport_info *info;
1011   if (fd < 0)
1012     return;
1013
1014   /* Don't use LAZY_RETRIEVE_INFO because fd_close() is only called once
1015      per socket, so that particular optimization wouldn't work.  */
1016   info = NULL;
1017   if (transport_map)
1018     info = hash_table_get (transport_map, (void *)(intptr_t) fd);
1019
1020   if (info && info->imp->closer)
1021     info->imp->closer (fd, info->ctx);
1022   else
1023     sock_close (fd);
1024
1025   if (info)
1026     {
1027       hash_table_remove (transport_map, (void *)(intptr_t) fd);
1028       xfree (info);
1029       ++transport_map_modified_tick;
1030     }
1031 }