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