mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Don't reuse IP addresses proven to be faulty, unless only such ones remain.
Published in <sxs8zcsfemf.fsf@florida.arsdigita.de>.
This commit is contained in:
parent
54204251bf
commit
8196a09904
@ -1,3 +1,12 @@
|
|||||||
|
2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
|
||||||
|
|
||||||
|
* connect.c (connect_to_many): Use address_list_set_faulty to
|
||||||
|
prevent the faulty address from being reused.
|
||||||
|
|
||||||
|
* host.c (address_list_set_faulty): New function.
|
||||||
|
(address_list_get_bounds): New function, instead of
|
||||||
|
address_list_count.
|
||||||
|
|
||||||
2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
|
2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
|
||||||
|
|
||||||
* url.c (convert_links): Don't translate %d-%d.
|
* url.c (convert_links): Don't translate %d-%d.
|
||||||
|
@ -146,9 +146,10 @@ connect_to_one (const unsigned char *addr, unsigned short port, int silent)
|
|||||||
int
|
int
|
||||||
connect_to_many (struct address_list *al, unsigned short port, int silent)
|
connect_to_many (struct address_list *al, unsigned short port, int silent)
|
||||||
{
|
{
|
||||||
int i;
|
int i, start, end;
|
||||||
|
|
||||||
for (i = 0; i < address_list_count (al); i++)
|
address_list_get_bounds (al, &start, &end);
|
||||||
|
for (i = start; i < end; i++)
|
||||||
{
|
{
|
||||||
unsigned char addr[4];
|
unsigned char addr[4];
|
||||||
int sock;
|
int sock;
|
||||||
@ -156,10 +157,10 @@ connect_to_many (struct address_list *al, unsigned short port, int silent)
|
|||||||
|
|
||||||
sock = connect_to_one (addr, port, silent);
|
sock = connect_to_one (addr, port, silent);
|
||||||
if (sock >= 0)
|
if (sock >= 0)
|
||||||
|
/* Success. */
|
||||||
return sock;
|
return sock;
|
||||||
|
|
||||||
/* Perhaps we should have a way of removing the failing entry
|
address_list_set_faulty (al, i);
|
||||||
from the address list? */
|
|
||||||
|
|
||||||
/* The attempt to connect has failed. Continue with the loop
|
/* The attempt to connect has failed. Continue with the loop
|
||||||
and try next address. */
|
and try next address. */
|
||||||
|
27
src/host.c
27
src/host.c
@ -72,18 +72,21 @@ struct address_list {
|
|||||||
int count; /* number of adrresses */
|
int count; /* number of adrresses */
|
||||||
unsigned char *buffer; /* buffer which holds all of them. */
|
unsigned char *buffer; /* buffer which holds all of them. */
|
||||||
|
|
||||||
|
int faulty; /* number of addresses known not to
|
||||||
|
work. */
|
||||||
int refcount; /* so we know whether to free it or
|
int refcount; /* so we know whether to free it or
|
||||||
not. */
|
not. */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ADDR_LOCATION(al, index) ((al)->buffer + index * IP4_ADDRESS_LENGTH)
|
#define ADDR_LOCATION(al, index) ((al)->buffer + index * IP4_ADDRESS_LENGTH)
|
||||||
|
|
||||||
/* Return the number of addresses in the list. */
|
/* Get the bounds of the address list. */
|
||||||
|
|
||||||
int
|
void
|
||||||
address_list_count (struct address_list *al)
|
address_list_get_bounds (struct address_list *al, int *start, int *end)
|
||||||
{
|
{
|
||||||
return al->count;
|
*start = al->faulty;
|
||||||
|
*end = al->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy address number INDEX to IP_STORE. */
|
/* Copy address number INDEX to IP_STORE. */
|
||||||
@ -92,6 +95,7 @@ void
|
|||||||
address_list_copy_one (struct address_list *al, int index,
|
address_list_copy_one (struct address_list *al, int index,
|
||||||
unsigned char *ip_store)
|
unsigned char *ip_store)
|
||||||
{
|
{
|
||||||
|
assert (index >= al->faulty && index < al->count);
|
||||||
memcpy (ip_store, ADDR_LOCATION (al, index), IP4_ADDRESS_LENGTH);
|
memcpy (ip_store, ADDR_LOCATION (al, index), IP4_ADDRESS_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +112,21 @@ address_list_match_all (struct address_list *al1, struct address_list *al2)
|
|||||||
al1->count * IP4_ADDRESS_LENGTH);
|
al1->count * IP4_ADDRESS_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mark the INDEXth element of AL as faulty, so that the next time
|
||||||
|
this address list is used, the faulty element will be skipped. */
|
||||||
|
|
||||||
|
void
|
||||||
|
address_list_set_faulty (struct address_list *al, int index)
|
||||||
|
{
|
||||||
|
++al->faulty;
|
||||||
|
if (al->faulty >= al->count)
|
||||||
|
/* All addresses have been proven faulty. Since there's not much
|
||||||
|
sense in returning the user an empty address list the next
|
||||||
|
time, we'll rather make them all clean, so that they can be
|
||||||
|
retried anew. */
|
||||||
|
al->faulty = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create an address_list out of a NULL-terminated list of addresses,
|
/* Create an address_list out of a NULL-terminated list of addresses,
|
||||||
as returned by gethostbyname. */
|
as returned by gethostbyname. */
|
||||||
|
|
||||||
|
@ -27,12 +27,13 @@ struct address_list;
|
|||||||
struct address_list *lookup_host PARAMS ((const char *, int));
|
struct address_list *lookup_host PARAMS ((const char *, int));
|
||||||
char *herrmsg PARAMS ((int));
|
char *herrmsg PARAMS ((int));
|
||||||
|
|
||||||
int address_list_count PARAMS ((struct address_list *));
|
void address_list_get_bounds PARAMS ((struct address_list *, int *, int *));
|
||||||
void address_list_copy_one PARAMS ((struct address_list *, int,
|
void address_list_copy_one PARAMS ((struct address_list *, int,
|
||||||
unsigned char *));
|
unsigned char *));
|
||||||
void address_list_release PARAMS ((struct address_list *));
|
|
||||||
int address_list_match_all PARAMS ((struct address_list *,
|
int address_list_match_all PARAMS ((struct address_list *,
|
||||||
struct address_list *));
|
struct address_list *));
|
||||||
|
void address_list_set_faulty PARAMS ((struct address_list *, int));
|
||||||
|
void address_list_release PARAMS ((struct address_list *));
|
||||||
|
|
||||||
/* This was originally going to be a macro, but then every caller
|
/* This was originally going to be a macro, but then every caller
|
||||||
would have to #include the netinet stuff. */
|
would have to #include the netinet stuff. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user