iPXE
open.h File Reference

Data transfer interface opening. More...

#include <stdarg.h>
#include <ipxe/tables.h>
#include <ipxe/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...

Macros

#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_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
struct uri_openerxfer_uri_opener (const char *scheme)
 Find opener for URI scheme.
int xfer_open_uri (struct interface *intf, struct uri *uri)
 Open URI.
int xfer_open_uri_string (struct interface *intf, const char *uri_string)
 Open URI string.
int xfer_open_named_socket (struct interface *intf, int semantics, struct sockaddr *peer, const char *name, struct sockaddr *local)
 Open named socket.
int xfer_open_socket (struct interface *intf, int semantics, struct sockaddr *peer, struct sockaddr *local)
 Open socket.
int xfer_vopen (struct interface *intf, int type, va_list args)
 Open location.
int xfer_open (struct interface *intf, int type,...)
 Open location.
int xfer_vreopen (struct interface *intf, int type, va_list args)
 Reopen location.

Detailed Description

Data transfer interface opening.

Definition in file open.h.

Macro Definition Documentation

◆ URI_OPENERS

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

URI opener table.

Definition at line 65 of file open.h.

Referenced by xfer_uri_opener().

◆ __uri_opener

struct uri_opener mtftp_uri_opener __uri_opener   __table_entry ( URI_OPENERS, 01 )

Register a URI opener.

MTFTP URI opener.

TFTM URI opener.

Definition at line 68 of file open.h.

◆ SOCKET_OPENERS

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

Socket opener table.

Definition at line 86 of file open.h.

Referenced by xfer_open_socket().

◆ __socket_opener

#define __socket_opener   __table_entry ( SOCKET_OPENERS, 01 )

Register a socket opener.

Definition at line 89 of file open.h.

Enumeration Type Documentation

◆ anonymous enum

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 21 of file open.h.

21 {
22 /** Location is a URI
23 *
24 * Parameter list for open() is:
25 *
26 * struct uri *uri;
27 */
28 LOCATION_URI = 1,
29 /** Location is a URI string
30 *
31 * Parameter list for open() is:
32 *
33 * const char *uri_string;
34 */
36 /** Location is a socket
37 *
38 * Parameter list for open() is:
39 *
40 * int semantics;
41 * struct sockaddr *peer;
42 * struct sockaddr *local;
43 */
45};
@ LOCATION_SOCKET
Location is a socket.
Definition open.h:44
@ LOCATION_URI
Location is a URI.
Definition open.h:28
@ LOCATION_URI_STRING
Location is a URI string.
Definition open.h:35

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ xfer_uri_opener()

struct uri_opener * xfer_uri_opener ( const char * scheme)
extern

Find opener for URI scheme.

Parameters
schemeURI scheme
Return values
openerOpener, or NULL

Definition at line 48 of file open.c.

48 {
49 struct uri_opener *opener;
50
52 if ( strcasecmp ( scheme, opener->scheme ) == 0 )
53 return opener;
54 }
55 return NULL;
56}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define URI_OPENERS
URI opener table.
Definition open.h:65
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition string.c:209
A URI opener.
Definition open.h:48
const char * scheme
URI protocol name.
Definition open.h:54
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386

References for_each_table_entry, NULL, uri_opener::scheme, strcasecmp(), and URI_OPENERS.

Referenced by netboot(), and xfer_open_uri().

◆ xfer_open_uri()

int xfer_open_uri ( struct interface * intf,
struct uri * uri )
extern

Open URI.

Parameters
intfData transfer interface
uriURI
Return values
rcReturn status code

The URI will be regarded as being relative to the current working URI (see churi()).

Definition at line 68 of file open.c.

68 {
69 struct uri_opener *opener;
70 struct uri *resolved_uri;
71 int rc;
72
73 /* Resolve URI */
74 resolved_uri = resolve_uri ( cwuri, uri );
75 if ( ! resolved_uri ) {
76 rc = -ENOMEM;
77 goto err_resolve_uri;
78 }
79
80 /* Find opener which supports this URI scheme */
81 opener = xfer_uri_opener ( resolved_uri->scheme );
82 if ( ! opener ) {
83 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to open "
84 "unsupported URI scheme \"%s\"\n",
85 INTF_DBG ( intf ), resolved_uri->scheme );
86 rc = -ENOTSUP;
87 goto err_opener;
88 }
89
90 /* Call opener */
91 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " opening %s URI\n",
92 INTF_DBG ( intf ), resolved_uri->scheme );
93 if ( ( rc = opener->open ( intf, resolved_uri ) ) != 0 ) {
94 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " could not open: "
95 "%s\n", INTF_DBG ( intf ), strerror ( rc ) );
96 goto err_open;
97 }
98
99 err_open:
100 err_opener:
101 uri_put ( resolved_uri );
102 err_resolve_uri:
103 return rc;
104}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
struct uri * cwuri
Current working URI.
Definition cwuri.c:39
#define DBGC(...)
Definition compiler.h:505
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define INTF_DBG(intf)
printf() arguments for representing an object interface
Definition interface.h:293
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition interface.h:282
#define INTF_FMT
printf() format string for INTF_DBG()
Definition interface.h:285
struct uri_opener * xfer_uri_opener(const char *scheme)
Find opener for URI scheme.
Definition open.c:48
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
int(* open)(struct interface *intf, struct uri *uri)
Open URI.
Definition open.h:61
A Uniform Resource Identifier.
Definition uri.h:65
const char * scheme
Scheme.
Definition uri.h:69
struct uri * resolve_uri(const struct uri *base_uri, struct uri *relative_uri)
Resolve base+relative URI.
Definition uri.c:696
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition uri.h:206

References cwuri, DBGC, ENOMEM, ENOTSUP, INTF_COL, INTF_DBG, INTF_FMT, uri_opener::open, rc, resolve_uri(), uri::scheme, strerror(), uri_put(), and xfer_uri_opener().

Referenced by create_downloader(), efi_pxe_tftp_open(), pxe_tftp_open(), sanpath_open(), xfer_open_uri_string(), and xfer_vopen().

◆ xfer_open_uri_string()

int xfer_open_uri_string ( struct interface * intf,
const char * uri_string )
extern

Open URI string.

Parameters
intfData transfer interface
uri_stringURI string (e.g. "http://ipxe.org/kernel")
Return values
rcReturn status code

The URI will be regarded as being relative to the current working URI (see churi()).

Definition at line 116 of file open.c.

117 {
118 struct uri *uri;
119 int rc;
120
121 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " opening URI %s\n",
122 INTF_DBG ( intf ), uri_string );
123
124 uri = parse_uri ( uri_string );
125 if ( ! uri )
126 return -ENOMEM;
127
128 rc = xfer_open_uri ( intf, uri );
129
130 uri_put ( uri );
131 return rc;
132}
int xfer_open_uri(struct interface *intf, struct uri *uri)
Open URI.
Definition open.c:68
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition uri.c:297

References DBGC, ENOMEM, INTF_COL, INTF_DBG, INTF_FMT, parse_uri(), rc, uri_put(), and xfer_open_uri().

Referenced by open(), validator_start_download(), validator_start_ocsp(), and xfer_vopen().

◆ xfer_open_named_socket()

int xfer_open_named_socket ( struct interface * xfer,
int semantics,
struct sockaddr * peer,
const char * name,
struct sockaddr * local )
extern

Open named socket.

Parameters
semanticsCommunication semantics (e.g. SOCK_STREAM)
peerPeer socket address to complete
nameName to resolve
localLocal socket address, or NULL
Return values
rcReturn status code

Definition at line 403 of file resolv.c.

405 {
406 struct named_socket *named;
407 int rc;
408
409 /* Allocate and initialise structure */
410 named = zalloc ( sizeof ( *named ) );
411 if ( ! named )
412 return -ENOMEM;
413 ref_init ( &named->refcnt, NULL );
414 intf_init ( &named->xfer, &named_xfer_desc, &named->refcnt );
415 intf_init ( &named->resolv, &named_resolv_desc, &named->refcnt );
416 named->semantics = semantics;
417 if ( local ) {
418 memcpy ( &named->local, local, sizeof ( named->local ) );
419 named->have_local = 1;
420 }
421
422 DBGC ( named, "NAMED %p opening \"%s\"\n",
423 named, name );
424
425 /* Start name resolution */
426 if ( ( rc = resolv ( &named->resolv, name, peer ) ) != 0 )
427 goto err;
428
429 /* Attach parent interface, mortalise self, and return */
430 intf_plug_plug ( &named->xfer, xfer );
431 ref_put ( &named->refcnt );
432 return 0;
433
434 err:
435 ref_put ( &named->refcnt );
436 return rc;
437}
const char * name
Definition ath9k_hw.c:1986
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition interface.c:108
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition interface.h:204
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
struct mschapv2_challenge peer
Peer challenge.
Definition mschapv2.h:1
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition refcnt.h:65
static struct interface_descriptor named_xfer_desc
Named socket opener data transfer interface descriptor.
Definition resolv.c:348
static struct interface_descriptor named_resolv_desc
Named socket opener resolver interface descriptor.
Definition resolv.c:390
int resolv(struct interface *resolv, const char *name, struct sockaddr *sa)
Start name resolution.
Definition resolv.c:258
A named socket.
Definition resolv.c:303
int have_local
Stored local socket address exists.
Definition resolv.c:315
struct interface xfer
Data transfer interface.
Definition resolv.c:307
struct interface resolv
Name resolution interface.
Definition resolv.c:309
struct sockaddr local
Stored local socket address, if applicable.
Definition resolv.c:313
int semantics
Communication semantics (e.g.
Definition resolv.c:311
struct refcnt refcnt
Reference counter.
Definition resolv.c:305

References DBGC, ENOMEM, named_socket::have_local, intf_init(), intf_plug_plug(), named_socket::local, memcpy(), name, named_resolv_desc, named_xfer_desc, NULL, peer, rc, ref_init, ref_put, named_socket::refcnt, named_socket::resolv, resolv(), named_socket::semantics, named_socket::xfer, and zalloc().

Referenced by apply_syslogs_settings(), create_pinger(), ftp_open(), http_connect(), iscsi_open_connection(), nfs_connect(), slam_open(), start_ntp(), tcp_open_uri(), tftp_reopen(), and udp_open_uri().

◆ xfer_open_socket()

int xfer_open_socket ( struct interface * intf,
int semantics,
struct sockaddr * peer,
struct sockaddr * local )
extern

Open socket.

Parameters
intfData transfer interface
semanticsCommunication semantics (e.g. SOCK_STREAM)
peerPeer socket address
localLocal socket address, or NULL
Return values
rcReturn status code

Definition at line 143 of file open.c.

144 {
145 struct socket_opener *opener;
146
147 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " opening (%s,%s) socket\n",
149 socket_family_name ( peer->sa_family ) );
150
152 if ( opener->semantics == semantics )
153 return opener->open ( intf, peer, local );
154 }
155
156 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to open "
157 "unsupported socket type (%s,%s)\n",
159 socket_family_name ( peer->sa_family ) );
160 return -ENOTSUP;
161}
#define SOCKET_OPENERS
Socket opener table.
Definition open.h:86
static const char * socket_semantics_name(int semantics)
Name communication semantics.
Definition socket.h:46
static const char * socket_family_name(int family)
Name address family.
Definition socket.h:76
A socket opener.
Definition open.h:71
int(* open)(struct interface *intf, struct sockaddr *peer, struct sockaddr *local)
Open socket.
Definition open.h:81
int semantics
Communication semantics (e.g.
Definition open.h:73

References DBGC, ENOTSUP, for_each_table_entry, INTF_COL, INTF_DBG, INTF_FMT, socket_opener::open, peer, socket_opener::semantics, socket_family_name(), SOCKET_OPENERS, and socket_semantics_name().

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

◆ xfer_vopen()

int xfer_vopen ( struct interface * intf,
int type,
va_list args )
extern

Open location.

Parameters
intfData transfer interface
typeLocation type
argsRemaining arguments depend upon location type
Return values
rcReturn status code

Definition at line 171 of file open.c.

171 {
172 switch ( type ) {
173 case LOCATION_URI_STRING: {
174 const char *uri_string = va_arg ( args, const char * );
175
176 return xfer_open_uri_string ( intf, uri_string ); }
177 case LOCATION_URI: {
178 struct uri *uri = va_arg ( args, struct uri * );
179
180 return xfer_open_uri ( intf, uri ); }
181 case LOCATION_SOCKET: {
182 int semantics = va_arg ( args, int );
183 struct sockaddr *peer = va_arg ( args, struct sockaddr * );
184 struct sockaddr *local = va_arg ( args, struct sockaddr * );
185
186 return xfer_open_socket ( intf, semantics, peer, local ); }
187 default:
188 DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " attempted to "
189 "open unsupported location type %d\n",
190 INTF_DBG ( intf ), type );
191 return -ENOTSUP;
192 }
193}
uint32_t type
Operating system type.
Definition ena.h:1
int xfer_open_socket(struct interface *intf, int semantics, struct sockaddr *peer, struct sockaddr *local)
Open socket.
Definition open.c:143
int xfer_open_uri_string(struct interface *intf, const char *uri_string)
Open URI string.
Definition open.c:116
#define va_arg(ap, type)
Definition stdarg.h:9
Generalized socket address structure.
Definition socket.h:97

References DBGC, ENOTSUP, INTF_COL, INTF_DBG, INTF_FMT, LOCATION_SOCKET, LOCATION_URI, LOCATION_URI_STRING, peer, type, va_arg, xfer_open_socket(), xfer_open_uri(), and xfer_open_uri_string().

Referenced by xfer_open(), and xfer_vreopen().

◆ xfer_open()

int xfer_open ( struct interface * intf,
int type,
... )
extern

Open location.

Parameters
intfData transfer interface
typeLocation type
...Remaining arguments depend upon location type
Return values
rcReturn status code

Definition at line 203 of file open.c.

203 {
204 va_list args;
205 int rc;
206
207 va_start ( args, type );
208 rc = xfer_vopen ( intf, type, args );
209 va_end ( args );
210 return rc;
211}
int xfer_vopen(struct interface *intf, int type, va_list args)
Open location.
Definition open.c:171
#define va_end(ap)
Definition stdarg.h:10
#define va_start(ap, last)
Definition stdarg.h:8
__builtin_va_list va_list
Definition stdarg.h:7

References rc, type, va_end, va_start, and xfer_vopen().

Referenced by efi_download_start().

◆ xfer_vreopen()

int xfer_vreopen ( struct interface * intf,
int type,
va_list args )
extern

Reopen location.

Parameters
intfData transfer interface
typeLocation type
argsRemaining arguments depend upon location type
Return values
rcReturn 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 225 of file open.c.

225 {
226
227 /* Close existing connection */
228 intf_restart ( intf, 0 );
229
230 /* Open new location */
231 return xfer_vopen ( intf, type, args );
232}
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition interface.c:344

References intf_restart(), type, and xfer_vopen().

Referenced by downloader_vredirect(), iscsi_vredirect(), and xfer_vredirect().