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