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 */
69 /* Fill SA as per the data in IP and PORT. SA shoult point to struct
70 sockaddr_storage if ENABLE_IPV6 is defined, to struct sockaddr_in
74 sockaddr_set_data (struct sockaddr *sa, const ip_address *ip, int port)
80 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
81 sin->sin_family = AF_INET;
82 sin->sin_port = htons (port);
83 sin->sin_addr = ADDRESS_IPV4_IN_ADDR (ip);
89 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
90 sin6->sin6_family = AF_INET6;
91 sin6->sin6_port = htons (port);
92 sin6->sin6_addr = ADDRESS_IPV6_IN6_ADDR (ip);
93 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
94 sin6->sin6_scope_id = ADDRESS_IPV6_SCOPE (ip);
98 #endif /* ENABLE_IPV6 */
104 /* Get the data of SA, specifically the IP address and the port. If
105 you're not interested in one or the other information, pass NULL as
109 sockaddr_get_data (const struct sockaddr *sa, ip_address *ip, int *port)
111 switch (sa->sa_family)
115 struct sockaddr_in *sin = (struct sockaddr_in *)sa;
118 ip->type = IPV4_ADDRESS;
119 ADDRESS_IPV4_IN_ADDR (ip) = sin->sin_addr;
122 *port = ntohs (sin->sin_port);
128 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
131 ip->type = IPV6_ADDRESS;
132 ADDRESS_IPV6_IN6_ADDR (ip) = sin6->sin6_addr;
133 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
134 ADDRESS_IPV6_SCOPE (ip) = sin6->sin6_scope_id;
138 *port = ntohs (sin6->sin6_port);
147 /* Return the size of the sockaddr structure depending on its
151 sockaddr_size (const struct sockaddr *sa)
153 switch (sa->sa_family)
156 return sizeof (struct sockaddr_in);
159 return sizeof (struct sockaddr_in6);
163 return 0; /* so the compiler shuts up. */
168 resolve_bind_address (const char *host, struct sockaddr *sa, int flags)
170 struct address_list *al;
172 /* #### Shouldn't we do this only once? opt.bind_address won't
173 change during a Wget run! */
175 al = lookup_host (host, flags | LH_SILENT | LH_PASSIVE);
178 /* #### We should print the error message here. */
179 logprintf (LOG_NOTQUIET,
180 _("%s: unable to resolve bind address `%s'; disabling bind.\n"),
181 exec_name, opt.bind_address);
185 /* Pick the first address in the list and use it as bind address.
186 Perhaps we should try multiple addresses, but I don't think
187 that's necessary in practice. */
188 sockaddr_set_data (sa, address_list_address_at (al, 0), 0);
189 address_list_release (al);
195 const struct sockaddr *addr;
201 connect_with_timeout_callback (void *arg)
203 struct cwt_context *ctx = (struct cwt_context *)arg;
204 ctx->result = connect (ctx->fd, ctx->addr, ctx->addrlen);
207 /* Like connect, but specifies a timeout. If connecting takes longer
208 than TIMEOUT seconds, -1 is returned and errno is set to
212 connect_with_timeout (int fd, const struct sockaddr *addr, socklen_t addrlen,
215 struct cwt_context ctx;
218 ctx.addrlen = addrlen;
220 if (run_with_timeout (timeout, connect_with_timeout_callback, &ctx))
225 if (ctx.result == -1 && errno == EINTR)
230 /* Connect to a remote endpoint whose IP address is known. */
233 connect_to_ip (const ip_address *ip, int port, const char *print)
235 struct sockaddr_storage ss;
236 struct sockaddr *sa = (struct sockaddr *)&ss;
239 /* If PRINT is non-NULL, print the "Connecting to..." line, with
240 PRINT being the host name we're connecting to. */
243 const char *txt_addr = pretty_print_address (ip);
244 if (print && 0 != strcmp (print, txt_addr))
245 logprintf (LOG_VERBOSE,
246 _("Connecting to %s|%s|:%d... "), print, txt_addr, port);
248 logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port);
251 /* Store the sockaddr info to SA. */
252 sockaddr_set_data (sa, ip, port);
254 /* Create the socket of the family appropriate for the address. */
255 sock = socket (sa->sa_family, SOCK_STREAM, 0);
259 /* For very small rate limits, set the buffer size (and hence,
260 hopefully, the kernel's TCP window size) to the per-second limit.
261 That way we should never have to sleep for more than 1s between
263 if (opt.limit_rate && opt.limit_rate < 8192)
265 int bufsize = opt.limit_rate;
267 bufsize = 512; /* avoid pathologically small values */
269 setsockopt (sock, SOL_SOCKET, SO_RCVBUF,
270 (void *)&bufsize, (socklen_t)sizeof (bufsize));
272 /* When we add limit_rate support for writing, which is useful
273 for POST, we should also set SO_SNDBUF here. */
276 if (opt.bind_address)
278 /* Bind the client side of the socket to the requested
280 struct sockaddr_storage bind_ss;
281 struct sockaddr *bind_sa = (struct sockaddr *)&bind_ss;
282 if (resolve_bind_address (opt.bind_address, bind_sa, 0))
284 if (bind (sock, bind_sa, sockaddr_size (bind_sa)) < 0)
289 /* Connect the socket to the remote endpoint. */
290 if (connect_with_timeout (sock, sa, sockaddr_size (sa),
291 opt.connect_timeout) < 0)
297 logprintf (LOG_VERBOSE, _("connected.\n"));
298 DEBUGP (("Created socket %d.\n", sock));
303 /* Protect errno from possible modifications by close and
305 int save_errno = errno;
309 logprintf (LOG_VERBOSE, "failed: %s.\n", strerror (errno));
315 /* Connect to a remote endpoint specified by host name. */
318 connect_to_host (const char *host, int port)
321 struct address_list *al;
325 al = lookup_host (host, 0);
329 address_list_get_bounds (al, &start, &end);
330 for (i = start; i < end; i++)
332 const ip_address *ip = address_list_address_at (al, i);
333 sock = connect_to_ip (ip, port, host);
338 address_list_set_faulty (al, i);
340 /* The attempt to connect has failed. Continue with the loop
341 and try next address. */
343 address_list_release (al);
345 if (sock < 0 && address_list_cached_p (al))
347 /* We were unable to connect to any address in a list we've
348 obtained from cache. There is a possibility that the host is
349 under dynamic DNS and has changed its address. Resolve it
351 forget_host_lookup (host);
359 test_socket_open (int sock)
365 /* Check if we still have a valid (non-EOF) connection. From Andrew
366 * Maholski's code in the Unix Socket FAQ. */
368 FD_ZERO (&check_set);
369 FD_SET (sock, &check_set);
371 /* Wait one microsecond */
375 /* If we get a timeout, then that means still connected */
376 if (select (sock + 1, &check_set, NULL, NULL, &to) == 0)
378 /* Connection is valid (not EOF), so continue */
384 /* Without select, it's hard to know for sure. */
389 /* Create a socket and bind it to PORT locally. Calling accept() on
390 such a socket waits for and accepts incoming TCP connections. The
391 resulting socket is stored to LOCAL_SOCK. */
394 bindport (const ip_address *bind_address, int *port, int *local_sock)
397 int family = AF_INET;
398 struct sockaddr_storage ss;
399 struct sockaddr *sa = (struct sockaddr *)&ss;
402 /* For setting options with setsockopt. */
404 void *setopt_ptr = (void *)&setopt_val;
405 socklen_t setopt_size = sizeof (setopt_val);
408 if (bind_address->type == IPV6_ADDRESS)
412 if ((sock = socket (family, SOCK_STREAM, 0)) < 0)
416 setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, setopt_ptr, setopt_size);
420 # ifdef HAVE_IPV6_V6ONLY
421 if (family == AF_INET6)
422 setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, setopt_ptr, setopt_size);
426 sockaddr_set_data (sa, bind_address, *port);
427 if (bind (sock, sa, sockaddr_size (sa)) < 0)
432 DEBUGP (("Local socket fd %d bound.\n", sock));
435 socklen_t sa_len = sockaddr_size (sa);
436 if (getsockname (sock, sa, &sa_len) < 0)
441 sockaddr_get_data (sa, NULL, port);
442 DEBUGP (("binding to address %s using port %i.\n",
443 pretty_print_address (bind_address), *port));
445 if (listen (sock, 1) < 0)
455 /* Wait for file descriptor FD to be readable or writable or both,
456 timing out after MAXTIME seconds. Returns 1 if FD is available, 0
457 for timeout and -1 for error. The argument WHAT can be a
458 combination of WAIT_READ and WAIT_WRITE.
460 This is a mere convenience wrapper around the select call, and
461 should be taken as such. */
464 select_fd (int fd, double maxtime, int wait)
467 fd_set *rd = NULL, *wr = NULL;
468 struct timeval tmout;
473 if (wait & WAIT_READ)
475 if (wait & WAIT_WRITE)
478 tmout.tv_sec = (long)maxtime;
479 tmout.tv_usec = 1000000L * (maxtime - (long)maxtime);
482 result = select (fd + 1, rd, wr, NULL, &tmout);
483 while (result < 0 && errno == EINTR);
485 /* When we've timed out, set errno to ETIMEDOUT for the convenience
492 #endif /* HAVE_SELECT */
494 /* Accept a connection on LOCAL_SOCK, and store the new socket to
495 *SOCK. It blocks the caller until a connection is established. If
496 no connection is established for opt.connect_timeout seconds, the
497 function exits with an error status. */
500 acceptport (int local_sock, int *sock)
502 struct sockaddr_storage ss;
503 struct sockaddr *sa = (struct sockaddr *)&ss;
504 socklen_t addrlen = sizeof (ss);
507 if (opt.connect_timeout)
508 if (select_fd (local_sock, opt.connect_timeout, WAIT_READ) <= 0)
511 if ((*sock = accept (local_sock, sa, &addrlen)) < 0)
513 DEBUGP (("Created socket fd %d.\n", *sock));
517 /* Return the local IP address associated with the connection on FD. */
520 conaddr (int fd, ip_address *ip)
522 struct sockaddr_storage storage;
523 struct sockaddr *sockaddr = (struct sockaddr *)&storage;
524 socklen_t addrlen = sizeof (storage);
526 if (getsockname (fd, sockaddr, &addrlen) < 0)
529 switch (sockaddr->sa_family)
534 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&storage;
535 ip->type = IPV6_ADDRESS;
536 ADDRESS_IPV6_IN6_ADDR (ip) = sa6->sin6_addr;
537 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
538 ADDRESS_IPV6_SCOPE (ip) = sa6->sin6_scope_id;
540 DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
546 struct sockaddr_in *sa = (struct sockaddr_in *)&storage;
547 ip->type = IPV4_ADDRESS;
548 ADDRESS_IPV4_IN_ADDR (ip) = sa->sin_addr;
549 DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
559 /* Read at most LEN bytes from FD, storing them to BUF. This is
560 virtually the same as read(), but takes care of EINTR braindamage
561 and uses select() to timeout the stale connections (a connection is
562 stale if more than OPT.READ_TIMEOUT time is spent in select() or
566 iread (int fd, char *buf, int len)
571 if (opt.read_timeout)
572 if (select_fd (fd, opt.read_timeout, WAIT_READ) <= 0)
576 res = READ (fd, buf, len);
577 while (res == -1 && errno == EINTR);
582 /* Write LEN bytes from BUF to FD. This is similar to iread(), but
583 unlike iread(), it makes sure that all of BUF is actually written
584 to FD, so callers needn't bother with checking that the return
585 value equals to LEN. Instead, you should simply check for -1. */
588 iwrite (int fd, char *buf, int len)
592 /* `write' may write less than LEN bytes, thus the outward loop
593 keeps trying it until all was written, or an error occurred. The
594 inner loop is reserved for the usual EINTR f*kage, and the
595 innermost loop deals with the same during select(). */
599 if (opt.read_timeout)
600 if (select_fd (fd, opt.read_timeout, WAIT_WRITE) <= 0)
604 res = WRITE (fd, buf, len);
605 while (res == -1 && errno == EINTR);