diff options
| author | Michael Brown | 2007-06-13 17:28:32 +0200 |
|---|---|---|
| committer | Michael Brown | 2007-06-13 17:28:32 +0200 |
| commit | 4f309ff0c7b94354fe3a5a26ec6ac4b7cf48e5c8 (patch) | |
| tree | d80095235ad57a8285d7706af79d1a50706278ea | |
| parent | Add concept of "current working URI". (diff) | |
| download | ipxe-4f309ff0c7b94354fe3a5a26ec6ac4b7cf48e5c8.tar.gz ipxe-4f309ff0c7b94354fe3a5a26ec6ac4b7cf48e5c8.tar.xz ipxe-4f309ff0c7b94354fe3a5a26ec6ac4b7cf48e5c8.zip | |
Treat URIs opened via xfer_open() and friends as relative to the
current working URI.
| -rw-r--r-- | src/core/open.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/core/open.c b/src/core/open.c index ea4853477..9f3dc5ff4 100644 --- a/src/core/open.c +++ b/src/core/open.c @@ -48,18 +48,33 @@ static struct socket_opener socket_openers_end[0] * @v xfer Data transfer interface * @v uri URI * @ret rc Return status code + * + * The URI will be regarded as being relative to the current working + * URI (see churi()). */ int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) { struct uri_opener *opener; + struct uri *resolved_uri; + int rc = -ENOTSUP; + + /* Resolve URI */ + resolved_uri = resolve_uri ( cwuri, uri ); + if ( ! resolved_uri ) + return -ENOMEM; + /* Find opener which supports this URI scheme */ for ( opener = uri_openers ; opener < uri_openers_end ; opener++ ) { - if ( strcmp ( uri->scheme, opener->scheme ) == 0 ) - return opener->open ( xfer, uri ); + if ( strcmp ( resolved_uri->scheme, opener->scheme ) == 0 ) { + rc = opener->open ( xfer, resolved_uri ); + goto done; + } } - DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme " - "\"%s\"\n", xfer, uri->scheme ); - return -ENOTSUP; + "\"%s\"\n", xfer, resolved_uri->scheme ); + + done: + uri_put ( resolved_uri ); + return rc; } /** @@ -68,6 +83,9 @@ int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ) { * @v xfer Data transfer interface * @v uri_string URI string (e.g. "http://etherboot.org/kernel") * @ret rc Return status code + * + * The URI will be regarded as being relative to the current working + * URI (see churi()). */ int xfer_open_uri_string ( struct xfer_interface *xfer, const char *uri_string ) { |
