diff --git a/src/or/config.c b/src/or/config.c index 69aea254c1..7434dfd2f3 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -349,10 +349,10 @@ static int resolve_my_address(or_options_t *options) { struct in_addr in; struct hostent *rent; char localhostname[256]; - int guessed=0; + int explicit_ip=1; if(!options->Address) { /* then we need to guess our address */ - guessed = 1; + explicit_ip = 0; /* it's implicit */ if(gethostname(localhostname,sizeof(localhostname)) < 0) { log_fn(LOG_WARN,"Error obtaining local hostname"); @@ -371,16 +371,20 @@ static int resolve_my_address(or_options_t *options) { /* 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; + if(tor_inet_aton(options->Address, &in) == 0) { + /* then we have to resolve it */ + explicit_ip = 0; + 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); } - assert(rent->h_length == 4); - memcpy(&in.s_addr, rent->h_addr,rent->h_length); - if(guessed==1 && is_internal_IP(htonl(in.s_addr))) { + if(!explicit_ip && is_internal_IP(htonl(in.s_addr))) { log_fn(LOG_WARN,"Address '%s' resolves to private IP '%s'. " - "Please set the Address config option to be your public IP.", + "Please set the Address config option to be the IP you want to use.", options->Address, inet_ntoa(in)); return -1; }