/* Find the parent device. */ static struct grub_efidisk_data * find_parent_device (struct grub_efidisk_data *devices, struct grub_efidisk_data *d) { grub_efi_device_path_t *dp, *ldp; struct grub_efidisk_data *parent; dp = duplicate_device_path (d->device_path); if (! dp) return 0; ldp = find_last_device_path (dp); ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->length[0] = sizeof (*ldp); ldp->length[1] = 0; for (parent = devices; parent; parent = parent->next) { /* Ignore itself. */ if (parent == d) continue; if (grub_efi_compare_device_paths (parent->device_path, dp) == 0) break; } grub_free (dp); return parent; }
static int iterate_child_devices (struct grub_efidisk_data *devices, struct grub_efidisk_data *d, int (*hook) (struct grub_efidisk_data *child)) { struct grub_efidisk_data *p; for (p = devices; p; p = p->next) { grub_efi_device_path_t *dp, *ldp; dp = duplicate_device_path (p->device_path); if (! dp) return 0; ldp = find_last_device_path (dp); ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->length[0] = sizeof (*ldp); ldp->length[1] = 0; if (compare_device_paths (dp, d->device_path) == 0) if (hook (p)) { grub_free (dp); return 1; } grub_free (dp); } return 0; }
static int is_child (struct grub_efidisk_data *child, struct grub_efidisk_data *parent) { grub_efi_device_path_t *dp, *ldp; int ret; dp = duplicate_device_path (child->device_path); if (! dp) return 0; ldp = find_last_device_path (dp); ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->length[0] = sizeof (*ldp); ldp->length[1] = 0; ret = (grub_efi_compare_device_paths (dp, parent->device_path) == 0); grub_free (dp); return ret; }