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