From 89d9d80e7684d4e4fa813866be46f815c857c799 Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Thu, 4 Mar 2004 01:53:56 +0000 Subject: Store options->Address as IP, not hostname And figure it out while reading config, not every time you rebuild the descriptor svn:r1226 --- src/or/config.c | 36 ++++++++++++++++++++++++++++++++++++ src/or/router.c | 18 ++---------------- src/or/routerlist.c | 3 ++- 3 files changed, 40 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/or/config.c b/src/or/config.c index 2da3ba72f..bf29576d1 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 aefa0c064..59cade7dc 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 19c0d70ef..2677d8bcd 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); -- cgit v1.2.3