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