open.h File Reference

Data transfer interface opening. More...

#include <stdarg.h>
#include <gpxe/tables.h>
#include <gpxe/socket.h>

Go to the source code of this file.

Data Structures

struct  uri_opener
 A URI opener. More...
struct  socket_opener
 A socket opener. More...

Defines

#define URI_OPENERS   __table ( struct uri_opener, "uri_openers" )
 URI opener table.
#define __uri_opener   __table_entry ( URI_OPENERS, 01 )
 Register a URI opener.
#define SOCKET_OPENERS   __table ( struct socket_opener, "socket_openers" )
 Socket opener table.
#define __socket_opener   __table_entry ( SOCKET_OPENERS, 01 )
 Register a socket opener.

Enumerations

enum  { LOCATION_URI = 1, LOCATION_URI_STRING, LOCATION_SOCKET }
 Location types. More...

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_named_socket (struct xfer_interface *xfer, int semantics, struct sockaddr *peer, const char *name, struct sockaddr *local)
 Open named socket.
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.h.


Define Documentation

#define URI_OPENERS   __table ( struct uri_opener, "uri_openers" )

URI opener table.

Definition at line 64 of file open.h.

Referenced by xfer_open_uri().

struct uri_opener mtftp_uri_opener __uri_opener   __table_entry ( URI_OPENERS, 01 ) [read]

Register a URI opener.

MTFTP URI opener.

TFTM URI opener.

TFTP URI opener.

Definition at line 67 of file open.h.

#define SOCKET_OPENERS   __table ( struct socket_opener, "socket_openers" )

Socket opener table.

Definition at line 87 of file open.h.

Referenced by xfer_open_socket().

#define __socket_opener   __table_entry ( SOCKET_OPENERS, 01 )

Register a socket opener.

Definition at line 90 of file open.h.


Enumeration Type Documentation

anonymous enum

Location types.

Enumerator:
LOCATION_URI  Location is a URI.

Parameter list for open() is:

struct uri *uri;

LOCATION_URI_STRING  Location is a URI string.

Parameter list for open() is:

const char *uri_string;

LOCATION_SOCKET  Location is a socket.

Parameter list for open() is:

int semantics; struct sockaddr *peer; struct sockaddr *local;

Definition at line 20 of file open.h.

00020      {
00021         /** Location is a URI
00022          *
00023          * Parameter list for open() is:
00024          *
00025          * struct uri *uri;
00026          */
00027         LOCATION_URI = 1,
00028         /** Location is a URI string
00029          *
00030          * Parameter list for open() is:
00031          *
00032          * const char *uri_string;
00033          */
00034         LOCATION_URI_STRING,
00035         /** Location is a socket
00036          *
00037          * Parameter list for open() is:
00038          *
00039          * int semantics;
00040          * struct sockaddr *peer;
00041          * struct sockaddr *local;
00042          */
00043         LOCATION_SOCKET,
00044 };


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_named_socket ( struct xfer_interface xfer,
int  semantics,
struct sockaddr peer,
const char *  name,
struct sockaddr local 
)

Open named socket.

Parameters:
semantics Communication semantics (e.g. SOCK_STREAM)
peer Peer socket address to complete
name Name to resolve
local Local socket address, or NULL
Return values:
rc Return status code

Definition at line 382 of file resolv.c.

References DBGC, ENOMEM, named_socket::have_local, named_socket::local, memcpy, ref_put(), named_socket::refcnt, resolv(), named_socket::resolv, resolv_init(), named_socket::semantics, named_socket::xfer, xfer_init(), and zalloc().

Referenced by ftp_open(), http_open_filter(), iscsi_open_connection(), slam_open(), tcp_open_uri(), tftp_reopen(), and udp_open_uri().

00384                                                       {
00385         struct named_socket *named;
00386         int rc;
00387 
00388         /* Allocate and initialise structure */
00389         named = zalloc ( sizeof ( *named ) );
00390         if ( ! named )
00391                 return -ENOMEM;
00392         xfer_init ( &named->xfer, &named_xfer_ops, &named->refcnt );
00393         resolv_init ( &named->resolv, &named_resolv_ops, &named->refcnt );
00394         named->semantics = semantics;
00395         if ( local ) {
00396                 memcpy ( &named->local, local, sizeof ( named->local ) );
00397                 named->have_local = 1;
00398         }
00399 
00400         DBGC ( named, "RESOLV %p opening named socket \"%s\"\n",
00401                named, name );
00402 
00403         /* Start name resolution */
00404         if ( ( rc = resolv ( &named->resolv, name, peer ) ) != 0 )
00405                 goto err;
00406 
00407         /* Attach parent interface, mortalise self, and return */
00408         xfer_plug_plug ( &named->xfer, xfer );
00409         ref_put ( &named->refcnt );
00410         return 0;
00411 
00412  err:
00413         ref_put ( &named->refcnt );
00414         return rc;
00415 }

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:51 2010 for gPXE by  doxygen 1.5.7.1