open.c File Reference

Data transfer interface opening. More...

#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <gpxe/xfer.h>
#include <gpxe/uri.h>
#include <gpxe/socket.h>
#include <gpxe/open.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
int xfer_open_uri (struct xfer_interface *xfer, struct uri *uri)
 Open URI.
int xfer_open_uri_string (struct xfer_interface *xfer, const char *uri_string)
 Open URI string.
int xfer_open_socket (struct xfer_interface *xfer, int semantics, struct sockaddr *peer, struct sockaddr *local)
 Open socket.
int xfer_vopen (struct xfer_interface *xfer, int type, va_list args)
 Open location.
int xfer_open (struct xfer_interface *xfer, int type,...)
 Open location.
int xfer_vreopen (struct xfer_interface *xfer, int type, va_list args)
 Reopen location.


Detailed Description

Data transfer interface opening.

Definition in file open.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

int xfer_open_uri ( struct xfer_interface xfer,
struct uri uri 
)

Open URI.

Parameters:
xfer Data transfer interface
uri URI
Return values:
rc Return status code
The URI will be regarded as being relative to the current working URI (see churi()).

Definition at line 45 of file open.c.

References cwuri, DBGC, ENOMEM, ENOTSUP, for_each_table_entry, uri_opener::open, resolve_uri(), uri_opener::scheme, uri::scheme, strcmp(), and URI_OPENERS.

Referenced by xfer_open_uri_string(), and xfer_vopen().

00045                                                                    {
00046         struct uri_opener *opener;
00047         struct uri *resolved_uri;
00048         int rc = -ENOTSUP;
00049 
00050         /* Resolve URI */
00051         resolved_uri = resolve_uri ( cwuri, uri );
00052         if ( ! resolved_uri )
00053                 return -ENOMEM;
00054 
00055         /* Find opener which supports this URI scheme */
00056         for_each_table_entry ( opener, URI_OPENERS ) {
00057                 if ( strcmp ( resolved_uri->scheme, opener->scheme ) == 0 ) {
00058                         DBGC ( xfer, "XFER %p opening %s URI\n",
00059                                xfer, opener->scheme );
00060                         rc = opener->open ( xfer, resolved_uri );
00061                         goto done;
00062                 }
00063         }
00064         DBGC ( xfer, "XFER %p attempted to open unsupported URI scheme "
00065                "\"%s\"\n", xfer, resolved_uri->scheme );
00066 
00067  done:
00068         uri_put ( resolved_uri );
00069         return rc;
00070 }

int xfer_open_uri_string ( struct xfer_interface xfer,
const char *  uri_string 
)

Open URI string.

Parameters:
xfer Data transfer interface
uri_string URI string (e.g. "http://etherboot.org/kernel")
Return values:
rc Return status code
The URI will be regarded as being relative to the current working URI (see churi()).

Definition at line 82 of file open.c.

References DBGC, ENOMEM, parse_uri(), and xfer_open_uri().

Referenced by open(), pxe_tftp_open(), and xfer_vopen().

00083                                                     {
00084         struct uri *uri;
00085         int rc;
00086 
00087         DBGC ( xfer, "XFER %p opening URI %s\n", xfer, uri_string );
00088 
00089         uri = parse_uri ( uri_string );
00090         if ( ! uri )
00091                 return -ENOMEM;
00092 
00093         rc = xfer_open_uri ( xfer, uri );
00094 
00095         uri_put ( uri );
00096         return rc;
00097 }

int xfer_open_socket ( struct xfer_interface xfer,
int  semantics,
struct sockaddr peer,
struct sockaddr local 
)

Open socket.

Parameters:
xfer Data transfer interface
semantics Communication semantics (e.g. SOCK_STREAM)
peer Peer socket address
local Local socket address, or NULL
Return values:
rc Return status code

Definition at line 108 of file open.c.

References DBGC, ENOTSUP, socket_opener::family, for_each_table_entry, socket_opener::open, sockaddr::sa_family, socket_opener::semantics, and SOCKET_OPENERS.

Referenced by dns_resolv(), ftp_reply(), slam_open(), start_dhcp(), start_pxebs(), tftp_reopen_mc(), and xfer_vopen().

00109                                                                        {
00110         struct socket_opener *opener;
00111 
00112         DBGC ( xfer, "XFER %p opening (%s,%s) socket\n", xfer,
00113                socket_semantics_name ( semantics ),
00114                socket_family_name ( peer->sa_family ) );
00115 
00116         for_each_table_entry ( opener, SOCKET_OPENERS ) {
00117                 if ( ( opener->semantics == semantics ) &&
00118                      ( opener->family == peer->sa_family ) ) {
00119                         return opener->open ( xfer, peer, local );
00120                 }
00121         }
00122 
00123         DBGC ( xfer, "XFER %p attempted to open unsupported socket type "
00124                "(%s,%s)\n", xfer, socket_semantics_name ( semantics ),
00125                socket_family_name ( peer->sa_family ) );
00126         return -ENOTSUP;
00127 }

int xfer_vopen ( struct xfer_interface xfer,
int  type,
va_list  args 
)

Open location.

Parameters:
xfer Data transfer interface
type Location type
args Remaining arguments depend upon location type
Return values:
rc Return status code

Definition at line 137 of file open.c.

References DBGC, ENOTSUP, LOCATION_SOCKET, LOCATION_URI, LOCATION_URI_STRING, va_arg, xfer_open_socket(), xfer_open_uri(), and xfer_open_uri_string().

Referenced by create_downloader(), xfer_open(), and xfer_vreopen().

00137                                                                        {
00138         switch ( type ) {
00139         case LOCATION_URI_STRING: {
00140                 const char *uri_string = va_arg ( args, const char * );
00141 
00142                 return xfer_open_uri_string ( xfer, uri_string ); }
00143         case LOCATION_URI: {
00144                 struct uri *uri = va_arg ( args, struct uri * );
00145 
00146                 return xfer_open_uri ( xfer, uri ); }
00147         case LOCATION_SOCKET: {
00148                 int semantics = va_arg ( args, int );
00149                 struct sockaddr *peer = va_arg ( args, struct sockaddr * );
00150                 struct sockaddr *local = va_arg ( args, struct sockaddr * );
00151 
00152                 return xfer_open_socket ( xfer, semantics, peer, local ); }
00153         default:
00154                 DBGC ( xfer, "XFER %p attempted to open unsupported location "
00155                        "type %d\n", xfer, type );
00156                 return -ENOTSUP;
00157         }
00158 }

int xfer_open ( struct xfer_interface xfer,
int  type,
  ... 
)

Open location.

Parameters:
xfer Data transfer interface
type Location type
... Remaining arguments depend upon location type
Return values:
rc Return status code

Definition at line 168 of file open.c.

References va_end, va_start, and xfer_vopen().

00168                                                              {
00169         va_list args;
00170         int rc;
00171 
00172         va_start ( args, type );
00173         rc = xfer_vopen ( xfer, type, args );
00174         va_end ( args );
00175         return rc;
00176 }

int xfer_vreopen ( struct xfer_interface xfer,
int  type,
va_list  args 
)

Reopen location.

Parameters:
xfer Data transfer interface
type Location type
args Remaining arguments depend upon location type
Return values:
rc Return status code
This will close the existing connection and open a new connection using xfer_vopen(). It is intended to be used as a .vredirect method handler.

Definition at line 190 of file open.c.

References xfer_close(), and xfer_vopen().

Referenced by iscsi_vredirect().

00190                                                                          {
00191 
00192         /* Close existing connection */
00193         xfer_close ( xfer, 0 );
00194 
00195         /* Open new location */
00196         return xfer_vopen ( xfer, type, args );
00197 }


Generated on Tue Apr 6 20:01:14 2010 for gPXE by  doxygen 1.5.7.1