#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. | |
Definition in file open.c.
| 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_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