| 
					
				 | 
			
			
				@@ -4864,12 +4864,11 @@ config_register_addressmaps(const or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   smartlist_t *elts; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   config_line_t *opt; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char *from, *to; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char *from, *to, *msg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   addressmap_clear_configured(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   elts = smartlist_new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (opt = options->AddressMap; opt; opt = opt->next) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    int from_wildcard = 0, to_wildcard = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_split_string(elts, opt->value, NULL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (smartlist_len(elts) < 2) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4887,11 +4886,39 @@ config_register_addressmaps(const or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto cleanup; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!strcmp(to, "*") || !strcmp(from, "*")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      log_warn(LD_CONFIG,"MapAddress '%s' is unsupported - can't remap from " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               "or to *. Ignoring.",opt->value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (addressmap_register_auto(from, to, 0, ADDRMAPSRC_TORRC, &msg) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      log_warn(LD_CONFIG,"MapAddress '%s' failed: %s. Ignoring.", opt->value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       goto cleanup; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (smartlist_len(elts) > 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      log_warn(LD_CONFIG,"Ignoring extra arguments to MapAddress."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cleanup: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    smartlist_clear(elts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  smartlist_free(elts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** As addressmap_register(), but detect the wildcarded status of "from" and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * "to", and do not steal a reference to <b>to</b>. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* XXXX024 move to connection_edge.c */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+addressmap_register_auto(const char *from, const char *to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         time_t expires, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         addressmap_entry_source_t addrmap_source, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         const char **msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int from_wildcard = 0, to_wildcard = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *msg = "whoops, forgot the error message"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!strcmp(to, "*") || !strcmp(from, "*")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      *msg = "can't remap from or to *"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* Detect asterisks in expressions of type: '*.example.com' */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!strncmp(from,"*.",2)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       from += 2; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4903,30 +4930,20 @@ config_register_addressmaps(const or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (to_wildcard && !from_wildcard) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      log_warn(LD_CONFIG, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "Skipping invalid argument '%s' to MapAddress: " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "can only use wildcard (i.e. '*.') if 'from' address " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "uses wildcard also", opt->value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      goto cleanup; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      *msg =  "can only use wildcard (i.e. '*.') if 'from' address " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        "uses wildcard also"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (address_is_invalid_destination(to, 1)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      log_warn(LD_CONFIG, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "Skipping invalid argument '%s' to MapAddress", opt->value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      goto cleanup; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      *msg = "destination is invalid"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    addressmap_register(from, tor_strdup(to), 0, ADDRMAPSRC_TORRC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    addressmap_register(from, tor_strdup(to), expires, addrmap_source, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         from_wildcard, to_wildcard); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (smartlist_len(elts) > 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      log_warn(LD_CONFIG,"Ignoring extra arguments to MapAddress."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cleanup: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    smartlist_clear(elts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  smartlist_free(elts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 |