*
*/
+/**
+ * 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
*
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;
}
/** 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 );