11.1Snonaka/*	$NetBSD: efidev.c,v 1.1 2018/03/08 10:34:33 nonaka Exp $	*/
21.1Snonaka/*	$OpenBSD: efiboot.c,v 1.28 2017/11/25 19:02:07 patrick Exp $	*/
31.1Snonaka
41.1Snonaka/*
51.1Snonaka * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
61.1Snonaka *
71.1Snonaka * Permission to use, copy, modify, and distribute this software for any
81.1Snonaka * purpose with or without fee is hereby granted, provided that the above
91.1Snonaka * copyright notice and this permission notice appear in all copies.
101.1Snonaka *
111.1Snonaka * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
121.1Snonaka * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
131.1Snonaka * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
141.1Snonaka * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
151.1Snonaka * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
161.1Snonaka * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
171.1Snonaka * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
181.1Snonaka */
191.1Snonaka
201.1Snonaka#include "efiboot.h"
211.1Snonaka
221.1Snonaka/*
231.1Snonaka * Determine the number of nodes up to, but not including, the first
241.1Snonaka * node of the specified type.
251.1Snonaka */
261.1Snonakaint
271.1Snonakaefi_device_path_depth(EFI_DEVICE_PATH *dp, int dptype)
281.1Snonaka{
291.1Snonaka	int	i;
301.1Snonaka
311.1Snonaka	for (i = 0; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp), i++) {
321.1Snonaka		if (DevicePathType(dp) == dptype)
331.1Snonaka			return (i);
341.1Snonaka	}
351.1Snonaka
361.1Snonaka	return (-1);
371.1Snonaka}
381.1Snonaka
391.1Snonakaint
401.1Snonakaefi_device_path_ncmp(EFI_DEVICE_PATH *dpa, EFI_DEVICE_PATH *dpb, int deptn)
411.1Snonaka{
421.1Snonaka	int	 i, cmp;
431.1Snonaka
441.1Snonaka	for (i = 0; i < deptn; i++) {
451.1Snonaka		if (IsDevicePathEnd(dpa) || IsDevicePathEnd(dpb))
461.1Snonaka			return ((IsDevicePathEnd(dpa) && IsDevicePathEnd(dpb))
471.1Snonaka			    ? 0 : (IsDevicePathEnd(dpa))? -1 : 1);
481.1Snonaka		cmp = DevicePathNodeLength(dpa) - DevicePathNodeLength(dpb);
491.1Snonaka		if (cmp)
501.1Snonaka			return (cmp);
511.1Snonaka		cmp = memcmp(dpa, dpb, DevicePathNodeLength(dpa));
521.1Snonaka		if (cmp)
531.1Snonaka			return (cmp);
541.1Snonaka		dpa = NextDevicePathNode(dpa);
551.1Snonaka		dpb = NextDevicePathNode(dpb);
561.1Snonaka	}
571.1Snonaka
581.1Snonaka	return (0);
591.1Snonaka}
60