/* Establishing and handling network connections.
- Copyright (C) 1995, 1996, 1997, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1996-2005 Free Software Foundation, Inc.
This file is part of GNU Wget.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with Wget; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+along with Wget; if not, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
In addition, as a special exception, the Free Software Foundation
gives permission to link the code of its release of Wget with the
}
}
\f
-static int
+/* Resolve the bind address specified via --bind-address and store it
+ to SA. The resolved value is stored in a static variable and
+ reused after the first invocation of this function.
+
+ Returns true on success, false on failure. */
+
+static bool
resolve_bind_address (struct sockaddr *sa)
{
struct address_list *al;
/* Make sure this is called only once. opt.bind_address doesn't
change during a Wget run. */
- static int called, should_bind;
+ static bool called, should_bind;
static ip_address ip;
if (called)
{
sockaddr_set_data (sa, &ip, 0);
return should_bind;
}
- called = 1;
+ called = true;
al = lookup_host (opt.bind_address, LH_BIND | LH_SILENT);
if (!al)
logprintf (LOG_NOTQUIET,
_("%s: unable to resolve bind address `%s'; disabling bind.\n"),
exec_name, opt.bind_address);
- should_bind = 0;
- return 0;
+ should_bind = false;
+ return false;
}
/* Pick the first address in the list and use it as bind address.
address_list_release (al);
sockaddr_set_data (sa, &ip, 0);
- should_bind = 1;
- return 1;
+ should_bind = true;
+ return true;
}
\f
struct cwt_context {
PRINT being the host name we're connecting to. */
if (print)
{
- const char *txt_addr = pretty_print_address (ip);
+ const char *txt_addr = print_address (ip);
if (print && 0 != strcmp (print, txt_addr))
logprintf (LOG_VERBOSE, _("Connecting to %s|%s|:%d... "),
escnonprint (print), txt_addr, port);
return -1;
}
sockaddr_get_data (sa, NULL, port);
- DEBUGP (("binding to address %s using port %i.\n",
- pretty_print_address (bind_address), *port));
+ DEBUGP (("binding to address %s using port %i.\n",
+ print_address (bind_address), *port));
}
if (listen (sock, 1) < 0)
{
}
/* Get the IP address associated with the connection on FD and store
- it to IP. Return 1 on success, 0 otherwise.
+ it to IP. Return true on success, false otherwise.
If ENDPOINT is ENDPOINT_LOCAL, it returns the address of the local
(client) side of the socket. Else if ENDPOINT is ENDPOINT_PEER, it
returns the address of the remote (peer's) side of the socket. */
-int
+bool
socket_ip_address (int sock, ip_address *ip, int endpoint)
{
struct sockaddr_storage storage;
else
abort ();
if (ret < 0)
- return 0;
+ return false;
switch (sockaddr->sa_family)
{
#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
ADDRESS_IPV6_SCOPE (ip) = sa6->sin6_scope_id;
#endif
- DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
- return 1;
+ DEBUGP (("conaddr is: %s\n", print_address (ip)));
+ return true;
}
#endif
case AF_INET:
struct sockaddr_in *sa = (struct sockaddr_in *)&storage;
ip->type = IPV4_ADDRESS;
ADDRESS_IPV4_IN_ADDR (ip) = sa->sin_addr;
- DEBUGP (("conaddr is: %s\n", pretty_print_address (ip)));
- return 1;
+ DEBUGP (("conaddr is: %s\n", print_address (ip)));
+ return true;
}
default:
abort ();
}
}
-/* Return non-zero if the error from the connect code can be
- considered retryable. Wget normally retries after errors, but the
- exception are the "unsupported protocol" type errors (possible on
- IPv4/IPv6 dual family systems) and "connection refused". */
+/* Return true if the error from the connect code can be considered
+ retryable. Wget normally retries after errors, but the exception
+ are the "unsupported protocol" type errors (possible on IPv4/IPv6
+ dual family systems) and "connection refused". */
-int
+bool
retryable_socket_connect_error (int err)
{
/* Have to guard against some of these values not being defined.
Cannot use a switch statement because some of the values might be
equal. */
- if (0
+ if (false
#ifdef EAFNOSUPPORT
|| err == EAFNOSUPPORT
#endif
instead of EAFNOSUPPORT and such. */
|| err == EINVAL
)
- return 0;
+ return false;
if (!opt.retry_connrefused)
if (err == ECONNREFUSED
|| err == EHOSTUNREACH /* host is unreachable */
#endif
)
- return 0;
+ return false;
- return 1;
+ return true;
}
/* Wait for a single descriptor to become available, timing out after
return result;
}
-int
+bool
test_socket_open (int sock)
{
fd_set check_set;
if (select (sock + 1, &check_set, NULL, NULL, &to) == 0)
{
/* Connection is valid (not EOF), so continue */
- return 1;
+ return true;
}
else
- return 0;
+ return false;
}
\f
/* Basic socket operations, mostly EINTR wrappers. */
} \
} while (0)
-static int
+static bool
poll_internal (int fd, struct transport_info *info, int wf, double timeout)
{
if (timeout == -1)
if (test == 0)
errno = ETIMEDOUT;
if (test <= 0)
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* Read no more than BUFSIZE bytes of data from FD, storing them to