Commit a3201eb4 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

Store options->Address as IP, not hostname

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


svn:r1226
parent cfeae146
Loading
Loading
Loading
Loading
+36 −0
Changes for trunk/src/or/config.c: 36 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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;
+2 −16
Changes for trunk/src/or/router.c: 2 added lines, 16 removed lines.
Original line number Diff line number Diff line
@@ -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;
+2 −1
Changes for trunk/src/or/routerlist.c: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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);