Explorar el Código

Implement a few more node-based functions

Some of these functions only work for routerinfo-based nodes, and as
such are only usable for advisory purposes.  Fortunately, our uses
of them are compatible with this limitation.
Nick Mathewson hace 16 años
padre
commit
b5341314c1
Se han modificado 4 ficheros con 28 adiciones y 15 borrados
  1. 1 1
      src/common/util.c
  2. 5 2
      src/or/command.c
  3. 17 11
      src/or/nodelist.c
  4. 5 1
      src/or/rephist.c

+ 1 - 1
src/common/util.c

@@ -934,7 +934,7 @@ esc_for_log(const char *s)
   char *result, *outp;
   size_t len = 3;
   if (!s) {
-    return tor_strdup("");
+    return tor_strdup("(null)");
   }
 
   for (cp = s; *cp; ++cp) {

+ 5 - 2
src/or/command.c

@@ -273,10 +273,13 @@ command_process_create_cell(cell_t *cell, or_connection_t *conn)
            "Received CREATE cell (circID %d) for known circ. "
            "Dropping (age %d).",
            cell->circ_id, (int)(time(NULL) - conn->_base.timestamp_created));
-    if (node)
+    if (node) {
+      char *p = esc_for_log(node_get_platform(node));
       log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
              "Details: nickname \"%s\", platform %s.",
-             node_get_nickname(node), escaped(node_get_platform(node)));
+             node_get_nickname(node), p);
+      tor_free(p);
+    }
     return;
   }
 

+ 17 - 11
src/or/nodelist.c

@@ -656,9 +656,10 @@ node_get_address_string(const node_t *node, char *buf, size_t len)
 long
 node_get_declared_uptime(const node_t *node)
 {
-  (void)node;
-  UNIMPLEMENTED_NODELIST();
-  return 0;
+  if (node->ri)
+    return node->ri->uptime;
+  else
+    return -1;
 }
 
 /** Return <b>node</b>'s declared or_port */
@@ -673,22 +674,27 @@ node_get_orport(const node_t *node)
     return 0;
 }
 
-/** Return <b>node</b>'s platform string */
+/** Return <b>node</b>'s platform string, or NULL if we don't know it. */
 const char *
 node_get_platform(const node_t *node)
 {
-  (void)node;
-  UNIMPLEMENTED_NODELIST();
-  return NULL;
+  /* If we wanted, we could record the version in the routerstatus_t, since
+   * the consensus lists it.  We don't, though, so this function just won't
+   * work with microdescriptors. */
+  if (node->ri)
+    return node->ri->platform;
+  else
+    return NULL;
 }
 
-/** Return <b>node</b>'s time of publication. */
+/** Return <b>node</b>'s time of publication, or 0 if we don't have one. */
 time_t
 node_get_published_on(const node_t *node)
 {
-  (void)node;
-  UNIMPLEMENTED_NODELIST();
-  return 0;
+  if (node->ri)
+    return node->ri->cache_info.published_on;
+  else
+    return 0;
 }
 
 /** Return true iff <b>node</b> is one representing this router. */

+ 5 - 1
src/or/rephist.c

@@ -881,8 +881,12 @@ rep_hist_get_router_stability_doc(time_t now)
     if (node) {
       char ip[INET_NTOA_BUF_LEN+1];
       char tbuf[ISO_TIME_LEN+1];
+      time_t published = node_get_published_on(node);
       node_get_address_string(node,ip,sizeof(ip));
-      format_iso_time(tbuf, node_get_published_on(node));
+      if (published > 0)
+        format_iso_time(tbuf, published);
+      else
+        strlcpy(tbuf, "???", sizeof(tbuf));
       tor_snprintf(header_buf, sizeof(header_buf),
                    "router %s %s %s\n"
                    "published %s\n"