r13777@catbus: nickm | 2007-07-16 12:58:08 -0400

Patch from tup: new address-mappings/ GETINFO that includes expiry times.


svn:r10844
This commit is contained in:
Nick Mathewson 2007-07-16 16:58:11 +00:00
parent 483c1e9017
commit 26a25edaec
5 changed files with 65 additions and 31 deletions

View File

@ -21,6 +21,14 @@ Changes in version 0.2.0.3-alpha - 2007-??-??
from Robert Hogan.) from Robert Hogan.)
- Add GETINFO status/enough-dir-info to let controllers tell whether - Add GETINFO status/enough-dir-info to let controllers tell whether
Tor has downloaded sufficient directory information. (Patch from Tup.) Tor has downloaded sufficient directory information. (Patch from Tup.)
- You can now use the ControlSocket option to tell Tor to listen for
controller connections on Unix domain sockets on systems that support
them. (Patch from Peter Palfrader.)
- STREAM NEW events are generated for DNSPort requests and for tunneled
directory connections. (Patch from Robert Hogan.)
- New GETINFO address-mappings/* command to get address mappings with
expiry information. addr-mappings/* is now deprecated.
(Patch from Tup.)
o Performance improvements (win32): o Performance improvements (win32):
- Use Critical Sections rather than Mutexes for synchronizing threads - Use Critical Sections rather than Mutexes for synchronizing threads
@ -30,13 +38,6 @@ Changes in version 0.2.0.3-alpha - 2007-??-??
o Deprecated features: o Deprecated features:
- RedirectExits is now deprecated. - RedirectExits is now deprecated.
o Minor features (controller):
- You can now use the ControlSocket option to tell Tor to listen for
controller connections on Unix domain sockets on systems that support
them. (Patch from Peter Palfrader.)
- STREAM NEW events are generated for DNSPort requests and for tunneled
directory connections. (Patch from Robert Hogan.)
o Major bugfixes (directory): o Major bugfixes (directory):
- Fix a crash bug in directory authorities when we re-number the - Fix a crash bug in directory authorities when we re-number the
routerlist while inserting a new router. [Bugfix on 0.1.2.x] routerlist while inserting a new router. [Bugfix on 0.1.2.x]

View File

@ -377,16 +377,22 @@ $Id$
space-separated list of LongName, each preceded by a "!" if it is space-separated list of LongName, each preceded by a "!" if it is
believed to be not running.) believed to be not running.)
"addr-mappings/all" "address-mappings/all"
"addr-mappings/config" "address-mappings/config"
"addr-mappings/cache" "address-mappings/cache"
"addr-mappings/control" -- a \r\n-separated list of address "address-mappings/control" -- a \r\n-separated list of address
mappings, each in the form of "from-address to-address". mappings, each in the form of "from-address to-address expiry".
The 'config' key returns those address mappings set in the The 'config' key returns those address mappings set in the
configuration; the 'cache' key returns the mappings in the configuration; the 'cache' key returns the mappings in the
client-side DNS cache; the 'control' key returns the mappings set client-side DNS cache; the 'control' key returns the mappings set
via the control interface; the 'all' target returns the mappings via the control interface; the 'all' target returns the mappings
set through any mechanism. set through any mechanism.
Expiry is formatted as with ADDRMAP events; see section 4.1.7.
First introduced in 0.2.0.3-alpha.
"addr-mappings/*" -- as for address-mappings/*, but without the
expiry portion of the value. Use of this value is deprecated
since 0.2.0.3-alpha; use address-mappings instead.
"address" -- the best guess at our external IP address. If we "address" -- the best guess at our external IP address. If we
have no guess, return a 551 error. (Added in 0.1.2.2-alpha) have no guess, return a 551 error. (Added in 0.1.2.2-alpha)

View File

@ -617,14 +617,14 @@ addressmap_ent_remove(const char *address, addressmap_entry_t *ent)
void void
addressmap_clear_configured(void) addressmap_clear_configured(void)
{ {
addressmap_get_mappings(NULL, 0, 0); addressmap_get_mappings(NULL, 0, 0, 0);
} }
/** Remove all entries from the addressmap that are set to expire, ever. */ /** Remove all entries from the addressmap that are set to expire, ever. */
void void
addressmap_clear_transient(void) addressmap_clear_transient(void)
{ {
addressmap_get_mappings(NULL, 2, TIME_MAX); addressmap_get_mappings(NULL, 2, TIME_MAX, 0);
} }
/** Clean out entries from the addressmap cache that were /** Clean out entries from the addressmap cache that were
@ -633,7 +633,7 @@ addressmap_clear_transient(void)
void void
addressmap_clean(time_t now) addressmap_clean(time_t now)
{ {
addressmap_get_mappings(NULL, 2, now); addressmap_get_mappings(NULL, 2, now, 0);
} }
/** Free all the elements in the addressmap, and free the addressmap /** Free all the elements in the addressmap, and free the addressmap
@ -1136,12 +1136,13 @@ address_is_invalid_destination(const char *address, int client)
/** Iterate over all address mappings which have expiry times between /** Iterate over all address mappings which have expiry times between
* min_expires and max_expires, inclusive. If sl is provided, add an * min_expires and max_expires, inclusive. If sl is provided, add an
* "old-addr new-addr" string to sl for each mapping. If sl is NULL, * "old-addr new-addr expiry" string to sl for each mapping, omitting
* remove the mappings. * the expiry time if want_expiry is false. If sl is NULL, remove the
* mappings.
*/ */
void void
addressmap_get_mappings(smartlist_t *sl, time_t min_expires, addressmap_get_mappings(smartlist_t *sl, time_t min_expires,
time_t max_expires) time_t max_expires, int want_expiry)
{ {
strmap_iter_t *iter; strmap_iter_t *iter;
const char *key; const char *key;
@ -1160,9 +1161,20 @@ addressmap_get_mappings(smartlist_t *sl, time_t min_expires,
addressmap_ent_remove(key, val); addressmap_ent_remove(key, val);
continue; continue;
} else if (val->new_address) { } else if (val->new_address) {
size_t len = strlen(key)+strlen(val->new_address)+2; size_t len = strlen(key)+strlen(val->new_address)+ISO_TIME_LEN+5;
char *line = tor_malloc(len); char *line = tor_malloc(len);
tor_snprintf(line, len, "%s %s", key, val->new_address); if (want_expiry) {
if (val->expires < 3 || val->expires == TIME_MAX)
tor_snprintf(line, len, "%s %s NEVER", key, val->new_address);
else {
char time[ISO_TIME_LEN+1];
format_local_iso_time(time, val->expires);
tor_snprintf(line, len, "%s %s \"%s\"", key, val->new_address,
time);
}
} else {
tor_snprintf(line, len, "%s %s", key, val->new_address);
}
smartlist_add(sl, line); smartlist_add(sl, line);
} }
} }

View File

@ -1457,22 +1457,28 @@ getinfo_helper_events(control_connection_t *control_conn,
*answer = smartlist_join_strings(status, "\r\n", 0, NULL); *answer = smartlist_join_strings(status, "\r\n", 0, NULL);
SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(status, char *, cp, tor_free(cp));
smartlist_free(status); smartlist_free(status);
} else if (!strcmpstart(question, "addr-mappings/")) { } else if (!strcmpstart(question, "addr-mappings/") ||
!strcmpstart(question, "address-mappings/")) {
/* XXXX020 Warn about deprecated addr-mappings variant? Or wait for
* 0.2.1.x? */
time_t min_e, max_e; time_t min_e, max_e;
smartlist_t *mappings; smartlist_t *mappings;
if (!strcmp(question, "addr-mappings/all")) { int want_expiry = !strcmpstart(question, "address-mappings/");
question += strlen(want_expiry ? "address-mappings/"
: "addr-mappings/");
if (!strcmp(question, "all")) {
min_e = 0; max_e = TIME_MAX; min_e = 0; max_e = TIME_MAX;
} else if (!strcmp(question, "addr-mappings/cache")) { } else if (!strcmp(question, "cache")) {
min_e = 2; max_e = TIME_MAX; min_e = 2; max_e = TIME_MAX;
} else if (!strcmp(question, "addr-mappings/config")) { } else if (!strcmp(question, "config")) {
min_e = 0; max_e = 0; min_e = 0; max_e = 0;
} else if (!strcmp(question, "addr-mappings/control")) { } else if (!strcmp(question, "control")) {
min_e = 1; max_e = 1; min_e = 1; max_e = 1;
} else { } else {
return 0; return 0;
} }
mappings = smartlist_create(); mappings = smartlist_create();
addressmap_get_mappings(mappings, min_e, max_e); addressmap_get_mappings(mappings, min_e, max_e, want_expiry);
*answer = smartlist_join_strings(mappings, "\r\n", 0, NULL); *answer = smartlist_join_strings(mappings, "\r\n", 0, NULL);
SMARTLIST_FOREACH(mappings, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(mappings, char *, cp, tor_free(cp));
smartlist_free(mappings); smartlist_free(mappings);
@ -1587,11 +1593,20 @@ static const getinfo_item_t getinfo_items[] = {
ITEM("circuit-status", events, "List of current circuits originating here."), ITEM("circuit-status", events, "List of current circuits originating here."),
ITEM("stream-status", events,"List of current streams."), ITEM("stream-status", events,"List of current streams."),
ITEM("orconn-status", events, "A list of current OR connections."), ITEM("orconn-status", events, "A list of current OR connections."),
PREFIX("address-mappings/", events, NULL),
DOC("address-mappings/all", "Current address mappings."),
DOC("address-mappings/cache", "Current cached DNS replies."),
DOC("address-mappings/config",
"Current address mappings from configuration."),
DOC("address-mappings/control", "Current address mappings from controller."),
PREFIX("addr-mappings/", events, NULL), PREFIX("addr-mappings/", events, NULL),
DOC("addr-mappings/all", "Current address mappings."), DOC("addr-mappings/all", "Current address mappings without expiry times."),
DOC("addr-mappings/cache", "Current cached DNS replies."), DOC("addr-mappings/cache",
DOC("addr-mappings/config", "Current address mappings from configuration."), "Current cached DNS replies without expiry times."),
DOC("addr-mappings/control", "Current address mappings from controller."), DOC("addr-mappings/config",
"Current address mappings from configuration without expiry times."),
DOC("addr-mappings/control",
"Current address mappings from controller without expiry times."),
PREFIX("status/", events, NULL), PREFIX("status/", events, NULL),
DOC("status/circuit-established", DOC("status/circuit-established",
"Whether we think client functionality is working."), "Whether we think client functionality is working."),

View File

@ -2511,7 +2511,7 @@ void client_dns_set_addressmap(const char *address, uint32_t val,
int address_is_in_virtual_range(const char *addr); int address_is_in_virtual_range(const char *addr);
const char *addressmap_register_virtual_address(int type, char *new_address); const char *addressmap_register_virtual_address(int type, char *new_address);
void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, void addressmap_get_mappings(smartlist_t *sl, time_t min_expires,
time_t max_expires); time_t max_expires, int want_expiry);
int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn,
origin_circuit_t *circ, origin_circuit_t *circ,
crypt_path_t *cpath); crypt_path_t *cpath);