Author: imp
Date: Fri Oct  6 12:20:24 2017
New Revision: 324359
URL: https://svnweb.freebsd.org/changeset/base/324359

Log:
  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

Modified:
  head/sys/boot/efi/include/efilib.h
  head/sys/boot/efi/libefi/devpath.c

Modified: head/sys/boot/efi/include/efilib.h
==============================================================================
--- head/sys/boot/efi/include/efilib.h  Fri Oct  6 11:48:09 2017        
(r324358)
+++ head/sys/boot/efi/include/efilib.h  Fri Oct  6 12:20:24 2017        
(r324359)
@@ -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 *);
 

Modified: head/sys/boot/efi/libefi/devpath.c
==============================================================================
--- head/sys/boot/efi/libefi/devpath.c  Fri Oct  6 11:48:09 2017        
(r324358)
+++ head/sys/boot/efi/libefi/devpath.c  Fri Oct  6 12:20:24 2017        
(r324359)
@@ -166,3 +166,32 @@ efi_devpath_match(EFI_DEVICE_PATH *devpath1, EFI_DEVIC
        }
        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);
+}
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to