Store options->Address as IP, not hostname

And figure it out while reading config, not every time you
rebuild the descriptor


svn:r1226
This commit is contained in:
Roger Dingledine 2004-03-04 01:53:56 +00:00
parent b7633e2e67
commit 89d9d80e76
3 changed files with 40 additions and 17 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);