| 
					
				 | 
			
			
				@@ -1227,7 +1227,8 @@ check_whether_dirport_reachable(const or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* XXX Should this be increased? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define MIN_BW_TO_ADVERTISE_DIRSERVER 51200 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** Return true iff we have enough configured bandwidth to cache directory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Return true iff we have enough configured bandwidth to advertise or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * automatically provide directory services from cache directory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * information. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 router_has_bandwidth_to_be_dirserver(const or_options_t *options) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1250,7 +1251,7 @@ router_has_bandwidth_to_be_dirserver(const or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * MIN_BW_TO_ADVERTISE_DIRSERVER, don't bother trying to serve requests. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-router_should_be_directory_server(const or_options_t *options, int dir_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+router_should_be_dirserver(const or_options_t *options, int dir_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   static int advertising=1; /* start out assuming we will advertise */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int new_choice=1; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1301,7 +1302,7 @@ router_should_be_directory_server(const or_options_t *options, int dir_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       tor_assert(reason); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_notice(LD_DIR, "Not advertising Dir%s (Reason: %s)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 dir_port ? "Port" : "ectory Service support", reason); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 dir_port ? "Port" : "Directory Service support", reason); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     advertising = new_choice; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1355,7 +1356,7 @@ decide_to_advertise_dir_impl(const or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Part two: consider config options that could make us choose to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    * publish or not publish that the user might find surprising. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return router_should_be_directory_server(options, dir_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return router_should_be_dirserver(options, dir_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Front-end to decide_to_advertise_dir_impl(): return 0 if we don't want to 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1363,7 +1364,7 @@ decide_to_advertise_dir_impl(const or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * DirPort we want to advertise. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-decide_to_advertise_dirport(const or_options_t *options, uint16_t dir_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+router_should_advertise_dirport(const or_options_t *options, uint16_t dir_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* supports_tunnelled_dir_requests is not relevant, pass 0 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return decide_to_advertise_dir_impl(options, dir_port, 0) ? dir_port : 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1373,7 +1374,7 @@ decide_to_advertise_dirport(const or_options_t *options, uint16_t dir_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * advertise the fact that we support begindir requests, else return 1. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-decide_to_advertise_begindir(const or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+router_should_advertise_begindir(const or_options_t *options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                              int supports_tunnelled_dir_requests) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* dir_port is not relevant, pass 0 */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1406,26 +1407,17 @@ extend_info_from_router(const routerinfo_t *r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                          &ap.addr, ap.port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** Some time has passed, or we just got new directory information. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * See if we currently believe our ORPort or DirPort to be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * unreachable. If so, launch a new test for it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * For ORPort, we simply try making a circuit that ends at ourselves. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Success is noticed in onionskin_answer(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * For DirPort, we make a connection via Tor to our DirPort and ask 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * for our own server descriptor. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Success is noticed in connection_dir_client_reached_eof(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/**See if we currently believe our ORPort or DirPort to be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * unreachable. If so, return 1 else return 0. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-consider_testing_reachability(int test_or, int test_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+router_should_check_reachability(int test_or, int test_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const routerinfo_t *me = router_get_my_routerinfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const or_options_t *options = get_options(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int orport_reachable = check_whether_orport_reachable(options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_addr_t addr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!me) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (routerset_contains_router(options->ExcludeNodes, me, -1) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       options->StrictNodes) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1440,43 +1432,66 @@ consider_testing_reachability(int test_or, int test_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  "We cannot learn whether we are usable, and will not " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                  "be able to advertise ourself."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Some time has passed, or we just got new directory information. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * See if we currently believe our ORPort or DirPort to be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * unreachable. If so, launch a new test for it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * For ORPort, we simply try making a circuit that ends at ourselves. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Success is noticed in onionskin_answer(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * For DirPort, we make a connection via Tor to our DirPort and ask 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * for our own server descriptor. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Success is noticed in connection_dir_client_reached_eof(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+router_do_reachability_checks(int test_or, int test_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const routerinfo_t *me = router_get_my_routerinfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const or_options_t *options = get_options(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int orport_reachable = check_whether_orport_reachable(options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_addr_t addr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (router_should_check_reachability(test_or, test_dir)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (test_or && (!orport_reachable || !circuit_enough_testing_circs())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      extend_info_t *ei = extend_info_from_router(me); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* XXX IPv6 self testing */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               !orport_reachable ? "reachability" : "bandwidth", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               fmt_addr32(me->addr), me->or_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      extend_info_free(ei); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (test_or && (!orport_reachable || !circuit_enough_testing_circs())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    extend_info_t *ei = extend_info_from_router(me); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* XXX IPv6 self testing */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             !orport_reachable ? "reachability" : "bandwidth", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             fmt_addr32(me->addr), me->or_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    extend_info_free(ei); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* XXX IPv6 self testing */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_addr_from_ipv4h(&addr, me->addr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (test_dir && !check_whether_dirport_reachable(options) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      !connection_get_by_type_addr_port_purpose( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                CONN_TYPE_DIR, &addr, me->dir_port, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                DIR_PURPOSE_FETCH_SERVERDESC)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tor_addr_port_t my_orport, my_dirport; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    memcpy(&my_orport.addr, &addr, sizeof(addr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    memcpy(&my_dirport.addr, &addr, sizeof(addr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    my_orport.port = me->or_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    my_dirport.port = me->dir_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* ask myself, via tor, for my server descriptor. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_t *req = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_set_or_addr_port(req, &my_orport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_set_dir_addr_port(req, &my_dirport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_set_directory_id_digest(req, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tor_addr_from_ipv4h(&addr, me->addr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (test_dir && !check_whether_dirport_reachable(options) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        !connection_get_by_type_addr_port_purpose( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  CONN_TYPE_DIR, &addr, me->dir_port, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  DIR_PURPOSE_FETCH_SERVERDESC)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tor_addr_port_t my_orport, my_dirport; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      memcpy(&my_orport.addr, &addr, sizeof(addr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      memcpy(&my_dirport.addr, &addr, sizeof(addr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      my_orport.port = me->or_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      my_dirport.port = me->dir_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* ask myself, via tor, for my server descriptor. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_t *req = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_set_or_addr_port(req, &my_orport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_set_dir_addr_port(req, &my_dirport); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_set_directory_id_digest(req, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                               me->cache_info.identity_digest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // ask via an anon circuit, connecting to our dirport. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_set_indirection(req, DIRIND_ANON_DIRPORT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_set_resource(req, "authority.z"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_initiate_request(req); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    directory_request_free(req); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // ask via an anon circuit, connecting to our dirport. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_set_indirection(req, DIRIND_ANON_DIRPORT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_set_resource(req, "authority.z"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_initiate_request(req); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      directory_request_free(req); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1521,7 +1536,7 @@ router_dirport_found_reachable(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                && check_whether_orport_reachable(options) ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                " Publishing server descriptor." : ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     can_reach_dir_port = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (decide_to_advertise_dirport(options, me->dir_port)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (router_should_advertise_dirport(options, me->dir_port)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mark_my_descriptor_dirty("DirPort found reachable"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       /* This is a significant enough change to upload immediately, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * at least in a test network */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2915,7 +2930,7 @@ router_dump_router_to_string(routerinfo_t *router, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     router->nickname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     address, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     router->or_port, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    decide_to_advertise_dirport(options, router->dir_port), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    router_should_advertise_dirport(options, router->dir_port), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ed_cert_line ? ed_cert_line : "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     extra_or_address ? extra_or_address : "", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     router->platform, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2989,7 +3004,7 @@ router_dump_router_to_string(routerinfo_t *router, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_free(p6); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (decide_to_advertise_begindir(options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (router_should_advertise_begindir(options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    router->supports_tunnelled_dir_requests)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_add_strdup(chunks, "tunnelled-dir-server\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 |