iPXE
Functions
open.c File Reference

Data transfer interface opening. More...

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

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
struct uri_openerxfer_uri_opener (const char *scheme)
 Find opener for URI scheme. More...
 
int xfer_open_uri (struct interface *intf, struct uri *uri)
 Open URI. More...
 
int xfer_open_uri_string (struct interface *intf, const char *uri_string)
 Open URI string. More...
 
int xfer_open_socket (struct interface *intf, int semantics, struct sockaddr *peer, struct sockaddr *local)
 Open socket. More...
 
int xfer_vopen (struct interface *intf, int type, va_list args)
 Open location. More...
 
int xfer_open (struct interface *intf, int type,...)
 Open location. More...
 
int xfer_vreopen (struct interface *intf, int type, va_list args)
 Reopen location. More...
 

Detailed Description

Data transfer interface opening.

Definition in file open.c.

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)

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 
51  for_each_table_entry ( opener, URI_OPENERS ) {
52  if ( strcasecmp ( scheme, opener->scheme ) == 0 )
53  return opener;
54  }
55  return NULL;
56 }
#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
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
A URI opener.
Definition: open.h:48
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

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 
)

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:14
#define INTF_DBG(intf)
printf() arguments for representing an object interface
Definition: interface.h:293
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:206
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
#define ENOTSUP
Operation not supported.
Definition: errno.h:590
#define ENOMEM
Not enough space.
Definition: errno.h:535
const char * scheme
Scheme.
Definition: uri.h:69
int(* open)(struct interface *intf, struct uri *uri)
Open URI.
Definition: open.h:61
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
A Uniform Resource Identifier.
Definition: uri.h:65
struct uri_opener * xfer_uri_opener(const char *scheme)
Find opener for URI scheme.
Definition: open.c:48
struct uri * resolve_uri(const struct uri *base_uri, struct uri *relative_uri)
Resolve base+relative URI.
Definition: uri.c:695
struct uri * cwuri
Current working URI.
Definition: cwuri.c:39
A URI opener.
Definition: open.h:48
#define INTF_FMT
printf() format string for INTF_DBG()
Definition: interface.h:285

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 
)

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 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define INTF_DBG(intf)
printf() arguments for representing an object interface
Definition: interface.h:293
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:206
int xfer_open_uri(struct interface *intf, struct uri *uri)
Open URI.
Definition: open.c:68
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
#define ENOMEM
Not enough space.
Definition: errno.h:535
A Uniform Resource Identifier.
Definition: uri.h:65
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition: uri.c:297
#define INTF_FMT
printf() format string for INTF_DBG()
Definition: interface.h:285

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_socket()

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

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 }
static const char * socket_semantics_name(int semantics)
Name communication semantics.
Definition: socket.h:46
#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 DBGC(...)
Definition: compiler.h:505
int semantics
Communication semantics (e.g.
Definition: open.h:73
#define ENOTSUP
Operation not supported.
Definition: errno.h:590
#define SOCKET_OPENERS
Socket opener table.
Definition: open.h:86
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:386
static const char * socket_family_name(int family)
Name address family.
Definition: socket.h:76
int(* open)(struct interface *intf, struct sockaddr *peer, struct sockaddr *local)
Open socket.
Definition: open.h:81
struct mschapv2_challenge peer
Peer challenge.
Definition: mschapv2.h:12
#define INTF_FMT
printf() format string for INTF_DBG()
Definition: interface.h:285
A socket opener.
Definition: open.h:71

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 
)

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 }
#define INTF_DBG(intf)
printf() arguments for representing an object interface
Definition: interface.h:293
int xfer_open_socket(struct interface *intf, int semantics, struct sockaddr *peer, struct sockaddr *local)
Open socket.
Definition: open.c:143
uint32_t type
Operating system type.
Definition: ena.h:12
int xfer_open_uri(struct interface *intf, struct uri *uri)
Open URI.
Definition: open.c:68
#define INTF_COL(intf)
Find debugging colourisation for an object interface.
Definition: interface.h:282
#define DBGC(...)
Definition: compiler.h:505
#define ENOTSUP
Operation not supported.
Definition: errno.h:590
Location is a socket.
Definition: open.h:44
#define va_arg(ap, type)
Definition: stdarg.h:9
Location is a URI string.
Definition: open.h:35
Location is a URI.
Definition: open.h:28
Generalized socket address structure.
Definition: socket.h:97
A Uniform Resource Identifier.
Definition: uri.h:65
struct mschapv2_challenge peer
Peer challenge.
Definition: mschapv2.h:12
int xfer_open_uri_string(struct interface *intf, const char *uri_string)
Open URI string.
Definition: open.c:116
#define INTF_FMT
printf() format string for INTF_DBG()
Definition: interface.h:285

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,
  ... 
)

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 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define va_end(ap)
Definition: stdarg.h:10
uint32_t type
Operating system type.
Definition: ena.h:12
__builtin_va_list va_list
Definition: stdarg.h:7
int xfer_vopen(struct interface *intf, int type, va_list args)
Open location.
Definition: open.c:171
#define va_start(ap, last)
Definition: stdarg.h:8

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 
)

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
uint32_t type
Operating system type.
Definition: ena.h:12
int xfer_vopen(struct interface *intf, int type, va_list args)
Open location.
Definition: open.c:171

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

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