Browse Source

Store options->Address as IP, not hostname
And figure it out while reading config, not every time you
rebuild the descriptor


svn:r1226

Roger Dingledine 20 years ago
parent
commit
89d9d80e76
3 changed files with 40 additions and 17 deletions
  1. 36 0
      src/or/config.c
  2. 2 16
      src/or/router.c
  3. 2 1
      src/or/routerlist.c

+ 36 - 0
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;

+ 2 - 16
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;

+ 2 - 1
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);