aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2011-01-27 18:46:07 +0000
committerMichael Brown <mcb30@ipxe.org>2011-01-27 18:46:07 +0000
commit35a50399a5881360303c0ed2d49918a660dd727d (patch)
tree3e503bea896139ebecc23e39bf40124ffc560607
parentaa69bf84d22e2fb136a1a2bc467980c646a58fe3 (diff)
downloadipxe-35a50399a5881360303c0ed2d49918a660dd727d.tar.gz
[xfer] Expose xfer_uri_opener()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/core/open.c53
-rw-r--r--src/include/ipxe/open.h1
2 files changed, 40 insertions, 14 deletions
diff --git a/src/core/open.c b/src/core/open.c
index f8ee9f3a8..b026efcd9 100644
--- a/src/core/open.c
+++ b/src/core/open.c
@@ -33,6 +33,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
*
* @v intf Data transfer interface
@@ -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",
+
+ /* 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;
+ }
- done:
+ 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 c000990c0..a522f0cd1 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 );