Add efi_devpath_is_prefix

efi_devpath_is_prefix determines if a path matches a passed-in prefix.

Differential Revision: https://reviews.freebsd.org/D12564
Submitted by: Eric McCorkle
This commit is contained in:
imp 2017-10-06 12:20:24 +00:00
parent 9da676183c
commit 679de09379
2 changed files with 30 additions and 0 deletions

View File

@ -82,6 +82,7 @@ EFI_HANDLE efi_devpath_handle(EFI_DEVICE_PATH *);
EFI_DEVICE_PATH *efi_devpath_last_node(EFI_DEVICE_PATH *);
EFI_DEVICE_PATH *efi_devpath_trim(EFI_DEVICE_PATH *);
bool efi_devpath_match(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
int efi_devpath_is_prefix(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
CHAR16 *efi_devpath_name(EFI_DEVICE_PATH *);
void efi_free_devpath_name(CHAR16 *);

View File

@ -166,3 +166,32 @@ efi_devpath_match(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2)
}
return (true);
}
int
efi_devpath_is_prefix(EFI_DEVICE_PATH *prefix, EFI_DEVICE_PATH *path)
{
int len;
if (prefix == NULL || path == NULL)
return (0);
while (1) {
if (IsDevicePathEnd(prefix))
break;
if (DevicePathType(prefix) != DevicePathType(path) ||
DevicePathSubType(prefix) != DevicePathSubType(path))
return (0);
len = DevicePathNodeLength(prefix);
if (len != DevicePathNodeLength(path))
return (0);
if (memcmp(prefix, path, (size_t)len) != 0)
return (0);
prefix = NextDevicePathNode(prefix);
path = NextDevicePathNode(path);
}
return (1);
}