iPXE
Data Structures | Macros | Functions | Variables
efi_local.c File Reference

EFI local file access. More...

#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <errno.h>
#include <assert.h>
#include <ipxe/refcnt.h>
#include <ipxe/malloc.h>
#include <ipxe/xfer.h>
#include <ipxe/open.h>
#include <ipxe/uri.h>
#include <ipxe/iobuf.h>
#include <ipxe/process.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_strings.h>
#include <ipxe/efi/efi_utils.h>
#include <ipxe/efi/Protocol/SimpleFileSystem.h>
#include <ipxe/efi/Guid/FileInfo.h>
#include <ipxe/efi/Guid/FileSystemInfo.h>

Go to the source code of this file.

Data Structures

struct  efi_local
 An EFI local file. More...
 

Macros

#define EFI_LOCAL_BLKSIZE   4096
 Download blocksize. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void efi_local_close (struct efi_local *local, int rc)
 Close local file. More...
 
static void efi_local_step (struct efi_local *local)
 Local file process. More...
 
static int efi_local_check_volume_name (struct efi_local *local, EFI_HANDLE device, EFI_FILE_PROTOCOL *root, const char *volume)
 Check for matching volume name. More...
 
static int efi_local_open_root (struct efi_local *local, EFI_HANDLE device, EFI_FILE_PROTOCOL **root)
 Open root filesystem. More...
 
static int efi_local_open_volume (struct efi_local *local, const char *volume)
 Open root filesystem of specified volume. More...
 
static int efi_local_open_resolved (struct efi_local *local, const char *resolved)
 Open fully-resolved path. More...
 
static int efi_local_open_path (struct efi_local *local, const char *path)
 Open specified path. More...
 
static int efi_local_len (struct efi_local *local)
 Get file length. More...
 
static int efi_local_open (struct interface *xfer, struct uri *uri)
 Open local file. More...
 

Variables

static struct interface_operation efi_local_operations []
 Data transfer interface operations. More...
 
static struct interface_descriptor efi_local_xfer_desc
 Data transfer interface descriptor. More...
 
static struct process_descriptor efi_local_process_desc
 Process descriptor. More...
 
struct uri_opener efi_local_uri_opener __uri_opener
 EFI local file URI opener. More...
 

Detailed Description

EFI local file access.

Definition in file efi_local.c.

Macro Definition Documentation

◆ EFI_LOCAL_BLKSIZE

#define EFI_LOCAL_BLKSIZE   4096

Download blocksize.

Definition at line 52 of file efi_local.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efi_local_close()

static void efi_local_close ( struct efi_local local,
int  rc 
)
static

Close local file.

Parameters
localLocal file
rcReason for close

Definition at line 77 of file efi_local.c.

77  {
78 
79  /* Stop process */
80  process_del ( &local->process );
81 
82  /* Shut down data transfer interface */
83  intf_shutdown ( &local->xfer, rc );
84 
85  /* Close EFI file */
86  if ( local->file ) {
87  local->file->Close ( local->file );
88  local->file = NULL;
89  }
90 
91  /* Close EFI root directory */
92  if ( local->root ) {
93  local->root->Close ( local->root );
94  local->root = NULL;
95  }
96 }
EFI_FILE_CLOSE Close
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition: interface.c:273
struct process process
Download process.
Definition: efi_local.c:61
void process_del(struct process *process)
Remove process from process list.
Definition: process.c:79
EFI_FILE_PROTOCOL * file
EFI file.
Definition: efi_local.c:66
EFI_FILE_PROTOCOL * root
EFI root directory.
Definition: efi_local.c:64
struct interface xfer
Data transfer interface.
Definition: efi_local.c:59
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References _EFI_FILE_PROTOCOL::Close, efi_local::file, intf_shutdown(), NULL, efi_local::process, process_del(), rc, efi_local::root, and efi_local::xfer.

Referenced by efi_local_open(), and efi_local_step().

◆ efi_local_step()

static void efi_local_step ( struct efi_local local)
static

Local file process.

Parameters
localLocal file

Definition at line 103 of file efi_local.c.

103  {
104  EFI_FILE_PROTOCOL *file = local->file;
105  struct io_buffer *iobuf = NULL;
106  size_t remaining;
107  size_t frag_len;
108  UINTN size;
109  EFI_STATUS efirc;
110  int rc;
111 
112  /* Wait until data transfer interface is ready */
113  if ( ! xfer_window ( &local->xfer ) )
114  return;
115 
116  /* Presize receive buffer */
117  remaining = local->len;
118  xfer_seek ( &local->xfer, remaining );
119  xfer_seek ( &local->xfer, 0 );
120 
121  /* Get file contents */
122  while ( remaining ) {
123 
124  /* Calculate length for this fragment */
125  frag_len = remaining;
126  if ( frag_len > EFI_LOCAL_BLKSIZE )
127  frag_len = EFI_LOCAL_BLKSIZE;
128 
129  /* Allocate I/O buffer */
130  iobuf = xfer_alloc_iob ( &local->xfer, frag_len );
131  if ( ! iobuf ) {
132  rc = -ENOMEM;
133  goto err;
134  }
135 
136  /* Read block */
137  size = frag_len;
138  if ( ( efirc = file->Read ( file, &size, iobuf->data ) ) != 0 ){
139  rc = -EEFI ( efirc );
140  DBGC ( local, "LOCAL %p could not read from file: %s\n",
141  local, strerror ( rc ) );
142  goto err;
143  }
144  assert ( size <= frag_len );
145  iob_put ( iobuf, size );
146 
147  /* Deliver data */
148  if ( ( rc = xfer_deliver_iob ( &local->xfer,
149  iob_disown ( iobuf ) ) ) != 0 ) {
150  DBGC ( local, "LOCAL %p could not deliver data: %s\n",
151  local, strerror ( rc ) );
152  goto err;
153  }
154 
155  /* Move to next block */
156  remaining -= frag_len;
157  }
158 
159  /* Close download */
160  efi_local_close ( local, 0 );
161 
162  return;
163 
164  err:
165  free_iob ( iobuf );
166  efi_local_close ( local, rc );
167 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:116
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
int xfer_deliver_iob(struct interface *intf, struct io_buffer *iobuf)
Deliver datagram as I/O buffer without metadata.
Definition: xfer.c:254
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
#define DBGC(...)
Definition: compiler.h:505
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:157
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition: xfer.c:115
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:208
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
EFI_FILE_PROTOCOL * file
EFI file.
Definition: efi_local.c:66
size_t len
Length of file.
Definition: efi_local.c:68
int xfer_seek(struct interface *intf, off_t offset)
Seek to position.
Definition: xfer.c:350
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
UINT64 UINTN
Unsigned value of native width.
Definition: ProcessorBind.h:71
static void efi_local_close(struct efi_local *local, int rc)
Close local file.
Definition: efi_local.c:77
void * data
Start of data.
Definition: iobuf.h:44
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:16
struct interface xfer
Data transfer interface.
Definition: efi_local.c:59
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#define EFI_LOCAL_BLKSIZE
Download blocksize.
Definition: efi_local.c:52
The EFI_FILE_PROTOCOL provides file IO access to supported file systems.
A persistent I/O buffer.
Definition: iobuf.h:32

References assert(), io_buffer::data, DBGC, EEFI, EFI_LOCAL_BLKSIZE, efi_local_close(), ENOMEM, efi_local::file, free_iob(), iob_disown, iob_put, efi_local::len, NULL, rc, _EFI_FILE_PROTOCOL::Read, size, strerror(), efi_local::xfer, xfer_alloc_iob(), xfer_deliver_iob(), xfer_seek(), and xfer_window().

◆ efi_local_check_volume_name()

static int efi_local_check_volume_name ( struct efi_local local,
EFI_HANDLE  device,
EFI_FILE_PROTOCOL root,
const char *  volume 
)
static

Check for matching volume name.

Parameters
localLocal file
deviceDevice handle
rootRoot filesystem handle
volumeVolume name
Return values
rcReturn status code

Definition at line 192 of file efi_local.c.

195  {
197  UINTN size;
198  char *label;
199  EFI_STATUS efirc;
200  int rc;
201 
202  /* Get length of file system information */
203  size = 0;
204  root->GetInfo ( root, &efi_file_system_info_id, &size, NULL );
205 
206  /* Allocate file system information */
207  info = malloc ( size );
208  if ( ! info ) {
209  rc = -ENOMEM;
210  goto err_alloc_info;
211  }
212 
213  /* Get file system information */
214  if ( ( efirc = root->GetInfo ( root, &efi_file_system_info_id, &size,
215  info ) ) != 0 ) {
216  rc = -EEFI ( efirc );
217  DBGC ( local, "LOCAL %p could not get file system info on %s: "
218  "%s\n", local, efi_handle_name ( device ),
219  strerror ( rc ) );
220  goto err_get_info;
221  }
222  DBGC2 ( local, "LOCAL %p found %s with label \"%ls\"\n",
223  local, efi_handle_name ( device ), info->VolumeLabel );
224 
225  /* Construct volume label for comparison */
226  if ( asprintf ( &label, "%ls", info->VolumeLabel ) < 0 ) {
227  rc = -ENOMEM;
228  goto err_alloc_label;
229  }
230 
231  /* Compare volume label */
232  if ( strcasecmp ( volume, label ) != 0 ) {
233  rc = -ENOENT;
234  goto err_compare;
235  }
236 
237  /* Success */
238  rc = 0;
239 
240  err_compare:
241  free ( label );
242  err_alloc_label:
243  err_get_info:
244  free ( info );
245  err_alloc_info:
246  return rc;
247 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
u32 info
Definition: ar9003_mac.h:67
struct stp_switch root
Root switch.
Definition: stp.h:26
EFI_GUID efi_file_system_info_id
File system information GUID.
Definition: efi_guid.c:306
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:192
#define ENOMEM
Not enough space.
Definition: errno.h:534
A hardware device.
Definition: device.h:73
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:713
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
int asprintf(char **strp, const char *fmt,...)
Write a formatted string to newly allocated memory.
Definition: asprintf.c:41
UINT64 UINTN
Unsigned value of native width.
Definition: ProcessorBind.h:71
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:583
#define DBGC2(...)
Definition: compiler.h:522
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References asprintf(), DBGC, DBGC2, EEFI, efi_file_system_info_id, efi_handle_name(), ENOENT, ENOMEM, free, info, malloc(), NULL, rc, root, size, strcasecmp(), and strerror().

Referenced by efi_local_open_volume().

◆ efi_local_open_root()

static int efi_local_open_root ( struct efi_local local,
EFI_HANDLE  device,
EFI_FILE_PROTOCOL **  root 
)
static

Open root filesystem.

Parameters
localLocal file
deviceDevice handle
rootRoot filesystem handle to fill in
Return values
rcReturn status code

Definition at line 257 of file efi_local.c.

258  {
260  union {
261  void *interface;
263  } u;
264  EFI_STATUS efirc;
265  int rc;
266 
267  /* Open file system protocol */
268  if ( ( efirc = bs->OpenProtocol ( device,
270  &u.interface, efi_image_handle,
271  device,
273  rc = -EEFI ( efirc );
274  DBGC ( local, "LOCAL %p could not open filesystem on %s: %s\n",
275  local, efi_handle_name ( device ), strerror ( rc ) );
276  goto err_filesystem;
277  }
278 
279  /* Open root directory */
280  if ( ( efirc = u.fs->OpenVolume ( u.fs, root ) ) != 0 ) {
281  rc = -EEFI ( efirc );
282  DBGC ( local, "LOCAL %p could not open volume on %s: %s\n",
283  local, efi_handle_name ( device ), strerror ( rc ) );
284  goto err_volume;
285  }
286 
287  /* Success */
288  rc = 0;
289 
290  err_volume:
293  err_filesystem:
294  return rc;
295 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
struct stp_switch root
Root switch.
Definition: stp.h:26
#define DBGC(...)
Definition: compiler.h:505
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1906
A hardware device.
Definition: device.h:73
An object interface.
Definition: interface.h:109
EFI_GUID efi_simple_file_system_protocol_guid
Simple file system protocol GUID.
Definition: efi_guid.c:232
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL
Definition: UefiSpec.h:1271
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:713
uint32_t fs
Definition: librm.h:252
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1836
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:30
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
EFI_SYSTEM_TABLE * efi_systab
EFI_OPEN_PROTOCOL OpenProtocol
Definition: UefiSpec.h:1905
union @16 u

References EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseProtocol, DBGC, EEFI, efi_handle_name(), efi_image_handle, EFI_OPEN_PROTOCOL_GET_PROTOCOL, efi_simple_file_system_protocol_guid, efi_systab, fs, EFI_BOOT_SERVICES::OpenProtocol, rc, root, strerror(), and u.

Referenced by efi_local_open_volume().

◆ efi_local_open_volume()

static int efi_local_open_volume ( struct efi_local local,
const char *  volume 
)
static

Open root filesystem of specified volume.

Parameters
localLocal file
volumeVolume name, or NULL to use loaded image's device
Return values
rcReturn status code

Definition at line 304 of file efi_local.c.

305  {
308  int ( * check ) ( struct efi_local *local, EFI_HANDLE device,
309  EFI_FILE_PROTOCOL *root, const char *volume );
311  EFI_HANDLE *handles;
313  UINTN num_handles;
314  UINTN i;
315  EFI_STATUS efirc;
316  int rc;
317 
318  /* Identify candidate handles */
319  if ( volume ) {
320  /* Locate all filesystem handles */
321  if ( ( efirc = bs->LocateHandleBuffer ( ByProtocol, protocol,
322  NULL, &num_handles,
323  &handles ) ) != 0 ) {
324  rc = -EEFI ( efirc );
325  DBGC ( local, "LOCAL %p could not enumerate handles: "
326  "%s\n", local, strerror ( rc ) );
327  return rc;
328  }
330  } else {
331  /* Use our loaded image's device handle */
332  handles = &efi_loaded_image->DeviceHandle;
333  num_handles = 1;
334  check = NULL;
335  }
336 
337  /* Find matching handle */
338  for ( i = 0 ; i < num_handles ; i++ ) {
339 
340  /* Get this device handle */
341  device = handles[i];
342 
343  /* Open root directory */
344  if ( ( rc = efi_local_open_root ( local, device, &root ) ) != 0)
345  continue;
346 
347  /* Check volume name, if applicable */
348  if ( ( check == NULL ) ||
349  ( ( rc = check ( local, device, root, volume ) ) == 0 ) ) {
350  DBGC ( local, "LOCAL %p using %s",
351  local, efi_handle_name ( device ) );
352  if ( volume )
353  DBGC ( local, " with label \"%s\"", volume );
354  DBGC ( local, "\n" );
355  local->root = root;
356  break;
357  }
358 
359  /* Close root directory */
360  root->Close ( root );
361  }
362 
363  /* Free handles, if applicable */
364  if ( volume )
365  bs->FreePool ( handles );
366 
367  /* Fail if we found no matching handle */
368  if ( ! local->root ) {
369  DBGC ( local, "LOCAL %p found no matching handle\n", local );
370  return -ENOENT;
371  }
372 
373  return 0;
374 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:33
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
struct stp_switch root
Root switch.
Definition: stp.h:26
128 bit buffer containing a unique identifier value.
Definition: Base.h:263
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
uint16_t device
Device ID.
Definition: ena.h:24
A hardware device.
Definition: device.h:73
EFI_GUID efi_simple_file_system_protocol_guid
Simple file system protocol GUID.
Definition: efi_guid.c:232
static int efi_local_check_volume_name(struct efi_local *local, EFI_HANDLE device, EFI_FILE_PROTOCOL *root, const char *volume)
Check for matching volume name.
Definition: efi_local.c:192
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:713
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1836
static int efi_local_open_root(struct efi_local *local, EFI_HANDLE device, EFI_FILE_PROTOCOL **root)
Open root filesystem.
Definition: efi_local.c:257
UINT64 UINTN
Unsigned value of native width.
Definition: ProcessorBind.h:71
EFI_FREE_POOL FreePool
Definition: UefiSpec.h:1855
EFI_FILE_PROTOCOL * root
EFI root directory.
Definition: efi_local.c:64
An EFI local file.
Definition: efi_local.c:55
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
Retrieve the set of handles from the handle database that support a specified protocol.
Definition: UefiSpec.h:1448
EFI_SYSTEM_TABLE * efi_systab
uint16_t protocol
Protocol ID.
Definition: stp.h:18
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
The EFI_FILE_PROTOCOL provides file IO access to supported file systems.
Definition: efi.h:55
EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer
Definition: UefiSpec.h:1913
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:61

References EFI_SYSTEM_TABLE::BootServices, ByProtocol, DBGC, device, EFI_LOADED_IMAGE_PROTOCOL::DeviceHandle, EEFI, efi_handle_name(), efi_loaded_image, efi_local_check_volume_name(), efi_local_open_root(), efi_simple_file_system_protocol_guid, efi_systab, ENOENT, EFI_BOOT_SERVICES::FreePool, EFI_BOOT_SERVICES::LocateHandleBuffer, NULL, protocol, rc, root, efi_local::root, and strerror().

Referenced by efi_local_open().

◆ efi_local_open_resolved()

static int efi_local_open_resolved ( struct efi_local local,
const char *  resolved 
)
static

Open fully-resolved path.

Parameters
localLocal file
resolvedResolved path
Return values
rcReturn status code

Definition at line 383 of file efi_local.c.

384  {
385  size_t name_len = strlen ( resolved );
386  CHAR16 name[ name_len + 1 /* wNUL */ ];
388  EFI_STATUS efirc;
389  int rc;
390 
391  /* Construct filename */
392  efi_snprintf ( name, ( name_len + 1 /* wNUL */ ), "%s", resolved );
393 
394  /* Open file */
395  if ( ( efirc = local->root->Open ( local->root, &file, name,
396  EFI_FILE_MODE_READ, 0 ) ) != 0 ) {
397  rc = -EEFI ( efirc );
398  DBGC ( local, "LOCAL %p could not open \"%s\": %s\n",
399  local, resolved, strerror ( rc ) );
400  return rc;
401  }
402  local->file = file;
403 
404  return 0;
405 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
#define DBGC(...)
Definition: compiler.h:505
unsigned short CHAR16
Definition: ProcessorBind.h:59
int efi_snprintf(wchar_t *wbuf, size_t wsize, const char *fmt,...)
Write a formatted string to a buffer.
Definition: efi_strings.c:104
EFI_FILE_PROTOCOL * file
EFI file.
Definition: efi_local.c:66
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
size_t strlen(const char *src)
Get length of string.
Definition: string.c:213
EFI_FILE_PROTOCOL * root
EFI root directory.
Definition: efi_local.c:64
#define EFI_FILE_MODE_READ
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
The EFI_FILE_PROTOCOL provides file IO access to supported file systems.

References DBGC, EEFI, EFI_FILE_MODE_READ, efi_snprintf(), efi_local::file, name, _EFI_FILE_PROTOCOL::Open, rc, efi_local::root, strerror(), and strlen().

Referenced by efi_local_open_path().

◆ efi_local_open_path()

static int efi_local_open_path ( struct efi_local local,
const char *  path 
)
static

Open specified path.

Parameters
localLocal file
pathPath to file
Return values
rcReturn status code

Definition at line 414 of file efi_local.c.

414  {
417  size_t fp_len = ( fp ? efi_devpath_len ( &fp->Header ) : 0 );
418  char base[ fp_len / 2 /* Cannot exceed this length */ ];
419  size_t remaining = sizeof ( base );
420  size_t len;
421  char *resolved;
422  char *tmp;
423  int rc;
424 
425  /* Construct base path to our own image, if possible */
426  memset ( base, 0, sizeof ( base ) );
427  tmp = base;
428  while ( fp && ( fp->Header.Type != END_DEVICE_PATH_TYPE ) ) {
429  len = snprintf ( tmp, remaining, "%ls", fp->PathName );
430  assert ( len < remaining );
431  tmp += len;
432  remaining -= len;
433  fp = ( ( ( void * ) fp ) + ( ( fp->Header.Length[1] << 8 ) |
434  fp->Header.Length[0] ) );
435  }
436  DBGC2 ( local, "LOCAL %p base path \"%s\"\n",
437  local, base );
438 
439  /* Convert to sane path separators */
440  for ( tmp = base ; *tmp ; tmp++ ) {
441  if ( *tmp == '\\' )
442  *tmp = '/';
443  }
444 
445  /* Resolve path */
446  resolved = resolve_path ( base, path );
447  if ( ! resolved ) {
448  rc = -ENOMEM;
449  goto err_resolve;
450  }
451 
452  /* Convert to insane path separators */
453  for ( tmp = resolved ; *tmp ; tmp++ ) {
454  if ( *tmp == '/' )
455  *tmp = '\\';
456  }
457  DBGC ( local, "LOCAL %p using \"%s\"\n",
458  local, resolved );
459 
460  /* Open resolved path */
461  if ( ( rc = efi_local_open_resolved ( local, resolved ) ) != 0 )
462  goto err_open;
463 
464  err_open:
465  free ( resolved );
466  err_resolve:
467  return rc;
468 }
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:33
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define END_DEVICE_PATH_TYPE
Definition: DevicePath.h:1327
#define DBGC(...)
Definition: compiler.h:505
EFI_DEVICE_PATH_PROTOCOL * FilePath
A pointer to the file path portion specific to DeviceHandle that the EFI Image was loaded from.
Definition: LoadedImage.h:62
size_t efi_devpath_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_utils.c:59
CHAR16 PathName[1]
A NULL-terminated Path string including directory and file names.
Definition: DevicePath.h:1041
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:1037
#define ENOMEM
Not enough space.
Definition: errno.h:534
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
char * resolve_path(const char *base_path, const char *relative_path)
Resolve base+relative path.
Definition: uri.c:614
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
uint8_t * tmp
Definition: entropy.h:156
uint16_t base
Base address.
Definition: edd.h:14
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:64
uint32_t len
Length.
Definition: ena.h:14
#define DBGC2(...)
Definition: compiler.h:522
static int efi_local_open_resolved(struct efi_local *local, const char *resolved)
Open fully-resolved path.
Definition: efi_local.c:383
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:52
void * memset(void *dest, int character, size_t len) __nonnull
PACKED union @459::@473 Header
Definition: Acpi10.h:160

References assert(), base, container_of, DBGC, DBGC2, efi_devpath_len(), efi_loaded_image, efi_local_open_resolved(), END_DEVICE_PATH_TYPE, ENOMEM, EFI_LOADED_IMAGE_PROTOCOL::FilePath, free, Header, FILEPATH_DEVICE_PATH::Header, len, EFI_DEVICE_PATH_PROTOCOL::Length, memset(), FILEPATH_DEVICE_PATH::PathName, rc, resolve_path(), snprintf(), tmp, and EFI_DEVICE_PATH_PROTOCOL::Type.

Referenced by efi_local_open().

◆ efi_local_len()

static int efi_local_len ( struct efi_local local)
static

Get file length.

Parameters
localLocal file
Return values
rcReturn status code

Definition at line 476 of file efi_local.c.

476  {
477  EFI_FILE_PROTOCOL *file = local->file;
479  EFI_STATUS efirc;
480  UINTN size;
481  int rc;
482 
483  /* Get size of file information */
484  size = 0;
486 
487  /* Allocate file information */
488  info = malloc ( size );
489  if ( ! info ) {
490  rc = -ENOMEM;
491  goto err_alloc;
492  }
493 
494  /* Get file information */
495  if ( ( efirc = file->GetInfo ( file, &efi_file_info_id, &size,
496  info ) ) != 0 ) {
497  rc = -EEFI ( efirc );
498  DBGC ( local, "LOCAL %p could not get file info: %s\n",
499  local, strerror ( rc ) );
500  goto err_info;
501  }
502 
503  /* Record file length */
504  local->len = info->FileSize;
505 
506  /* Success */
507  rc = 0;
508 
509  err_info:
510  free ( info );
511  err_alloc:
512  return rc;
513 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
u32 info
Definition: ar9003_mac.h:67
#define DBGC(...)
Definition: compiler.h:505
EFI_FILE_GET_INFO GetInfo
#define ENOMEM
Not enough space.
Definition: errno.h:534
EFI_FILE_PROTOCOL * file
EFI file.
Definition: efi_local.c:66
size_t len
Length of file.
Definition: efi_local.c:68
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
UINT64 UINTN
Unsigned value of native width.
Definition: ProcessorBind.h:71
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:583
EFI_GUID efi_file_info_id
File information GUID.
Definition: efi_guid.c:303
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
The EFI_FILE_PROTOCOL provides file IO access to supported file systems.

References DBGC, EEFI, efi_file_info_id, ENOMEM, efi_local::file, free, _EFI_FILE_PROTOCOL::GetInfo, info, efi_local::len, malloc(), NULL, rc, size, and strerror().

Referenced by efi_local_open().

◆ efi_local_open()

static int efi_local_open ( struct interface xfer,
struct uri uri 
)
static

Open local file.

Parameters
xferData transfer interface
uriRequest URI
Return values
rcReturn status code

Definition at line 522 of file efi_local.c.

522  {
523  struct efi_local *local;
524  const char *volume;
525  const char *path;
526  int rc;
527 
528  /* Parse URI */
529  volume = ( ( uri->host && uri->host[0] ) ? uri->host : NULL );
530  path = ( uri->opaque ? uri->opaque : uri->path );
531 
532  /* Allocate and initialise structure */
533  local = zalloc ( sizeof ( *local ) );
534  if ( ! local ) {
535  rc = -ENOMEM;
536  goto err_alloc;
537  }
538  ref_init ( &local->refcnt, NULL );
539  intf_init ( &local->xfer, &efi_local_xfer_desc, &local->refcnt );
541  &local->refcnt );
542 
543  /* Open specified volume */
544  if ( ( rc = efi_local_open_volume ( local, volume ) ) != 0 )
545  goto err_open_root;
546 
547  /* Open specified path */
548  if ( ( rc = efi_local_open_path ( local, path ) ) != 0 )
549  goto err_open_file;
550 
551  /* Get length of file */
552  if ( ( rc = efi_local_len ( local ) ) != 0 )
553  goto err_len;
554 
555  /* Attach to parent interface, mortalise self, and return */
556  intf_plug_plug ( &local->xfer, xfer );
557  ref_put ( &local->refcnt );
558  return 0;
559 
560  err_len:
561  err_open_file:
562  err_open_root:
563  efi_local_close ( local, 0 );
564  ref_put ( &local->refcnt );
565  err_alloc:
566  return rc;
567 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct process process
Download process.
Definition: efi_local.c:61
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
static int efi_local_open_path(struct efi_local *local, const char *path)
Open specified path.
Definition: efi_local.c:414
static void process_init(struct process *process, struct process_descriptor *desc, struct refcnt *refcnt)
Initialise process and add to process list.
Definition: process.h:161
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition: interface.c:102
struct refcnt refcnt
Reference count.
Definition: efi_local.c:57
#define ENOMEM
Not enough space.
Definition: errno.h:534
const char * path
Path.
Definition: uri.h:66
static int efi_local_len(struct efi_local *local)
Get file length.
Definition: efi_local.c:476
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
static int efi_local_open_volume(struct efi_local *local, const char *volume)
Open root filesystem of specified volume.
Definition: efi_local.c:304
static struct interface_descriptor efi_local_xfer_desc
Data transfer interface descriptor.
Definition: efi_local.c:176
static struct process_descriptor efi_local_process_desc
Process descriptor.
Definition: efi_local.c:180
const char * host
Host name.
Definition: uri.h:62
static void efi_local_close(struct efi_local *local, int rc)
Close local file.
Definition: efi_local.c:77
const char * opaque
Opaque part.
Definition: uri.h:56
An EFI local file.
Definition: efi_local.c:55
A Uniform Resource Identifier.
Definition: uri.h:50
struct interface xfer
Data transfer interface.
Definition: efi_local.c:59
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:173
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106

References efi_local_close(), efi_local_len(), efi_local_open_path(), efi_local_open_volume(), efi_local_process_desc, efi_local_xfer_desc, ENOMEM, uri::host, intf_init(), intf_plug_plug(), NULL, uri::opaque, uri::path, efi_local::process, process_init(), rc, ref_init, ref_put, efi_local::refcnt, efi_local::xfer, and zalloc().

Variable Documentation

◆ efi_local_operations

struct interface_operation efi_local_operations[]
static
Initial value:
= {
}
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:145
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:244
static void efi_local_step(struct efi_local *local)
Local file process.
Definition: efi_local.c:103
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
static void efi_local_close(struct efi_local *local, int rc)
Close local file.
Definition: efi_local.c:77
An EFI local file.
Definition: efi_local.c:55

Data transfer interface operations.

Definition at line 170 of file efi_local.c.

◆ efi_local_xfer_desc

struct interface_descriptor efi_local_xfer_desc
static
Initial value:
=
static struct interface_operation efi_local_operations[]
Data transfer interface operations.
Definition: efi_local.c:170
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition: interface.h:65
An EFI local file.
Definition: efi_local.c:55
struct interface xfer
Data transfer interface.
Definition: efi_local.c:59

Data transfer interface descriptor.

Definition at line 176 of file efi_local.c.

Referenced by efi_local_open().

◆ efi_local_process_desc

struct process_descriptor efi_local_process_desc
static
Initial value:
=
A process.
Definition: process.h:17
#define PROC_DESC_ONCE(object_type, process, _step)
Define a process descriptor for a process that runs only once.
Definition: process.h:97
static void efi_local_step(struct efi_local *local)
Local file process.
Definition: efi_local.c:103
An EFI local file.
Definition: efi_local.c:55

Process descriptor.

Definition at line 180 of file efi_local.c.

Referenced by efi_local_open().

◆ __uri_opener

struct uri_opener efi_local_uri_opener __uri_opener
Initial value:
= {
.scheme = "file",
.open = efi_local_open,
}
static int efi_local_open(struct interface *xfer, struct uri *uri)
Open local file.
Definition: efi_local.c:522

EFI local file URI opener.

Definition at line 570 of file efi_local.c.