| 
					
				 | 
			
			
				@@ -13,6 +13,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void clear_geoip_db(void); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void dump_geoip_stats(void); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void dump_entry_stats(void); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** An entry from the GeoIP file: maps an IP range to a country. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 typedef struct geoip_entry_t { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -308,8 +309,13 @@ geoip_note_client_seen(geoip_client_action_t action, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   or_options_t *options = get_options(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   clientmap_entry_t lookup, *ent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (action == GEOIP_CLIENT_CONNECT) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef ENABLE_ENTRY_STATS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!options->EntryStatistics) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!(options->BridgeRelay && options->BridgeRecordUsageByCountry)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Did we recently switch from bridge to relay or back? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (client_history_starts > now) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -337,6 +343,8 @@ geoip_note_client_seen(geoip_client_action_t action, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     geoip_remove_old_clients(current_request_period_starts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Before rotating, write the current stats to disk. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     dump_geoip_stats(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (get_options()->EntryStatistics) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      dump_entry_stats(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Now rotate request period */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         memmove(&c->n_v2_ns_requests[0], &c->n_v2_ns_requests[1], 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -657,6 +665,40 @@ dump_geoip_stats(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Store all our geoip statistics as entry guards into 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * $DATADIR/entry-stats. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+dump_entry_stats(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef ENABLE_ENTRY_STATS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  time_t now = time(NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char *filename = get_datadir_fname("entry-stats"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char *data = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char since[ISO_TIME_LEN+1], written[ISO_TIME_LEN+1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  open_file_t *open_file = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  FILE *out; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  data = geoip_get_client_history(now, GEOIP_CLIENT_CONNECT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  format_iso_time(since, geoip_get_history_start()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  format_iso_time(written, now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    0600, &open_file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!out) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    goto done; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (fprintf(out, "written %s\nstarted-at %s\nips %s\n", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              written, since, data ? data : "") < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    goto done; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  finish_writing_to_file(open_file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  open_file = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ done: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (open_file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    abort_writing_to_file(open_file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_free(filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tor_free(data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Helper used to implement GETINFO ip-to-country/... controller command. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 getinfo_helper_geoip(control_connection_t *control_conn, 
			 |