|  | @@ -46,13 +46,33 @@ static struct socket_opener socket_openers_end[0]
 | 
		
	
		
			
			| 46 | 46 |   * Open URI
 | 
		
	
		
			
			| 47 | 47 |   *
 | 
		
	
		
			
			| 48 | 48 |   * @v xfer		Data transfer interface
 | 
		
	
		
			
			|  | 49 | + * @v uri		URI
 | 
		
	
		
			
			|  | 50 | + * @ret rc		Return status code
 | 
		
	
		
			
			|  | 51 | + */
 | 
		
	
		
			
			|  | 52 | +int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
 | 
		
	
		
			
			|  | 53 | +	struct uri_opener *opener;
 | 
		
	
		
			
			|  | 54 | +
 | 
		
	
		
			
			|  | 55 | +	for ( opener = uri_openers ; opener < uri_openers_end ; opener++ ) {
 | 
		
	
		
			
			|  | 56 | +		if ( strcmp ( uri->scheme, opener->scheme ) == 0 )
 | 
		
	
		
			
			|  | 57 | +			return opener->open ( xfer, uri );
 | 
		
	
		
			
			|  | 58 | +	}
 | 
		
	
		
			
			|  | 59 | +
 | 
		
	
		
			
			|  | 60 | +	DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme "
 | 
		
	
		
			
			|  | 61 | +	       "\"%s\"\n", xfer, uri->scheme );
 | 
		
	
		
			
			|  | 62 | +	return -ENOTSUP;
 | 
		
	
		
			
			|  | 63 | +}
 | 
		
	
		
			
			|  | 64 | +
 | 
		
	
		
			
			|  | 65 | +/**
 | 
		
	
		
			
			|  | 66 | + * Open URI string
 | 
		
	
		
			
			|  | 67 | + *
 | 
		
	
		
			
			|  | 68 | + * @v xfer		Data transfer interface
 | 
		
	
		
			
			| 49 | 69 |   * @v uri_string	URI string (e.g. "http://etherboot.org/kernel")
 | 
		
	
		
			
			| 50 | 70 |   * @ret rc		Return status code
 | 
		
	
		
			
			| 51 | 71 |   */
 | 
		
	
		
			
			| 52 |  | -int xfer_open_uri ( struct xfer_interface *xfer, const char *uri_string ) {
 | 
		
	
		
			
			|  | 72 | +int xfer_open_uri_string ( struct xfer_interface *xfer,
 | 
		
	
		
			
			|  | 73 | +			   const char *uri_string ) {
 | 
		
	
		
			
			| 53 | 74 |  	struct uri *uri;
 | 
		
	
		
			
			| 54 |  | -	struct uri_opener *opener;
 | 
		
	
		
			
			| 55 |  | -	int rc = -ENOTSUP;
 | 
		
	
		
			
			|  | 75 | +	int rc;
 | 
		
	
		
			
			| 56 | 76 |  
 | 
		
	
		
			
			| 57 | 77 |  	DBGC ( xfer, "XFER %p opening URI %s\n", xfer, uri_string );
 | 
		
	
		
			
			| 58 | 78 |  
 | 
		
	
	
		
			
			|  | @@ -60,16 +80,8 @@ int xfer_open_uri ( struct xfer_interface *xfer, const char *uri_string ) {
 | 
		
	
		
			
			| 60 | 80 |  	if ( ! uri )
 | 
		
	
		
			
			| 61 | 81 |  		return -ENOMEM;
 | 
		
	
		
			
			| 62 | 82 |  
 | 
		
	
		
			
			| 63 |  | -	for ( opener = uri_openers ; opener < uri_openers_end ; opener++ ) {
 | 
		
	
		
			
			| 64 |  | -		if ( strcmp ( uri->scheme, opener->scheme ) == 0 ) {
 | 
		
	
		
			
			| 65 |  | -			rc = opener->open ( xfer, uri );
 | 
		
	
		
			
			| 66 |  | -			goto done;
 | 
		
	
		
			
			| 67 |  | -		}
 | 
		
	
		
			
			| 68 |  | -	}
 | 
		
	
		
			
			|  | 83 | +	rc = xfer_open_uri ( xfer, uri );
 | 
		
	
		
			
			| 69 | 84 |  
 | 
		
	
		
			
			| 70 |  | -	DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme "
 | 
		
	
		
			
			| 71 |  | -	       "\"%s\"\n", xfer, uri->scheme );
 | 
		
	
		
			
			| 72 |  | - done:
 | 
		
	
		
			
			| 73 | 85 |  	uri_put ( uri );
 | 
		
	
		
			
			| 74 | 86 |  	return rc;
 | 
		
	
		
			
			| 75 | 87 |  }
 | 
		
	
	
		
			
			|  | @@ -114,10 +126,12 @@ int xfer_open_socket ( struct xfer_interface *xfer, int semantics,
 | 
		
	
		
			
			| 114 | 126 |   */
 | 
		
	
		
			
			| 115 | 127 |  int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args ) {
 | 
		
	
		
			
			| 116 | 128 |  	switch ( type ) {
 | 
		
	
		
			
			| 117 |  | -	case LOCATION_URI: {
 | 
		
	
		
			
			|  | 129 | +	case LOCATION_URI_STRING: {
 | 
		
	
		
			
			| 118 | 130 |  		const char *uri_string = va_arg ( args, const char * );
 | 
		
	
		
			
			| 119 | 131 |  
 | 
		
	
		
			
			| 120 |  | -		return xfer_open_uri ( xfer, uri_string ); }
 | 
		
	
		
			
			|  | 132 | +		return xfer_open_uri_string ( xfer, uri_string ); }
 | 
		
	
		
			
			|  | 133 | +	case LOCATION_URI:
 | 
		
	
		
			
			|  | 134 | +		
 | 
		
	
		
			
			| 121 | 135 |  	case LOCATION_SOCKET: {
 | 
		
	
		
			
			| 122 | 136 |  		int semantics = va_arg ( args, int );
 | 
		
	
		
			
			| 123 | 137 |  		struct sockaddr *peer = va_arg ( args, struct sockaddr * );
 |