|  | @@ -378,6 +378,63 @@ circuit_purpose_to_controller_string(uint8_t purpose)
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/** Return a string specifying the state of the hidden-service circuit
 | 
	
		
			
				|  |  | + * purpose <b>purpose</b>, or NULL if <b>purpose</b> is not a
 | 
	
		
			
				|  |  | + * hidden-service-related circuit purpose. */
 | 
	
		
			
				|  |  | +const char *
 | 
	
		
			
				|  |  | +circuit_purpose_to_controller_hs_state_string(uint8_t purpose)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  switch (purpose)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    default:
 | 
	
		
			
				|  |  | +      log_fn(LOG_WARN, LD_BUG,
 | 
	
		
			
				|  |  | +             "Unrecognized circuit purpose: %d",
 | 
	
		
			
				|  |  | +             (int)purpose);
 | 
	
		
			
				|  |  | +      tor_fragile_assert();
 | 
	
		
			
				|  |  | +      /* fall through */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_OR:
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_GENERAL:
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT:
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_TESTING:
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_CONTROLLER:
 | 
	
		
			
				|  |  | +      return NULL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_INTRO_POINT:
 | 
	
		
			
				|  |  | +      return "OR_HSSI_ESTABLISHED";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_REND_POINT_WAITING:
 | 
	
		
			
				|  |  | +      return "OR_HSCR_ESTABLISHED";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_REND_ESTABLISHED:
 | 
	
		
			
				|  |  | +      return "OR_HS_R_JOINED";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_INTRODUCING:
 | 
	
		
			
				|  |  | +      return "HSCI_CONNECTING";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT:
 | 
	
		
			
				|  |  | +      return "HSCI_INTRO_SENT";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED:
 | 
	
		
			
				|  |  | +      return "HSCI_DONE";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
 | 
	
		
			
				|  |  | +      return "HSCR_CONNECTING";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_REND_READY:
 | 
	
		
			
				|  |  | +      return "HSCR_ESTABLISHED_IDLE";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED:
 | 
	
		
			
				|  |  | +      return "HSCR_ESTABLISHED_WAITING";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_C_REND_JOINED:
 | 
	
		
			
				|  |  | +      return "HSCR_JOINED";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
 | 
	
		
			
				|  |  | +      return "HSSI_CONNECTING";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_S_INTRO:
 | 
	
		
			
				|  |  | +      return "HSSI_ESTABLISHED";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_S_CONNECT_REND:
 | 
	
		
			
				|  |  | +      return "HSSR_CONNECTING";
 | 
	
		
			
				|  |  | +    case CIRCUIT_PURPOSE_S_REND_JOINED:
 | 
	
		
			
				|  |  | +      return "HSSR_JOINED";
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /** Return a human-readable string for the circuit purpose <b>purpose</b>. */
 | 
	
		
			
				|  |  |  const char *
 | 
	
		
			
				|  |  |  circuit_purpose_to_string(uint8_t purpose)
 |