]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[xfer] Expose xfer_uri_opener()
authorMichael Brown <mcb30@ipxe.org>
Thu, 27 Jan 2011 18:46:07 +0000 (18:46 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 27 Jan 2011 18:46:07 +0000 (18:46 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/open.c
src/include/ipxe/open.h

index f8ee9f3a8907d777319150dd131203c04608a302..b026efcd98f5173417a7bd8c33773a7e27e9c109 100644 (file)
@@ -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",
+
+       /* 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;
 }
 
index c000990c08fe41bb919394e61378f0fbf5e34774..a522f0cd143696444c67c35b2dcbe79281134b82 100644 (file)
@@ -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 );