summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2004-12-07 15:29:54 +0000
committerRoger Dingledine <arma@torproject.org>2004-12-07 15:29:54 +0000
commit802d374a99cae37ec33a098e4df79cd9165e624e (patch)
tree46a58925649c55096ac1911a5e64184570ba61e8
parenta2d80ec767b68482e6ed98fefc3162e8ab1fdb93 (diff)
downloadtor-802d374a99cae37ec33a098e4df79cd9165e624e.tar.gz
tor-802d374a99cae37ec33a098e4df79cd9165e624e.zip
I'm a bad person.
Stop treating the uint16_t's as null-terminated strings, and stop looking at the byte after them to see if it's null, because sometimes you're not allowed to look there. svn:r3108
-rw-r--r--src/or/circuitbuild.c26
-rw-r--r--src/or/circuituse.c14
-rw-r--r--src/or/or.h2
-rw-r--r--src/or/rephist.c13
4 files changed, 31 insertions, 24 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 4b703f67fb..c2c054446c 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -788,19 +788,25 @@ static int new_route_len(double cw, uint8_t purpose, smartlist_t *routers) {
return routelen;
}
-/** Fetch the list of predicted ports, turn it into a smartlist of
- * strings, remove the ones that are already handled by an
+/** Fetch the list of predicted ports, dup it into a smartlist of
+ * uint16_t's, remove the ones that are already handled by an
* existing circuit, and return it.
*/
static smartlist_t *
circuit_get_unhandled_ports(time_t now) {
- char *pp = rep_hist_get_predicted_ports(now);
- smartlist_t *needed_ports = smartlist_create();
- smartlist_split_string(needed_ports, pp, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- tor_free(pp);
+ smartlist_t *source = rep_hist_get_predicted_ports(now);
+ smartlist_t *dest = smartlist_create();
+ uint16_t *tmp;
+ int i;
+
+ for (i = 0; i < smartlist_len(source); ++i) {
+ tmp = tor_malloc(sizeof(uint16_t));
+ memcpy(tmp, smartlist_get(source, i), sizeof(uint16_t));
+ smartlist_add(dest, tmp);
+ }
- circuit_remove_handled_ports(needed_ports);
- return needed_ports;
+ circuit_remove_handled_ports(dest);
+ return dest;
}
/** Return 1 if we already have circuits present or on the way for
@@ -811,7 +817,7 @@ circuit_all_predicted_ports_handled(time_t now) {
int enough;
smartlist_t *sl = circuit_get_unhandled_ports(now);
enough = (smartlist_len(sl) == 0);
- SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
+ SMARTLIST_FOREACH(sl, uint16_t *, cp, tor_free(cp));
smartlist_free(sl);
return enough;
}
@@ -1000,7 +1006,7 @@ static routerinfo_t *choose_good_exit_server_general(routerlist_t *dir)
if (router)
break;
}
- SMARTLIST_FOREACH(needed_ports, char *, cp, tor_free(cp));
+ SMARTLIST_FOREACH(needed_ports, uint16_t *, cp, tor_free(cp));
smartlist_free(needed_ports);
}
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 5ca699388a..775af1d960 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -255,19 +255,17 @@ void circuit_expire_building(time_t now) {
void
circuit_remove_handled_ports(smartlist_t *needed_ports) {
int i;
- uint16_t port;
- char *portstring;
+ uint16_t *port;
for (i = 0; i < smartlist_len(needed_ports); ++i) {
- portstring = smartlist_get(needed_ports, i);
- port = *(uint16_t*)(portstring);
- tor_assert(port);
- if (circuit_stream_is_being_handled(NULL, port, 2)) {
+ port = smartlist_get(needed_ports, i);
+ tor_assert(*port);
+ if (circuit_stream_is_being_handled(NULL, *port, 2)) {
// log_fn(LOG_DEBUG,"Port %d is already being handled; removing.", port);
smartlist_del(needed_ports, i--);
- tor_free(portstring);
+ tor_free(port);
} else {
- log_fn(LOG_DEBUG,"Port %d is not handled.", port);
+ log_fn(LOG_DEBUG,"Port %d is not handled.", *port);
}
}
}
diff --git a/src/or/or.h b/src/or/or.h
index bfd473de6c..92d1a22fe4 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1451,7 +1451,7 @@ int rep_hist_bandwidth_assess(void);
char *rep_hist_get_bandwidth_lines(void);
void rep_history_clean(time_t before);
void rep_hist_note_used_port(uint16_t port, time_t now);
-char *rep_hist_get_predicted_ports(time_t now);
+smartlist_t *rep_hist_get_predicted_ports(time_t now);
/********************************* rendclient.c ***************************/
diff --git a/src/or/rephist.c b/src/or/rephist.c
index b08150be4d..568988f269 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -666,12 +666,14 @@ void rep_hist_note_used_port(uint16_t port, time_t now) {
add_predicted_port(port, now);
}
-#define PREFERRED_PORTS_RELEVANCE_TIME (6*3600) /* 6 hours */
+#define PREDICTED_PORTS_RELEVANCE_TIME (6*3600) /* 6 hours */
-/** Allocate and return a string of space-separated port numbers that
+/** Return a pointer to the list of port numbers that
* are likely to be asked for in the near future.
+ *
+ * The caller promises not to mess with it.
*/
-char *rep_hist_get_predicted_ports(time_t now) {
+smartlist_t *rep_hist_get_predicted_ports(time_t now) {
int i;
uint16_t *tmp_port;
time_t *tmp_time;
@@ -682,8 +684,9 @@ char *rep_hist_get_predicted_ports(time_t now) {
/* clean out obsolete entries */
for (i = 0; i < smartlist_len(predicted_ports_list); ++i) {
tmp_time = smartlist_get(predicted_ports_times, i);
- if (*tmp_time + PREFERRED_PORTS_RELEVANCE_TIME < now) {
+ if (*tmp_time + PREDICTED_PORTS_RELEVANCE_TIME < now) {
tmp_port = smartlist_get(predicted_ports_list, i);
+ log_fn(LOG_DEBUG, "Expiring predicted port %d", *tmp_port);
smartlist_del(predicted_ports_list, i);
smartlist_del(predicted_ports_times, i);
tor_free(tmp_port);
@@ -691,6 +694,6 @@ char *rep_hist_get_predicted_ports(time_t now) {
i--;
}
}
- return smartlist_join_strings(predicted_ports_list, " ", 0, NULL);
+ return predicted_ports_list;
}