1 /* Establishing and handling network connections.
2 Copyright (C) 1995, 1996, 1997, 2001, 2002 Free Software Foundation, Inc.
4 This file is part of GNU Wget.
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 In addition, as a special exception, the Free Software Foundation
21 gives permission to link the code of its release of Wget with the
22 OpenSSL project's "OpenSSL" library (or with modified versions of it
23 that use the same license as the "OpenSSL" library), and distribute
24 the linked executables. You must obey the GNU General Public License
25 in all respects for all of the code used other than "OpenSSL". If you
26 modify this file, you may extend this exception to your version of the
27 file, but you are not obligated to do so. If you do not wish to do
28 so, delete this exception statement from your version. */
34 #include <sys/types.h>
41 # include <sys/socket.h>
43 # include <netinet/in.h>
45 # include <arpa/inet.h>
47 #endif /* not WINDOWS */
54 #endif /* HAVE_STRING_H */
55 #ifdef HAVE_SYS_SELECT_H
56 # include <sys/select.h>
57 #endif /* HAVE_SYS_SELECT_H */
72 * This function takes a sockaddr struct and fills in the protocol
73 * type, the port number and the address. If ENABLE_IPV6 is defined,
74 * SA should really point to struct sockaddr_storage; otherwise, it
75 * should point to struct sockaddr_in.
78 * struct sockaddr* The space to be filled
79 * const ip_address The IP address
83 * - Only modifies 1st parameter.
86 sockaddr_set_data (struct sockaddr *sa, const ip_address *addr, int port)
88 if (addr->type == IPV4_ADDRESS)
90 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
91 sin->sin_family = AF_INET;
92 sin->sin_port = htons (port);
94 sin->sin_addr.s_addr = INADDR_ANY;
96 sin->sin_addr = ADDRESS_IPV4_IN_ADDR (addr);
99 else if (addr->type == IPV6_ADDRESS)
101 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
102 sin6->sin6_family = AF_INET6;
103 sin6->sin6_port = htons (port);
104 /* #### How can ADDR be NULL? We have dereferenced it above by
105 accessing addr->type! */
108 sin6->sin6_addr = in6addr_any;
109 /* #### Should we set the scope_id here? */
113 sin6->sin6_addr = ADDRESS_IPV6_IN6_ADDR (addr);
114 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
115 sin6->sin6_scope_id = ADDRESS_IPV6_SCOPE (addr);
119 #endif /* ENABLE_IPV6 */
124 /* Get the data of SA, specifically the IP address and the port. If
125 you're not interested in one or the other information, pass NULL as
129 sockaddr_get_data (const struct sockaddr *sa, ip_address *ip, int *port)
131 if (sa->sa_family == AF_INET)
133 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
136 ip->type = IPV4_ADDRESS;
137 ADDRESS_IPV4_IN_ADDR (ip) = sin->sin_addr;
140 *port = ntohs (sin->sin_port);
143 else if (sa->sa_family == AF_INET6)
145 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
148 ip->type = IPV6_ADDRESS;
149 ADDRESS_IPV6_IN6_ADDR (ip) = sin6->sin6_addr;
150 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
151 ADDRESS_IPV6_SCOPE (ip) = sin6->sin6_scope_id;
155 *port = ntohs (sin6->sin6_port);
162 /* Return the size of the sockaddr structure depending on its
166 sockaddr_size (const struct sockaddr *sa)
168 switch (sa->sa_family)
171 return sizeof (struct sockaddr_in);
174 return sizeof (struct sockaddr_in6);
178 return 0; /* so the compiler shuts up. */
183 resolve_bind_address (const char *host, struct sockaddr *sa, int flags)
185 struct address_list *al;
187 /* #### Shouldn't we do this only once? opt.bind_address won't
188 change during a Wget run! */
190 al = lookup_host (host, flags | LH_SILENT | LH_PASSIVE);
193 logprintf (LOG_NOTQUIET,
194 _("Unable to convert `%s' to a bind address. Reverting to ANY.\n"),
199 /* Pick the first address in the list and use it as bind address.
200 Perhaps we should try multiple addresses, but I don't think
201 that's necessary in practice. */
202 sockaddr_set_data (sa, address_list_address_at (al, 0), 0);
203 address_list_release (al);
209 const struct sockaddr *addr;
215 connect_with_timeout_callback (void *arg)
217 struct cwt_context *ctx = (struct cwt_context *)arg;
218 ctx->result = connect (ctx->fd, ctx->addr, ctx->addrlen);
221 /* Like connect, but specifies a timeout. If connecting takes longer
222 than TIMEOUT seconds, -1 is returned and errno is set to
226 connect_with_timeout (int fd, const struct sockaddr *addr, socklen_t addrlen,
229 struct cwt_context ctx;
232 ctx.addrlen = addrlen;
234 if (run_with_timeout (timeout, connect_with_timeout_callback, &ctx))
239 if (ctx.result == -1 && errno == EINTR)
244 /* Connect to a remote endpoint whose IP address is known. */
247 connect_to_ip (const ip_address *ip, int port, const char *print)
249 struct sockaddr_storage ss;
250 struct sockaddr *sa = (struct sockaddr *)&ss;
251 int sock, save_errno;
253 /* If PRINT is non-NULL, print the "Connecting to..." line, with
254 PRINT being the host name we're connecting to. */
257 const char *txt_addr = pretty_print_address (ip);
258 if (print && 0 != strcmp (print, txt_addr))
259 logprintf (LOG_VERBOSE,
260 _("Connecting to %s{%s}:%d... "), print, txt_addr, port);
262 logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port);
265 /* Store the sockaddr info to SA. */
266 sockaddr_set_data (sa, ip, port);
268 /* Create the socket of the family appropriate for the address. */
269 sock = socket (sa->sa_family, SOCK_STREAM, 0);
273 /* For very small rate limits, set the buffer size (and hence,
274 hopefully, the kernel's TCP window size) to the per-second limit.
275 That way we should never have to sleep for more than 1s between
277 if (opt.limit_rate && opt.limit_rate < 8192)
279 int bufsize = opt.limit_rate;
281 bufsize = 512; /* avoid pathologically small values */
283 setsockopt (sock, SOL_SOCKET, SO_RCVBUF,
284 (void *)&bufsize, (socklen_t)sizeof (bufsize));
286 /* When we add limit_rate support for writing, which is useful
287 for POST, we should also set SO_SNDBUF here. */
290 if (opt.bind_address)
292 /* Bind the client side of the socket to the requested
294 struct sockaddr_storage bind_ss;
295 struct sockaddr *bind_sa = (struct sockaddr *)&bind_ss;
296 if (resolve_bind_address (opt.bind_address, bind_sa, 0))
298 if (bind (sock, bind_sa, sockaddr_size (bind_sa)) < 0)
307 /* Connect the socket to the remote endpoint. */
308 if (connect_with_timeout (sock, sa, sockaddr_size (sa),
309 opt.connect_timeout) < 0)
321 logprintf (LOG_VERBOSE, _("connected.\n"));
322 DEBUGP (("Created socket %d.\n", sock));
328 logprintf (LOG_VERBOSE, "failed: %s.\n", strerror (errno));
335 /* Connect to a remote endpoint specified by host name. */
338 connect_to_host (const char *host, int port)
341 struct address_list *al;
345 al = lookup_host (host, 0);
349 address_list_get_bounds (al, &start, &end);
350 for (i = start; i < end; i++)
352 const ip_address *ip = address_list_address_at (al, i);
353 sock = connect_to_ip (ip, port, host);
358 address_list_set_faulty (al, i);
360 /* The attempt to connect has failed. Continue with the loop
361 and try next address. */
363 address_list_release (al);
365 if (sock < 0 && address_list_cached_p (al))
367 /* We were unable to connect to any address in a list we've
368 obtained from cache. There is a possibility that the host is
369 under dynamic DNS and has changed its address. Resolve it
371 forget_host_lookup (host);
379 test_socket_open (int sock)
385 /* Check if we still have a valid (non-EOF) connection. From Andrew
386 * Maholski's code in the Unix Socket FAQ. */
388 FD_ZERO (&check_set);
389 FD_SET (sock, &check_set);
391 /* Wait one microsecond */
395 /* If we get a timeout, then that means still connected */
396 if (select (sock + 1, &check_set, NULL, NULL, &to) == 0)
398 /* Connection is valid (not EOF), so continue */
404 /* Without select, it's hard to know for sure. */
409 /* Create a socket and bind it to PORT locally. Calling accept() on
410 such a socket waits for and accepts incoming TCP connections. The
411 resulting socket is stored to LOCAL_SOCK. */
414 bindport (const ip_address *bind_address, int *port, int *local_sock)
417 int family = AF_INET;
419 struct sockaddr_storage ss;
420 struct sockaddr *sa = (struct sockaddr *)&ss;
421 memset (&ss, 0, sizeof (ss));
424 if (bind_address->type == IPV6_ADDRESS)
428 if ((msock = socket (family, SOCK_STREAM, 0)) < 0)
433 if (setsockopt (msock, SOL_SOCKET, SO_REUSEADDR,
434 (void *)&optval, (socklen_t)sizeof (optval)) < 0)
442 # ifdef HAVE_IPV6_V6ONLY
443 if (family == AF_INET6)
446 /* if setsockopt fails, go on anyway */
447 setsockopt (msock, IPPROTO_IPV6, IPV6_V6ONLY,
448 (void *)&optval, (socklen_t)sizeof (optval));
453 sockaddr_set_data (sa, bind_address, *port);
454 if (bind (msock, sa, sockaddr_size (sa)) < 0)
459 DEBUGP (("Local socket fd %d bound.\n", msock));
462 socklen_t sa_len = sockaddr_size (sa);
463 if (getsockname (msock, sa, &sa_len) < 0)
468 sockaddr_get_data (sa, NULL, port);
469 DEBUGP (("binding to address %s using port %i.\n",
470 pretty_print_address (bind_address), *port));
472 if (listen (msock, 1) < 0)
482 /* Wait for file descriptor FD to be available, timing out after
483 MAXTIME seconds. "Available" means readable if writep is 0,
486 Returns 1 if FD is available, 0 for timeout and -1 for error. */
489 select_fd (int fd, double maxtime, int writep)
492 fd_set *rd = NULL, *wrt = NULL;
493 struct timeval tmout;
498 *(writep ? &wrt : &rd) = &fds;
500 tmout.tv_sec = (long)maxtime;
501 tmout.tv_usec = 1000000L * (maxtime - (long)maxtime);
504 result = select (fd + 1, rd, wrt, NULL, &tmout);
505 while (result < 0 && errno == EINTR);
507 /* When we've timed out, set errno to ETIMEDOUT for the convenience
514 #endif /* HAVE_SELECT */
516 /* Accept a connection on LOCAL_SOCK, and store the new socket to
517 *SOCK. It blocks the caller until a connection is established. If
518 no connection is established for opt.connect_timeout seconds, the
519 function exits with an error status. */
522 acceptport (int local_sock, int *sock)
524 struct sockaddr_storage ss;
525 struct sockaddr *sa = (struct sockaddr *)&ss;
526 socklen_t addrlen = sizeof (ss);
529 if (select_fd (local_sock, opt.connect_timeout, 0) <= 0)
532 if ((*sock = accept (local_sock, sa, &addrlen)) < 0)
534 DEBUGP (("Created socket fd %d.\n", *sock));
538 /* Return the local IP address associated with the connection on FD. */
541 conaddr (int fd, ip_address *ip)
543 struct sockaddr_storage storage;
544 struct sockaddr *sockaddr = (struct sockaddr *)&storage;
545 socklen_t addrlen = sizeof (storage);
547 if (getsockname (fd, sockaddr, &addrlen) < 0)
550 switch (sockaddr->sa_family)
555 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&storage;
556 ip->type = IPV6_ADDRESS;
557 ADDRESS_IPV6_IN6_ADDR (ip) = sa6->sin6_addr;
558 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
559 ADDRESS_IPV6_SCOPE (ip) = sa6->sin6_scope_id;
561 DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
567 struct sockaddr_in *sa = (struct sockaddr_in *)&storage;
568 ip->type = IPV4_ADDRESS;
569 ADDRESS_IPV4_IN_ADDR (ip) = sa->sin_addr;
570 DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
580 /* Read at most LEN bytes from FD, storing them to BUF. This is
581 virtually the same as read(), but takes care of EINTR braindamage
582 and uses select() to timeout the stale connections (a connection is
583 stale if more than OPT.READ_TIMEOUT time is spent in select() or
587 iread (int fd, char *buf, int len)
592 if (opt.read_timeout)
593 if (select_fd (fd, opt.read_timeout, 0) <= 0)
597 res = READ (fd, buf, len);
598 while (res == -1 && errno == EINTR);
603 /* Write LEN bytes from BUF to FD. This is similar to iread(), but
604 unlike iread(), it makes sure that all of BUF is actually written
605 to FD, so callers needn't bother with checking that the return
606 value equals to LEN. Instead, you should simply check for -1. */
609 iwrite (int fd, char *buf, int len)
613 /* `write' may write less than LEN bytes, thus the outward loop
614 keeps trying it until all was written, or an error occurred. The
615 inner loop is reserved for the usual EINTR f*kage, and the
616 innermost loop deals with the same during select(). */
620 if (opt.read_timeout)
621 if (select_fd (fd, opt.read_timeout, 1) <= 0)
625 res = WRITE (fd, buf, len);
626 while (res == -1 && errno == EINTR);