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