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;
237 int sock, save_errno;
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)
293 /* Connect the socket to the remote endpoint. */
294 if (connect_with_timeout (sock, sa, sockaddr_size (sa),
295 opt.connect_timeout) < 0)
307 logprintf (LOG_VERBOSE, _("connected.\n"));
308 DEBUGP (("Created socket %d.\n", sock));
314 logprintf (LOG_VERBOSE, "failed: %s.\n", strerror (errno));
321 /* Connect to a remote endpoint specified by host name. */
324 connect_to_host (const char *host, int port)
327 struct address_list *al;
331 al = lookup_host (host, 0);
335 address_list_get_bounds (al, &start, &end);
336 for (i = start; i < end; i++)
338 const ip_address *ip = address_list_address_at (al, i);
339 sock = connect_to_ip (ip, port, host);
344 address_list_set_faulty (al, i);
346 /* The attempt to connect has failed. Continue with the loop
347 and try next address. */
349 address_list_release (al);
351 if (sock < 0 && address_list_cached_p (al))
353 /* We were unable to connect to any address in a list we've
354 obtained from cache. There is a possibility that the host is
355 under dynamic DNS and has changed its address. Resolve it
357 forget_host_lookup (host);
365 test_socket_open (int sock)
371 /* Check if we still have a valid (non-EOF) connection. From Andrew
372 * Maholski's code in the Unix Socket FAQ. */
374 FD_ZERO (&check_set);
375 FD_SET (sock, &check_set);
377 /* Wait one microsecond */
381 /* If we get a timeout, then that means still connected */
382 if (select (sock + 1, &check_set, NULL, NULL, &to) == 0)
384 /* Connection is valid (not EOF), so continue */
390 /* Without select, it's hard to know for sure. */
395 /* Create a socket and bind it to PORT locally. Calling accept() on
396 such a socket waits for and accepts incoming TCP connections. The
397 resulting socket is stored to LOCAL_SOCK. */
400 bindport (const ip_address *bind_address, int *port, int *local_sock)
403 int family = AF_INET;
405 struct sockaddr_storage ss;
406 struct sockaddr *sa = (struct sockaddr *)&ss;
410 if (bind_address->type == IPV6_ADDRESS)
414 if ((msock = socket (family, SOCK_STREAM, 0)) < 0)
419 if (setsockopt (msock, SOL_SOCKET, SO_REUSEADDR,
420 (void *)&optval, (socklen_t)sizeof (optval)) < 0)
428 # ifdef HAVE_IPV6_V6ONLY
429 if (family == AF_INET6)
432 /* if setsockopt fails, go on anyway */
433 setsockopt (msock, IPPROTO_IPV6, IPV6_V6ONLY,
434 (void *)&optval, (socklen_t)sizeof (optval));
439 sockaddr_set_data (sa, bind_address, *port);
440 if (bind (msock, sa, sockaddr_size (sa)) < 0)
445 DEBUGP (("Local socket fd %d bound.\n", msock));
448 socklen_t sa_len = sockaddr_size (sa);
449 if (getsockname (msock, sa, &sa_len) < 0)
454 sockaddr_get_data (sa, NULL, port);
455 DEBUGP (("binding to address %s using port %i.\n",
456 pretty_print_address (bind_address), *port));
458 if (listen (msock, 1) < 0)
468 /* Wait for file descriptor FD to be readable or writable or both,
469 timing out after MAXTIME seconds. Returns 1 if FD is available, 0
470 for timeout and -1 for error. The argument WHAT can be a
471 combination of WAIT_READ and WAIT_WRITE.
473 This is a mere convenience wrapper around the select call, and
474 should be taken as such. */
477 select_fd (int fd, double maxtime, int wait)
480 fd_set *rd = NULL, *wr = NULL;
481 struct timeval tmout;
486 if (wait & WAIT_READ)
488 if (wait & WAIT_WRITE)
491 tmout.tv_sec = (long)maxtime;
492 tmout.tv_usec = 1000000L * (maxtime - (long)maxtime);
495 result = select (fd + 1, rd, wr, NULL, &tmout);
496 while (result < 0 && errno == EINTR);
498 /* When we've timed out, set errno to ETIMEDOUT for the convenience
505 #endif /* HAVE_SELECT */
507 /* Accept a connection on LOCAL_SOCK, and store the new socket to
508 *SOCK. It blocks the caller until a connection is established. If
509 no connection is established for opt.connect_timeout seconds, the
510 function exits with an error status. */
513 acceptport (int local_sock, int *sock)
515 struct sockaddr_storage ss;
516 struct sockaddr *sa = (struct sockaddr *)&ss;
517 socklen_t addrlen = sizeof (ss);
520 if (opt.connect_timeout)
521 if (select_fd (local_sock, opt.connect_timeout, WAIT_READ) <= 0)
524 if ((*sock = accept (local_sock, sa, &addrlen)) < 0)
526 DEBUGP (("Created socket fd %d.\n", *sock));
530 /* Return the local IP address associated with the connection on FD. */
533 conaddr (int fd, ip_address *ip)
535 struct sockaddr_storage storage;
536 struct sockaddr *sockaddr = (struct sockaddr *)&storage;
537 socklen_t addrlen = sizeof (storage);
539 if (getsockname (fd, sockaddr, &addrlen) < 0)
542 switch (sockaddr->sa_family)
547 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&storage;
548 ip->type = IPV6_ADDRESS;
549 ADDRESS_IPV6_IN6_ADDR (ip) = sa6->sin6_addr;
550 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
551 ADDRESS_IPV6_SCOPE (ip) = sa6->sin6_scope_id;
553 DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
559 struct sockaddr_in *sa = (struct sockaddr_in *)&storage;
560 ip->type = IPV4_ADDRESS;
561 ADDRESS_IPV4_IN_ADDR (ip) = sa->sin_addr;
562 DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
572 /* Read at most LEN bytes from FD, storing them to BUF. This is
573 virtually the same as read(), but takes care of EINTR braindamage
574 and uses select() to timeout the stale connections (a connection is
575 stale if more than OPT.READ_TIMEOUT time is spent in select() or
579 iread (int fd, char *buf, int len)
584 if (opt.read_timeout)
585 if (select_fd (fd, opt.read_timeout, WAIT_READ) <= 0)
589 res = READ (fd, buf, len);
590 while (res == -1 && errno == EINTR);
595 /* Write LEN bytes from BUF to FD. This is similar to iread(), but
596 unlike iread(), it makes sure that all of BUF is actually written
597 to FD, so callers needn't bother with checking that the return
598 value equals to LEN. Instead, you should simply check for -1. */
601 iwrite (int fd, char *buf, int len)
605 /* `write' may write less than LEN bytes, thus the outward loop
606 keeps trying it until all was written, or an error occurred. The
607 inner loop is reserved for the usual EINTR f*kage, and the
608 innermost loop deals with the same during select(). */
612 if (opt.read_timeout)
613 if (select_fd (fd, opt.read_timeout, WAIT_WRITE) <= 0)
617 res = WRITE (fd, buf, len);
618 while (res == -1 && errno == EINTR);