From 35a50399a5881360303c0ed2d49918a660dd727d Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 27 Jan 2011 18:46:07 +0000 Subject: [PATCH] [xfer] Expose xfer_uri_opener() Signed-off-by: Michael Brown --- src/core/open.c | 55 ++++++++++++++++++++++++++++++----------- src/include/ipxe/open.h | 1 + 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/core/open.c b/src/core/open.c index f8ee9f3a..b026efcd 100644 --- a/src/core/open.c +++ b/src/core/open.c @@ -32,6 +32,22 @@ FILE_LICENCE ( GPL2_OR_LATER ); * */ +/** + * Find opener for URI scheme + * + * @v scheme URI scheme + * @ret opener Opener, or NULL + */ +struct uri_opener * xfer_uri_opener ( const char *scheme ) { + struct uri_opener *opener; + + for_each_table_entry ( opener, URI_OPENERS ) { + if ( strcmp ( scheme, opener->scheme ) == 0 ) + return opener; + } + return NULL; +} + /** * Open URI * @@ -45,29 +61,38 @@ FILE_LICENCE ( GPL2_OR_LATER ); int xfer_open_uri ( struct interface *intf, struct uri *uri ) { struct uri_opener *opener; struct uri *resolved_uri; - int rc = -ENOTSUP; + int rc; /* Resolve URI */ resolved_uri = resolve_uri ( cwuri, uri ); - if ( ! resolved_uri ) - return -ENOMEM; + if ( ! resolved_uri ) { + rc = -ENOMEM; + goto err_resolve_uri; + } /* Find opener which supports this URI scheme */ - for_each_table_entry ( opener, URI_OPENERS ) { - if ( strcmp ( resolved_uri->scheme, opener->scheme ) == 0 ) { - DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT - " opening %s URI\n", INTF_DBG ( intf ), - resolved_uri->scheme ); - rc = opener->open ( intf, resolved_uri ); - goto done; - } + opener = xfer_uri_opener ( resolved_uri->scheme ); + if ( ! opener ) { + DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to open " + "unsupported URI scheme \"%s\"\n", + INTF_DBG ( intf ), resolved_uri->scheme ); + rc = -ENOTSUP; + goto err_opener; } - DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to open " - "unsupported URI scheme \"%s\"\n", - INTF_DBG ( intf ), resolved_uri->scheme ); - done: + /* Call opener */ + DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " opening %s URI\n", + INTF_DBG ( intf ), resolved_uri->scheme ); + if ( ( rc = opener->open ( intf, resolved_uri ) ) != 0 ) { + DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " could not open: " + "%s\n", INTF_DBG ( intf ), strerror ( rc ) ); + goto err_open; + } + + err_open: + err_opener: uri_put ( resolved_uri ); + err_resolve_uri: return rc; } diff --git a/src/include/ipxe/open.h b/src/include/ipxe/open.h index c000990c..a522f0cd 100644 --- a/src/include/ipxe/open.h +++ b/src/include/ipxe/open.h @@ -89,6 +89,7 @@ struct socket_opener { /** Register a socket opener */ #define __socket_opener __table_entry ( SOCKET_OPENERS, 01 ) +extern struct uri_opener * xfer_uri_opener ( const char *scheme ); extern int xfer_open_uri ( struct interface *intf, struct uri *uri ); extern int xfer_open_uri_string ( struct interface *intf, const char *uri_string );