aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2004-03-04 01:53:56 +0000
committerRoger Dingledine <arma@torproject.org>2004-03-04 01:53:56 +0000
commit89d9d80e7684d4e4fa813866be46f815c857c799 (patch)
tree8c3f1d555dcc5f7eba850442d966c47396d8b144
parentb7633e2e67c66fd33f16918070f9565d4fa03c35 (diff)
downloadtor-89d9d80e7684d4e4fa813866be46f815c857c799.tar.gz
tor-89d9d80e7684d4e4fa813866be46f815c857c799.zip
Store options->Address as IP, not hostname
And figure it out while reading config, not every time you rebuild the descriptor svn:r1226
-rw-r--r--src/or/config.c36
-rw-r--r--src/or/router.c18
-rw-r--r--src/or/routerlist.c3
3 files changed, 40 insertions, 17 deletions
diff --git a/src/or/config.c b/src/or/config.c
index 2da3ba72f4..bf29576d12 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -524,6 +524,42 @@ int getconfig(int argc, char **argv, or_options_t *options) {
result = -1;
}
+ if(options->ORPort) { /* get an IP for ourselves */
+ struct in_addr in;
+ struct hostent *rent;
+ char localhostname[256];
+
+ if(!options->Address) { /* then we need to guess our address */
+
+ if(gethostname(localhostname,sizeof(localhostname)) < 0) {
+ log_fn(LOG_WARN,"Error obtaining local hostname");
+ return -1;
+ }
+#if 0 /* don't worry about complaining, as long as it resolves */
+ if(!strchr(localhostname,'.')) {
+ log_fn(LOG_WARN,"fqdn '%s' has only one element. Misconfigured machine?",address);
+ log_fn(LOG_WARN,"Try setting the Address line in your config file.");
+ return -1;
+ }
+#endif
+ options->Address = tor_strdup(localhostname);
+ log_fn(LOG_DEBUG,"Guessed local host name as '%s'",options->Address);
+ }
+
+ /* now we know options->Address is set. resolve it and keep only the IP */
+
+ rent = (struct hostent *)gethostbyname(options->Address);
+ if (!rent) {
+ log_fn(LOG_WARN,"Could not resolve Address %s. Failing.", options->Address);
+ return -1;
+ }
+ assert(rent->h_length == 4);
+ memcpy(&in.s_addr, rent->h_addr,rent->h_length);
+ tor_free(options->Address);
+ options->Address = tor_strdup(inet_ntoa(in));
+ log_fn(LOG_DEBUG,"Resolved Address to %s.", options->Address);
+ }
+
if(options->SocksPort < 0) {
log(LOG_WARN,"SocksPort option can't be negative.");
result = -1;
diff --git a/src/or/router.c b/src/or/router.c
index aefa0c0645..59cade7dc7 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -321,23 +321,9 @@ const char *router_get_my_descriptor(void) {
int router_rebuild_descriptor(void) {
routerinfo_t *ri;
- char localhostname[256];
- char *address = options.Address;
- if(!address) { /* if not specified in config, we find a default */
- if(gethostname(localhostname,sizeof(localhostname)) < 0) {
- log_fn(LOG_WARN,"Error obtaining local hostname");
- return -1;
- }
- address = localhostname;
- if(!strchr(address,'.')) {
- log_fn(LOG_WARN,"fqdn '%s' has only one element. Misconfigured machine?",address);
- log_fn(LOG_WARN,"Try setting the Address line in your config file.");
- return -1;
- }
- }
- ri = tor_malloc(sizeof(routerinfo_t));
- ri->address = tor_strdup(address);
+ ri = tor_malloc_zero(sizeof(routerinfo_t));
+ ri->address = tor_strdup(options.Address);
ri->nickname = tor_strdup(options.Nickname);
/* No need to set addr. */
ri->or_port = options.ORPort;
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 19c0d70ef4..2677d8bcd1 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -377,7 +377,8 @@ router_resolve(routerinfo_t *router)
rent = (struct hostent *)gethostbyname(router->address);
if (!rent) {
- log_fn(LOG_WARN,"Could not get address for router %s.",router->address);
+ log_fn(LOG_WARN,"Could not get address for router %s (%s).",
+ router->address, router->nickname);
return -1;
}
assert(rent->h_length == 4);