static int unparse_hardware_path(char *buffer, EFI_DEVICE_PATH *path) { PCI_DEVICE_PATH *pci = (PCI_DEVICE_PATH *)path; PCCARD_DEVICE_PATH *pccard = (PCCARD_DEVICE_PATH *)path; MEMORY_MAPPED_DEVICE_PATH *mm = (MEMORY_MAPPED_DEVICE_PATH *)path; CONTROLLER_DEVICE_PATH *ctlr = (CONTROLLER_DEVICE_PATH *)path; char a[16], b[16], c[16]; switch (path->subtype) { case 1: return sprintf(buffer, "PCI(%x,%x)", get(a, pci->device), get(b, pci->function)); break; case 2: return sprintf(buffer, "PCCARD(%x)", get(a, pccard->socket)); break; case 3: return sprintf(buffer, "MM(%x,%" PRIx64 ",%" PRIx64 ")", get(a, mm->memory_type), get(b, mm->start), get(c, mm->end)); break; case 4: return unparse_vendor_path(buffer, (VENDOR_DEVICE_PATH *)path); break; case 5: return sprintf(buffer, "Controller(%x)", get(a, ctlr->controller)); break; default: return unparse_raw(buffer, (uint8_t *)path, path->length); } return 0; }
static ssize_t unparse_media_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) { CDROM_DEVICE_PATH *cdrom = (CDROM_DEVICE_PATH *)path; MEDIA_PROTOCOL_DEVICE_PATH *media = (MEDIA_PROTOCOL_DEVICE_PATH *)path; FILE_PATH_DEVICE_PATH *file = (FILE_PATH_DEVICE_PATH *)path; char *text_guid; char file_name[80]; memset(file_name, 0, sizeof(file_name)); char a[16], b[16], c[16]; int rc; switch (path->subtype) { case 1: return unparse_media_hard_drive_path(buffer, buffer_size, path); case 2: return snprintf(buffer, buffer_size, "CD-ROM(%x,%" PRIx64 ",%" PRIx64 ")", get(a, cdrom->boot_entry), get(b, cdrom->start), get(c, cdrom->size)); case 3: return unparse_vendor_path(buffer, buffer_size, NULL, (VENDOR_DEVICE_PATH *)path); case 4: efichar_to_char(file_name, file->path_name, 80); return snprintf(buffer, buffer_size, "File(%s)", file_name); case 5: rc = efi_guid_to_str(&media->guid, &text_guid); if (rc < 0) return rc; rc = snprintf(buffer, buffer_size, "Media(%s)", text_guid); free(text_guid); return rc; case 6: rc = efi_guid_to_str(&media->guid, &text_guid); if (rc < 0) return rc; rc = snprintf(buffer, buffer_size, "FvFile(%s)", text_guid); free(text_guid); return rc > 0 ? rc + 1 : rc; case 7: rc = efi_guid_to_str(&media->guid, &text_guid); if (rc < 0) return rc; rc = snprintf(buffer, buffer_size, "FvVol(%s)", text_guid); free(text_guid); return rc > 0 ? rc + 1 : rc; } return 0; }
static int unparse_media_path(char *buffer, EFI_DEVICE_PATH *path) { CDROM_DEVICE_PATH *cdrom = (CDROM_DEVICE_PATH *)path; MEDIA_PROTOCOL_DEVICE_PATH *media = (MEDIA_PROTOCOL_DEVICE_PATH *)path; FILE_PATH_DEVICE_PATH *file = (FILE_PATH_DEVICE_PATH *)path; char text_guid[40], *p = buffer; char file_name[80]; memset(file_name, 0, sizeof(file_name)); char a[16], b[16], c[16]; switch (path->subtype) { case 1: return unparse_media_hard_drive_path(buffer, path); break; case 2: return sprintf(buffer, "CD-ROM(%x,%" PRIx64 ",%" PRIx64 ")", get(a, cdrom->boot_entry), get(b, cdrom->start), get(c, cdrom->size)); break; case 3: return unparse_vendor_path(buffer, (VENDOR_DEVICE_PATH *)path); break; case 4: efichar_to_char(file_name, file->path_name, 80); return sprintf(p, "File(%s)", file_name); break; case 5: efi_guid_unparse(&media->guid, text_guid); return sprintf(buffer, "Media(%s)", text_guid); break; default: break; } return 0; }
static ssize_t unparse_messaging_path(char *buffer, size_t buffer_size, EFI_DEVICE_PATH *path) { ATAPI_DEVICE_PATH *atapi = (ATAPI_DEVICE_PATH *)path; SATA_DEVICE_PATH *sata = (SATA_DEVICE_PATH *)path; SCSI_DEVICE_PATH *scsi = (SCSI_DEVICE_PATH *)path; FIBRE_CHANNEL_DEVICE_PATH *fc = (FIBRE_CHANNEL_DEVICE_PATH *)path; I1394_DEVICE_PATH *i1394 = (I1394_DEVICE_PATH *)path; USB_DEVICE_PATH *usb = (USB_DEVICE_PATH *)path; MAC_ADDR_DEVICE_PATH *mac = (MAC_ADDR_DEVICE_PATH *)path; USB_CLASS_DEVICE_PATH *usbclass = (USB_CLASS_DEVICE_PATH *)path; I2O_DEVICE_PATH *i2o = (I2O_DEVICE_PATH *)path; IPv4_DEVICE_PATH *ipv4 = (IPv4_DEVICE_PATH *)path; /* IPv6_DEVICE_PATH *ipv6 = (IPv6_DEVICE_PATH *)path; */ NVME_DEVICE_PATH *nvme = (NVME_DEVICE_PATH *)path; char a[16], b[16], c[16], d[16], e[16]; size_t needed; off_t buf_offset = 0; switch (path->subtype) { case 1: return snprintf(buffer, buffer_size, "ATAPI(%x,%x,%x)", get(a, atapi->primary_secondary), get(b, atapi->slave_master), get(c, atapi->lun)); case 2: return snprintf(buffer, buffer_size, "SCSI(%x,%x)", get(a, scsi->id), get(b, scsi->lun)); case 3: return snprintf(buffer, buffer_size, "FC(%" PRIx64 ",%" PRIx64 ")", get(a, fc->wwn), get(b, fc->lun)); case 4: return snprintf(buffer, buffer_size, "1394(%" PRIx64 ")", get(a, i1394->guid)); case 5: return snprintf(buffer, buffer_size, "USB(%x,%x)", get(a, usb->port), get(b, usb->endpoint)); case 6: return snprintf(buffer, buffer_size, "I2O(%x)", get(a, i2o->tid)); case 10: return unparse_vendor_path(buffer, buffer_size, "VenMsg", (VENDOR_DEVICE_PATH *)path); case 11: needed = snprintf(buffer, buffer_size, "MAC("); if (needed < 0) return needed; buf_offset += needed; needed = snprintf(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, "MAC("); if (needed < 0) return needed; buf_offset += needed; needed = unparse_raw(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, mac->macaddr, 6); if (needed < 0) return needed; buf_offset += needed; needed = snprintf(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, ",%hhx)", get(a, mac->iftype)); if (needed < 0) return needed; buf_offset += needed; return buf_offset; case 12: needed = snprintf(buffer, buf_offset, "IPv4("); if (needed < 0) return -1; buf_offset += needed; needed = unparse_ipv4_port(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, ipv4->local_ip, ipv4->local_port); if (needed < 0) return -1; buf_offset += needed; needed = snprintf(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, "<->"); if (needed < 0) return -1; buf_offset += needed; needed = unparse_ipv4_port(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, ipv4->remote_ip, ipv4->remote_port); if (needed < 0) return -1; buf_offset += needed; needed = snprintf(buffer + buf_offset, buffer_size == 0 ? 0 : buffer_size - buf_offset, ",%hx, %hhx", get(a, ipv4->protocol), get(b, ipv4->static_addr)); if (needed < 0) return -1; buf_offset += needed; return buf_offset; case 15: return snprintf(buffer, buffer_size, "USBClass(%hx,%hx,%hhx,%hhx,%hhx)", get(a, usbclass->vendor), get(b, usbclass->product), get(c, usbclass->class), get(d, usbclass->subclass), get(e, usbclass->protocol)); case 18: return snprintf(buffer, buffer_size, "SATA(%hx,%hx,%hx)", get(a, sata->port), get(b, sata->port_multiplier), get(c, sata->lun)); case 23: return snprintf(buffer, buffer_size, "NVME(%x,%lx)", get(a, nvme->namespace_id), get(b, nvme->ieee_extended_unique_identifier)); default: return unparse_raw(buffer, buffer_size, (uint8_t *)path, path->length); } return 0; }