#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. | |
Definition in file open.h.
| #define URI_OPENERS __table ( struct uri_opener, "uri_openers" ) |
struct uri_opener mtftp_uri_opener __uri_opener __table_entry ( URI_OPENERS, 01 ) [read] |
| #define SOCKET_OPENERS __table ( struct socket_opener, "socket_openers" ) |
| #define __socket_opener __table_entry ( SOCKET_OPENERS, 01 ) |
| anonymous enum |
Location types.
| 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 };
| FILE_LICENCE | ( | GPL2_OR_LATER | ) |
| int xfer_open_uri | ( | struct xfer_interface * | xfer, | |
| struct uri * | uri | |||
| ) |
Open URI.
| rc | Return status code |
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.
| xfer | Data transfer interface | |
| uri_string | URI string (e.g. "http://etherboot.org/kernel") |
| rc | Return status code |
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.
| semantics | Communication semantics (e.g. SOCK_STREAM) | |
| peer | Peer socket address to complete | |
| name | Name to resolve | |
| local | Local socket address, or NULL |
| 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.
| xfer | Data transfer interface | |
| semantics | Communication semantics (e.g. SOCK_STREAM) | |
| peer | Peer socket address | |
| local | Local socket address, or NULL |
| 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.
| xfer | Data transfer interface | |
| type | Location type | |
| args | Remaining arguments depend upon location type |
| 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.
| xfer | Data transfer interface | |
| type | Location type | |
| ... | Remaining arguments depend upon location type |
| 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.
| xfer | Data transfer interface | |
| type | Location type | |
| args | Remaining arguments depend upon location type |
| rc | Return status code |
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 }
1.5.7.1