mirror of https://github.com/ipxe/ipxe.git
[efi] Add efi_path_uri() to parse a URI from an EFI device path
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1130/merge
parent
88c2a01e1a
commit
1a84facf12
|
@ -45,6 +45,7 @@ efi_path_end ( EFI_DEVICE_PATH_PROTOCOL *path );
|
||||||
extern size_t efi_path_len ( 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 unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path );
|
||||||
extern int efi_path_guid ( EFI_DEVICE_PATH_PROTOCOL *path, union uuid *uuid );
|
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_paths ( EFI_DEVICE_PATH_PROTOCOL *first,
|
||||||
... );
|
... );
|
||||||
extern EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path ( struct net_device *netdev );
|
extern EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path ( struct net_device *netdev );
|
||||||
|
|
|
@ -175,6 +175,46 @@ int efi_path_guid ( EFI_DEVICE_PATH_PROTOCOL *path, union uuid *guid ) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
* Concatenate EFI device paths
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue