summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2024-03-19 16:01:25 +0100
committerMichael Brown2024-03-19 16:01:25 +0100
commit1a84facf12b07a5e5375822015b56cf320821055 (patch)
tree572ac66f92d4ed66f22dabb3a564560f4f24d922
parent[settings] Expose current working URI and directory URI via settings (diff)
downloadipxe-1a84facf12b07a5e5375822015b56cf320821055.tar.gz
ipxe-1a84facf12b07a5e5375822015b56cf320821055.tar.xz
ipxe-1a84facf12b07a5e5375822015b56cf320821055.zip
[efi] Add efi_path_uri() to parse a URI from an EFI device path
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/include/ipxe/efi/efi_path.h1
-rw-r--r--src/interface/efi/efi_path.c40
2 files changed, 41 insertions, 0 deletions
diff --git a/src/include/ipxe/efi/efi_path.h b/src/include/ipxe/efi/efi_path.h
index 20ff43f6..503bd434 100644
--- a/src/include/ipxe/efi/efi_path.h
+++ b/src/include/ipxe/efi/efi_path.h
@@ -45,6 +45,7 @@ efi_path_end ( EFI_DEVICE_PATH_PROTOCOL *path );
extern size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path );
extern unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path );
extern int efi_path_guid ( EFI_DEVICE_PATH_PROTOCOL *path, union uuid *uuid );
+extern struct uri * efi_path_uri ( EFI_DEVICE_PATH_PROTOCOL *path );
extern EFI_DEVICE_PATH_PROTOCOL * efi_paths ( EFI_DEVICE_PATH_PROTOCOL *first,
... );
extern EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path ( struct net_device *netdev );
diff --git a/src/interface/efi/efi_path.c b/src/interface/efi/efi_path.c
index d1e22eea..4e37d248 100644
--- a/src/interface/efi/efi_path.c
+++ b/src/interface/efi/efi_path.c
@@ -176,6 +176,46 @@ int efi_path_guid ( EFI_DEVICE_PATH_PROTOCOL *path, union uuid *guid ) {
}
/**
+ * Parse URI from device path
+ *
+ * @v path Device path
+ * @ret uri URI, or NULL if not a URI
+ */
+struct uri * efi_path_uri ( EFI_DEVICE_PATH_PROTOCOL *path ) {
+ EFI_DEVICE_PATH_PROTOCOL *next;
+ URI_DEVICE_PATH *uripath;
+ char *uristring;
+ struct uri *uri;
+ size_t len;
+
+ /* Search for URI device path */
+ for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
+ if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
+ ( path->SubType == MSG_URI_DP ) ) {
+
+ /* Calculate path length */
+ uripath = container_of ( path, URI_DEVICE_PATH,
+ Header );
+ len = ( ( ( path->Length[1] << 8 ) | path->Length[0] )
+ - offsetof ( typeof ( *uripath ), Uri ) );
+
+ /* Parse URI */
+ uristring = zalloc ( len + 1 /* NUL */ );
+ if ( ! uristring )
+ return NULL;
+ memcpy ( uristring, uripath->Uri, len );
+ uri = parse_uri ( uristring );
+ free ( uristring );
+
+ return uri;
+ }
+ }
+
+ /* No URI path found */
+ return NULL;
+}
+
+/**
* Concatenate EFI device paths
*
* @v ... List of device paths (NULL terminated)