[or-cvs] Indirect access to the signed_descriptor field to make it e...

Nick Mathewson nickm at seul.org
Thu Jan 12 18:04:19 UTC 2006


Update of /home/or/cvsroot/tor/src/or
In directory moria:/tmp/cvs-serv617/src/or

Modified Files:
	control.c directory.c dirserv.c or.h router.c routerlist.c 
	routerparse.c 
Log Message:
Indirect access to the signed_descriptor field to make it easier to keep them lazily on disk.

Index: control.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/control.c,v
retrieving revision 1.164
retrieving revision 1.165
diff -u -p -d -r1.164 -r1.165
--- control.c	10 Jan 2006 22:42:44 -0000	1.164
+++ control.c	12 Jan 2006 18:04:17 -0000	1.165
@@ -1279,20 +1279,27 @@ handle_getinfo_helper(const char *questi
     *answer = list_getinfo_options();
   } else if (!strcmpstart(question, "desc/id/")) {
     routerinfo_t *ri = router_get_by_hexdigest(question+strlen("desc/id/"));
-    if (ri && ri->cache_info.signed_descriptor)
-      *answer = tor_strdup(ri->cache_info.signed_descriptor);
+    if (ri) {
+      const char *body = signed_descriptor_get_body(&ri->cache_info);
+      if (body)
+        *answer = tor_strdup(body);
+    }
   } else if (!strcmpstart(question, "desc/name/")) {
     routerinfo_t *ri = router_get_by_nickname(question+strlen("desc/name/"),1);
-    if (ri && ri->cache_info.signed_descriptor)
-      *answer = tor_strdup(ri->cache_info.signed_descriptor);
+    if (ri) {
+      const char *body = signed_descriptor_get_body(&ri->cache_info);
+      if (body)
+        *answer = tor_strdup(body);
+    }
   } else if (!strcmp(question, "desc/all-recent")) {
     routerlist_t *routerlist = router_get_routerlist();
     smartlist_t *sl = smartlist_create();
     if (routerlist && routerlist->routers) {
       SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, ri,
       {
-      if (ri && ri->cache_info.signed_descriptor)
-        smartlist_add(sl, tor_strdup(ri->cache_info.signed_descriptor));
+        const char *body = signed_descriptor_get_body(&ri->cache_info);
+        if (body)
+          smartlist_add(sl, tor_strdup(body));
       });
     }
     *answer = smartlist_join_strings(sl, "", 0, NULL);

Index: directory.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/directory.c,v
retrieving revision 1.341
retrieving revision 1.342
diff -u -p -d -r1.341 -r1.342
--- directory.c	10 Jan 2006 20:50:22 -0000	1.341
+++ directory.c	12 Jan 2006 18:04:17 -0000	1.342
@@ -1516,8 +1516,8 @@ directory_handle_command_get(connection_
         char *cp = inp;
         SMARTLIST_FOREACH(descs, signed_descriptor_t *, ri,
            {
-             memcpy(cp, ri->signed_descriptor,
-                    ri->signed_descriptor_len);
+             const char *body = signed_descriptor_get_body(ri);
+             memcpy(cp, body, ri->signed_descriptor_len);
              cp += ri->signed_descriptor_len;
              *cp++ = '\n';
            });
@@ -1550,9 +1550,10 @@ directory_handle_command_get(connection_
         note_request(request_type, len);
         connection_write_to_buf(tmp, strlen(tmp), conn);
         SMARTLIST_FOREACH(descs, signed_descriptor_t *, ri,
-                          connection_write_to_buf(ri->signed_descriptor,
-                                                  ri->signed_descriptor_len,
-                                                  conn));
+          {
+            const char *body = signed_descriptor_get_body(ri);
+            connection_write_to_buf(body, ri->signed_descriptor_len, conn);
+          });
       }
     }
     smartlist_free(descs);

Index: dirserv.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/dirserv.c,v
retrieving revision 1.291
retrieving revision 1.292
diff -u -p -d -r1.291 -r1.292
--- dirserv.c	11 Jan 2006 03:59:55 -0000	1.291
+++ dirserv.c	12 Jan 2006 18:04:17 -0000	1.292
@@ -871,9 +871,11 @@ dirserv_dump_directory_to_string(char **
   SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri,
     {
       size_t len = ri->cache_info.signed_descriptor_len;
+      const char *body;
       if (cp+len+1 >= buf+buf_len)
         goto truncated;
-      memcpy(cp, ri->cache_info.signed_descriptor, len);
+      body = signed_descriptor_get_body(&ri->cache_info);
+      memcpy(cp, body, len);
       cp += len;
       *cp++ = '\n'; /* add an extra newline in case somebody was depending on
                      * it. */

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/or.h,v
retrieving revision 1.779
retrieving revision 1.780
diff -u -p -d -r1.779 -r1.780
--- or.h	10 Jan 2006 22:42:44 -0000	1.779
+++ or.h	12 Jan 2006 18:04:17 -0000	1.780
@@ -762,7 +762,7 @@ typedef struct cached_dir_t {
 
 /** Information need to cache an onion router's descriptor. */
 typedef struct signed_descriptor_t {
-  char *signed_descriptor;
+  char *signed_descriptor_body;
   size_t signed_descriptor_len;
   char signed_descriptor_digest[DIGEST_LEN];
   char identity_digest[DIGEST_LEN];
@@ -2277,6 +2277,7 @@ routerinfo_t *router_get_by_nickname(con
 routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
 routerinfo_t *router_get_by_digest(const char *digest);
 signed_descriptor_t *router_get_by_descriptor_digest(const char *digest);
+const char *signed_descriptor_get_body(signed_descriptor_t *desc);
 int router_digest_version_as_new_as(const char *digest, const char *cutoff);
 int router_digest_is_trusted_dir(const char *digest);
 routerlist_t *router_get_routerlist(void);

Index: router.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/router.c,v
retrieving revision 1.239
retrieving revision 1.240
diff -u -p -d -r1.239 -r1.240
--- router.c	10 Jan 2006 07:21:01 -0000	1.239
+++ router.c	12 Jan 2006 18:04:17 -0000	1.240
@@ -761,13 +761,14 @@ router_get_my_routerinfo(void)
 const char *
 router_get_my_descriptor(void)
 {
+  const char *body;
   if (!desc_routerinfo) {
     if (router_rebuild_descriptor(1))
       return NULL;
   }
-  debug(LD_GENERAL,"my desc is '%s'",
-        desc_routerinfo->cache_info.signed_descriptor);
-  return desc_routerinfo->cache_info.signed_descriptor;
+  body = signed_descriptor_get_body(&desc_routerinfo->cache_info);
+  debug(LD_GENERAL,"my desc is '%s'", body);
+  return body;
 }
 
 /*DOCDOC*/
@@ -865,16 +866,16 @@ router_rebuild_descriptor(int force)
      });
     smartlist_free(family);
   }
-  ri->cache_info.signed_descriptor = tor_malloc(8192);
-  if (router_dump_router_to_string(ri->cache_info.signed_descriptor, 8192,
+  ri->cache_info.signed_descriptor_body = tor_malloc(8192);
+  if (router_dump_router_to_string(ri->cache_info.signed_descriptor_body, 8192,
                                    ri, get_identity_key())<0) {
     warn(LD_BUG, "Couldn't allocate string for descriptor.");
     return -1;
   }
   ri->cache_info.signed_descriptor_len =
-    strlen(ri->cache_info.signed_descriptor);
+    strlen(ri->cache_info.signed_descriptor_body);
   crypto_digest(ri->cache_info.signed_descriptor_digest,
-                ri->cache_info.signed_descriptor,
+                ri->cache_info.signed_descriptor_body,
                 ri->cache_info.signed_descriptor_len);
 
   if (desc_routerinfo)

Index: routerlist.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/routerlist.c,v
retrieving revision 1.424
retrieving revision 1.425
diff -u -p -d -r1.424 -r1.425
--- routerlist.c	12 Jan 2006 03:43:39 -0000	1.424
+++ routerlist.c	12 Jan 2006 18:04:17 -0000	1.425
@@ -159,19 +159,20 @@ router_should_rebuild_store(void)
 /** Add the <b>len</b>-type router descriptor in <b>s</b> to the router
  * journal. */
 static int
-router_append_to_journal(const char *s, size_t len)
+router_append_to_journal(signed_descriptor_t *desc)
 {
   or_options_t *options = get_options();
   size_t fname_len = strlen(options->DataDirectory)+32;
-  char *fname = tor_malloc(len);
+  char *fname = tor_malloc(fname_len);
+  const char *body = signed_descriptor_get_body(desc);
+  size_t len = desc->signed_descriptor_len;
 
   tor_snprintf(fname, fname_len, "%s/cached-routers.new",
                options->DataDirectory);
 
-  if (!len)
-    len = strlen(s);
+  tor_assert(len == strlen(body));
 
-  if (append_bytes_to_file(fname, s, len, 0)) {
+  if (append_bytes_to_file(fname, body, len, 0)) {
     warn(LD_FS, "Unable to store router descriptor");
     tor_free(fname);
     return -1;
@@ -218,12 +219,13 @@ router_rebuild_store(int force)
       signed_descriptor_t *sd = (i==0) ?
         ((signed_descriptor_t*)ptr): &((routerinfo_t*)ptr)->cache_info;
       sized_chunk_t *c;
-      if (!sd->signed_descriptor) {
-        warn(LD_BUG, "Bug! No descriptor stored for router.");
+      const char *body = signed_descriptor_get_body(sd);
+      if (!body) {
+        warn(LD_BUG, "Bug! No descriptor available for router.");
         goto done;
       }
       c = tor_malloc(sizeof(sized_chunk_t));
-      c->bytes = sd->signed_descriptor;
+      c->bytes = body;
       c->len = sd->signed_descriptor_len;
       smartlist_add(chunk_list, c);
     });
@@ -1062,6 +1064,12 @@ router_get_by_descriptor_digest(const ch
   return digestmap_get(routerlist->desc_digest_map, digest);
 }
 
+const char *
+signed_descriptor_get_body(signed_descriptor_t *desc)
+{
+  return desc->signed_descriptor_body;
+}
+
 /** Return the current list of all known routers. */
 routerlist_t *
 router_get_routerlist(void)
@@ -1083,7 +1091,7 @@ routerinfo_free(routerinfo_t *router)
   if (!router)
     return;
 
-  tor_free(router->cache_info.signed_descriptor);
+  tor_free(router->cache_info.signed_descriptor_body);
   tor_free(router->address);
   tor_free(router->nickname);
   tor_free(router->platform);
@@ -1104,7 +1112,7 @@ routerinfo_free(routerinfo_t *router)
 static void
 signed_descriptor_free(signed_descriptor_t *sd)
 {
-  tor_free(sd->signed_descriptor);
+  tor_free(sd->signed_descriptor_body);
   tor_free(sd);
 }
 
@@ -1115,50 +1123,11 @@ signed_descriptor_from_routerinfo(router
 {
   signed_descriptor_t *sd = tor_malloc_zero(sizeof(signed_descriptor_t));
   memcpy(sd, &(ri->cache_info), sizeof(signed_descriptor_t));
-  ri->cache_info.signed_descriptor = NULL;
+  ri->cache_info.signed_descriptor_body = NULL;
   routerinfo_free(ri);
   return sd;
 }
 
-#if 0
-/** Allocate a fresh copy of <b>router</b> */
-/* XXX Nobody uses this. Remove it? */
-routerinfo_t *
-routerinfo_copy(const routerinfo_t *router)
-{
-  routerinfo_t *r;
-  addr_policy_t **e, *tmp;
-
-  r = tor_malloc(sizeof(routerinfo_t));
-  memcpy(r, router, sizeof(routerinfo_t));
-
-  r->address = tor_strdup(r->address);
-  r->nickname = tor_strdup(r->nickname);
-  r->platform = tor_strdup(r->platform);
-  if (r->cache_info.signed_descriptor)
-    r->cache_info.signed_descriptor =
-      tor_strdup(r->cache_info.signed_descriptor);
-  if (r->onion_pkey)
-    r->onion_pkey = crypto_pk_dup_key(r->onion_pkey);
-  if (r->identity_pkey)
-    r->identity_pkey = crypto_pk_dup_key(r->identity_pkey);
-  e = &r->exit_policy;
-  while (*e) {
-    tmp = tor_malloc(sizeof(addr_policy_t));
-    memcpy(tmp,*e,sizeof(addr_policy_t));
-    *e = tmp;
-    (*e)->string = tor_strdup((*e)->string);
-    e = & ((*e)->next);
-  }
-  if (r->declared_family) {
-    r->declared_family = smartlist_create();
-    SMARTLIST_FOREACH(router->declared_family, const char *, s,
-                      smartlist_add(r->declared_family, tor_strdup(s)));
-  }
-  return r;
-}
-#endif
-
 /** Free all storage held by a routerlist <b>rl</b> */
 void
 routerlist_free(routerlist_t *rl)
@@ -1588,9 +1557,9 @@ router_add_to_routerlist(routerinfo_t *r
           }
         }
         routerlist_replace(routerlist, old_router, router, i, 1);
-        if (!from_cache)
-          router_append_to_journal(router->cache_info.signed_descriptor,
-                                   router->cache_info.signed_descriptor_len);
+        if (!from_cache) {
+          router_append_to_journal(&router->cache_info);
+        }
         directory_set_dirty();
         *msg = unreachable ? "Dirserver believes your ORPort is unreachable" :
                authdir_verified ? "Verified server updated" :
@@ -1633,8 +1602,7 @@ router_add_to_routerlist(routerinfo_t *r
    * the list. */
   routerlist_insert(routerlist, router);
   if (!from_cache)
-    router_append_to_journal(router->cache_info.signed_descriptor,
-                             router->cache_info.signed_descriptor_len);
+    router_append_to_journal(&router->cache_info);
   directory_set_dirty();
   return 0;
 }

Index: routerparse.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/routerparse.c,v
retrieving revision 1.167
retrieving revision 1.168
diff -u -p -d -r1.167 -r1.168
--- routerparse.c	2 Jan 2006 05:11:31 -0000	1.167
+++ routerparse.c	12 Jan 2006 18:04:17 -0000	1.168
@@ -745,7 +745,7 @@ router_parse_entry_from_string(const cha
   }
 
   router = tor_malloc_zero(sizeof(routerinfo_t));
-  router->cache_info.signed_descriptor = tor_strndup(s, end-s);
+  router->cache_info.signed_descriptor_body = tor_strndup(s, end-s);
   router->cache_info.signed_descriptor_len = end-s;
   memcpy(router->cache_info.signed_descriptor_digest, digest, DIGEST_LEN);
 



More information about the tor-commits mailing list