[or-cvs] dirserver should include itself in the directory

Roger Dingledine arma at seul.org
Thu Sep 26 13:17:16 UTC 2002


Update of /home/or/cvsroot/src/or
In directory moria.seul.org:/home/arma/work/onion/cvs/src/or

Modified Files:
	directory.c main.c or.h routers.c 
Log Message:
dirserver should include itself in the directory

if connecting to a dirserver fails, remove it from the router array


Index: directory.c
===================================================================
RCS file: /home/or/cvsroot/src/or/directory.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- directory.c	26 Sep 2002 12:09:10 -0000	1.1
+++ directory.c	26 Sep 2002 13:17:14 -0000	1.2
@@ -1,4 +1,4 @@
-/* Copyright 2001,2002 Roger Dingledine, Matej Pfaêfar. */
+/* Copyright 2001,2002 Roger Dingledine, Matej Pfajfar. */
 /* See LICENSE for licensing information */
 /* $Id$ */
 
@@ -56,6 +56,7 @@
   if(connect(s,(struct sockaddr *)&router_addr,sizeof(router_addr)) < 0){
     if(errno != EINPROGRESS){
       /* yuck. kill it. */
+      router_forget_router(conn->addr, conn->port); /* don't try him again */
       connection_free(conn);
       return;
     } else {
@@ -210,6 +211,7 @@
         if(errno != EINPROGRESS){
           /* yuck. kill it. */
           log(LOG_DEBUG,"connection_dir_finished_flushing(): in-progress connect failed. Removing.");
+          router_forget_router(conn->addr, conn->port); /* don't try him again */
           return -1;
         } else {
           return 0; /* no change, see if next time is better */
@@ -217,7 +219,7 @@
       }
       /* the connect has finished. */
 
-      log(LOG_DEBUG,"connection_dir_finished_flushing(): DIR connection to router %s:%u established.",
+      log(LOG_DEBUG,"connection_dir_finished_flushing(): Dir connection to router %s:%u established.",
           conn->address,conn->port);
 
       return directory_send_command(conn);

Index: main.c
===================================================================
RCS file: /home/or/cvsroot/src/or/main.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- main.c	26 Sep 2002 12:09:10 -0000	1.25
+++ main.c	26 Sep 2002 13:17:14 -0000	1.26
@@ -21,6 +21,8 @@
 /* private key */
 static crypto_pk_env_t *prkey;
 
+routerinfo_t *my_routerinfo=NULL;
+
 /********* END VARIABLES ************/
 
 /****************************************************************************
@@ -214,6 +216,10 @@
       retval = connection_dir_handle_listener_read(conn);
     } else {
       retval = connection_read_to_buf(conn);
+      if (retval < 0 && conn->type == CONN_TYPE_DIR) {
+         /* as a special case: forget about this router */
+         router_forget_router(conn->addr,conn->port);
+      }
       if (retval >= 0) { /* all still well */
         retval = connection_process_inbuf(conn);
 //      log(LOG_DEBUG,"check_conn_read(): connection_process_inbuf returned %d.",retval);
@@ -501,14 +507,42 @@
   please_dumpstats = 0;
 }
 
-void dump_directory_to_string(char *s, int maxlen) {
-  int i;
-  connection_t *conn;
+int dump_router_to_string(char *s, int maxlen, routerinfo_t *router) {
   char *pkey;
   int pkeylen;
   int written;
+
+  if(crypto_pk_write_public_key_to_string(router->pkey,&pkey,&pkeylen)<0) {
+    log(LOG_ERR,"dump_directory_to_string(): write pkey to string failed!");
+    return 0;
+  }
+  written = snprintf(s, maxlen, "%s %d %d %d %d %d\n%s\n",
+    router->address,
+    router->or_port,
+    router->op_port,
+    router->ap_port,
+    router->dir_port,
+    router->bandwidth,
+    pkey);
+
+  free(pkey);
+
+  return written;
+}
+
+void dump_directory_to_string(char *s, int maxlen) {
+  int i;
+  connection_t *conn;
   routerinfo_t *router;
+  int written;
+
+  /* first write my own info */
+  /* XXX should check for errors here too */
+  written = dump_router_to_string(s, maxlen, my_routerinfo);
+  maxlen -= written;
+  s += written;
 
+  /* now write info for other routers */
   for(i=0;i<nfds;i++) {
     conn = connection_array[i];
 
@@ -519,20 +553,8 @@
       log(LOG_ERR,"dump_directory_to_string(): couldn't find router %d:%d!",conn->addr,conn->port);
       return;
     }
-    if(crypto_pk_write_public_key_to_string(router->pkey,&pkey,&pkeylen)<0) {
-      log(LOG_ERR,"dump_directory_to_string(): write pkey to string failed!");
-      return;
-    }
-    written = snprintf(s, maxlen, "%s %d %d %d %d %d\n%s\n",
-      router->address,
-      router->or_port,
-      router->op_port,
-      router->ap_port,
-      router->dir_port,
-      router->bandwidth,
-      pkey);
 
-    free(pkey);
+    written = dump_router_to_string(s, maxlen, router);
 
     if(written < 0 || written > maxlen) { 
       /* apparently different glibcs do different things on error.. so check both */
@@ -543,7 +565,6 @@
   
     maxlen -= written;
     s += written;
-
   }
 
 }

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- or.h	26 Sep 2002 12:09:10 -0000	1.27
+++ or.h	26 Sep 2002 13:17:14 -0000	1.28
@@ -653,6 +653,7 @@
 unsigned int *router_new_route(int *routelen);
 unsigned char *router_create_onion(unsigned int *route, int routelen, int *len, crypt_path_t **cpath);
 routerinfo_t *router_get_first_in_route(unsigned int *route, int routelen);
+void router_forget_router(uint32_t addr, uint16_t port);
 int router_get_list_from_file(char *routerfile, uint16_t or_listenport);
 int router_get_list_from_string(char *s, uint16_t or_listenport);
 

Index: routers.c
===================================================================
RCS file: /home/or/cvsroot/src/or/routers.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- routers.c	26 Sep 2002 12:09:10 -0000	1.12
+++ routers.c	26 Sep 2002 13:17:14 -0000	1.13
@@ -21,6 +21,7 @@
 
 extern int global_role; /* from main.c */
 extern or_options_t options; /* command-line and config-file options */
+extern routerinfo_t *my_routerinfo; /* from main.c */
 
 /****************************************************************************/
 
@@ -175,6 +176,27 @@
   free(list);
 }
 
+void router_forget_router(uint32_t addr, uint16_t port) {
+  int i;
+  routerinfo_t *router;
+
+  router = router_get_by_addr_port(addr,port);
+  if(!router) /* we don't seem to know about him in the first place */
+    return;
+
+  /* now walk down router_array until we get to router */
+  for(i=0;i<rarray_len;i++)
+    if(router_array[i] == router)
+      break;
+
+  assert(i != rarray_len); /* if so then router_get_by_addr_port should have returned null */
+
+  free(router);
+//  log(LOG_DEBUG,"router_forget_router(): Forgot about router %d:%d",addr,port);
+  for(; i<rarray_len-1;i++)
+    router_array[i] = router_array[i+1];
+}
+
 /* create a NULL-terminated array of pointers pointing to elements of a router list */
 /* this is done in two passes through the list - inefficient but irrelevant as this is
  * only done once when op/or start up */
@@ -289,6 +311,9 @@
     if(!router_is_me(router->addr, router->or_port, or_listenport)) {
       router->next = routerlist;
       routerlist = router;
+    } else {
+      if(!my_routerinfo) /* save it, so we can use it for directories */
+        my_routerinfo = router;
     }
     s = eat_whitespace(s);
   }



More information about the tor-commits mailing list