|  | @@ -48,18 +48,33 @@ static struct socket_opener socket_openers_end[0]
 | 
		
	
		
			
			| 48 | 48 |   * @v xfer		Data transfer interface
 | 
		
	
		
			
			| 49 | 49 |   * @v uri		URI
 | 
		
	
		
			
			| 50 | 50 |   * @ret rc		Return status code
 | 
		
	
		
			
			|  | 51 | + *
 | 
		
	
		
			
			|  | 52 | + * The URI will be regarded as being relative to the current working
 | 
		
	
		
			
			|  | 53 | + * URI (see churi()).
 | 
		
	
		
			
			| 51 | 54 |   */
 | 
		
	
		
			
			| 52 | 55 |  int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
 | 
		
	
		
			
			| 53 | 56 |  	struct uri_opener *opener;
 | 
		
	
		
			
			|  | 57 | +	struct uri *resolved_uri;
 | 
		
	
		
			
			|  | 58 | +	int rc = -ENOTSUP;
 | 
		
	
		
			
			|  | 59 | +
 | 
		
	
		
			
			|  | 60 | +	/* Resolve URI */
 | 
		
	
		
			
			|  | 61 | +	resolved_uri = resolve_uri ( cwuri, uri );
 | 
		
	
		
			
			|  | 62 | +	if ( ! resolved_uri )
 | 
		
	
		
			
			|  | 63 | +		return -ENOMEM;
 | 
		
	
		
			
			| 54 | 64 |  
 | 
		
	
		
			
			|  | 65 | +	/* Find opener which supports this URI scheme */
 | 
		
	
		
			
			| 55 | 66 |  	for ( opener = uri_openers ; opener < uri_openers_end ; opener++ ) {
 | 
		
	
		
			
			| 56 |  | -		if ( strcmp ( uri->scheme, opener->scheme ) == 0 )
 | 
		
	
		
			
			| 57 |  | -			return opener->open ( xfer, uri );
 | 
		
	
		
			
			|  | 67 | +		if ( strcmp ( resolved_uri->scheme, opener->scheme ) == 0 ) {
 | 
		
	
		
			
			|  | 68 | +			rc = opener->open ( xfer, resolved_uri );
 | 
		
	
		
			
			|  | 69 | +			goto done;
 | 
		
	
		
			
			|  | 70 | +		}
 | 
		
	
		
			
			| 58 | 71 |  	}
 | 
		
	
		
			
			| 59 |  | -
 | 
		
	
		
			
			| 60 | 72 |  	DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme "
 | 
		
	
		
			
			| 61 |  | -	       "\"%s\"\n", xfer, uri->scheme );
 | 
		
	
		
			
			| 62 |  | -	return -ENOTSUP;
 | 
		
	
		
			
			|  | 73 | +	       "\"%s\"\n", xfer, resolved_uri->scheme );
 | 
		
	
		
			
			|  | 74 | +
 | 
		
	
		
			
			|  | 75 | + done:
 | 
		
	
		
			
			|  | 76 | +	uri_put ( resolved_uri );
 | 
		
	
		
			
			|  | 77 | +	return rc;
 | 
		
	
		
			
			| 63 | 78 |  }
 | 
		
	
		
			
			| 64 | 79 |  
 | 
		
	
		
			
			| 65 | 80 |  /**
 | 
		
	
	
		
			
			|  | @@ -68,6 +83,9 @@ int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) {
 | 
		
	
		
			
			| 68 | 83 |   * @v xfer		Data transfer interface
 | 
		
	
		
			
			| 69 | 84 |   * @v uri_string	URI string (e.g. "http://etherboot.org/kernel")
 | 
		
	
		
			
			| 70 | 85 |   * @ret rc		Return status code
 | 
		
	
		
			
			|  | 86 | + *
 | 
		
	
		
			
			|  | 87 | + * The URI will be regarded as being relative to the current working
 | 
		
	
		
			
			|  | 88 | + * URI (see churi()).
 | 
		
	
		
			
			| 71 | 89 |   */
 | 
		
	
		
			
			| 72 | 90 |  int xfer_open_uri_string ( struct xfer_interface *xfer,
 | 
		
	
		
			
			| 73 | 91 |  			   const char *uri_string ) {
 |