From cb81253cc60d9641ee766fa2be691d82821710ca Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Tue, 15 Oct 2019 16:26:30 -0400 Subject: [PATCH 54/63] Improve consistency of debug prints This changes debug prints in a couple of ways: - always calls the path we're parsing "current" in the output - always use ' not " for quoting in the debug output, so tools that escape strings won't change the lenghts - everything that parses "current" has a debug print after each parse attempt and before returning. Signed-off-by: Peter Jones --- src/dp-acpi.c | 6 ++--- src/linux-acpi-root.c | 20 +++++++++-------- src/linux-acpi.c | 4 ++-- src/linux-ata.c | 6 ++--- src/linux-emmc.c | 5 +++-- src/linux-i2o.c | 8 +++---- src/linux-md.c | 4 ++-- src/linux-nvme.c | 8 +++++-- src/linux-pci-root.c | 16 ++++++++------ src/linux-pci.c | 17 +++++++-------- src/linux-pmem.c | 19 +++++++++------- src/linux-sas.c | 3 +++ src/linux-sata.c | 9 ++++---- src/linux-scsi.c | 51 +++++++++++++++++++++++++++---------------- src/linux-soc-root.c | 6 ++--- src/linux-virtblk.c | 5 +++-- src/linux.c | 27 ++++++++++++++--------- 17 files changed, 125 insertions(+), 89 deletions(-) diff --git a/src/dp-acpi.c b/src/dp-acpi.c index 02ec70eec7a..4845410c2cf 100644 --- a/src/dp-acpi.c +++ b/src/dp-acpi.c @@ -52,9 +52,9 @@ _format_acpi_hid_ex(unsigned char *buf, size_t size, { ssize_t off = 0; - debug("hid:0x%08x hidstr:\"%s\"", dp->acpi_hid_ex.hid, hidstr); - debug("cid:0x%08x cidstr:\"%s\"", dp->acpi_hid_ex.cid, cidstr); - debug("uid:0x%08x uidstr:\"%s\"", dp->acpi_hid_ex.uid, uidstr); + debug("hid:0x%08x hidstr:'%s'", dp->acpi_hid_ex.hid, hidstr); + debug("cid:0x%08x cidstr:'%s'", dp->acpi_hid_ex.cid, cidstr); + debug("uid:0x%08x uidstr:'%s'", dp->acpi_hid_ex.uid, uidstr); if (!hidstr && !cidstr && (uidstr || dp->acpi_hid_ex.uid)) { format(buf, size, off, "AcpiExp", diff --git a/src/linux-acpi-root.c b/src/linux-acpi-root.c index 5ed4d7f5b86..57a648981b3 100644 --- a/src/linux-acpi-root.c +++ b/src/linux-acpi-root.c @@ -44,7 +44,7 @@ static ssize_t parse_acpi_root(struct device *dev, const char *current, const char *root UNUSED) { int rc; - int pos = 0; + int pos = -1; uint16_t pad0; uint8_t pad1; char *acpi_header = NULL; @@ -62,7 +62,7 @@ parse_acpi_root(struct device *dev, const char *current, const char *root UNUSED * side in sscanf. */ rc = sscanf(devpart, "../../devices/platform/%n", &pos); - debug("devpart:\"%s\" rc:%d pos:%d", devpart, rc, pos); + debug("current:'%s' rc:%d pos:%d", devpart, rc, pos); dbgmk(" ", pos); if (rc != 0 || pos < 1) return 0; @@ -94,16 +94,16 @@ parse_acpi_root(struct device *dev, const char *current, const char *root UNUSED return -1; } dev->acpi_root.acpi_hid_str[pos] = 0; - debug("acpi_hid_str:\"%s\"", dev->acpi_root.acpi_hid_str); + debug("acpi_hid_str:'%s'", dev->acpi_root.acpi_hid_str); pos -= 4; - debug("devpart:\"%s\" rc:%d pos:%d", devpart, rc, pos); + debug("current:'%s' rc:%d pos:%d", devpart, rc, pos); dbgmk(" ", pos); acpi_header = strndupa(devpart, pos); if (!acpi_header) return 0; acpi_header[pos] = 0; - debug("devpart:\"%s\" acpi_header:\"%s\"", devpart, acpi_header); + debug("current:'%s' acpi_header:'%s'", devpart, acpi_header); devpart += pos; /* @@ -114,7 +114,7 @@ parse_acpi_root(struct device *dev, const char *current, const char *root UNUSED efi_error("Could not parse ACPI path \"%s\"", devpart); return 0; } - debug("devpart:\"%s\" parsed:%04hx:%02hhx pos:%d rc:%d", + debug("current:'%s' parsed:%04hx:%02hhx pos:%d rc:%d", devpart, pad0, pad1, pos, rc); dbgmk(" ", pos); @@ -134,12 +134,14 @@ parse_acpi_root(struct device *dev, const char *current, const char *root UNUSED efi_error("Could not parse hid/uid"); return rc; } - debug("Parsed HID:0x%08x UID:0x%"PRIx64" uidstr:\"%s\" path:\"%s\"", + debug("Parsed HID:0x%08x UID:0x%"PRIx64" uidstr:'%s' path:'%s'", dev->acpi_root.acpi_hid, dev->acpi_root.acpi_uid, dev->acpi_root.acpi_uid_str, dev->acpi_root.acpi_cid_str); - return devpart - current; + size_t sz = devpart - current; + debug("current:'%s' sz:%zd", devpart, sz); + return sz; } static ssize_t @@ -151,7 +153,7 @@ dp_create_acpi_root(struct device *dev, debug("entry buf:%p size:%zd off:%zd", buf, size, off); if (dev->acpi_root.acpi_uid_str || dev->acpi_root.acpi_cid_str) { - debug("creating acpi_hid_ex dp hid:0x%08x uid:0x%"PRIx64" uidstr:\"%s\" cidstr:\"%s\"", + debug("creating acpi_hid_ex dp hid:0x%08x uid:0x%"PRIx64" uidstr:'%s' cidstr:'%s'", dev->acpi_root.acpi_hid, dev->acpi_root.acpi_uid, dev->acpi_root.acpi_uid_str, dev->acpi_root.acpi_cid_str); new = efidp_make_acpi_hid_ex(buf + off, size ? size - off : 0, diff --git a/src/linux-acpi.c b/src/linux-acpi.c index 919f4654ae3..70161ca7b9e 100644 --- a/src/linux-acpi.c +++ b/src/linux-acpi.c @@ -54,7 +54,7 @@ parse_acpi_hid_uid(struct device *dev, const char *fmt, ...) if (l > 1) { fbuf[l-1] = 0; dev->acpi_root.acpi_cid_str = strdup(fbuf); - debug("Setting ACPI root path to \"%s\"", fbuf); + debug("Setting ACPI root path to '%s'", fbuf); } } @@ -111,7 +111,7 @@ hid_err: } } } - debug("acpi root UID:0x%"PRIx64" uidstr:\"%s\"", + debug("acpi root UID:0x%"PRIx64" uidstr:'%s'", dev->acpi_root.acpi_uid, dev->acpi_root.acpi_uid_str); errno = 0; diff --git a/src/linux-ata.c b/src/linux-ata.c index b6a7c2dcf8a..7bb23da60f5 100644 --- a/src/linux-ata.c +++ b/src/linux-ata.c @@ -126,9 +126,9 @@ parse_ata(struct device *dev, const char *current, const char *root UNUSED) dev->ata_info.scsi_lun = scsi_lun; char *block = strstr(current, "/block/"); - if (!block) - return -1; - return block + 1 - current; + ssize_t sz = block ? block + 1 - current : -1; + debug("current:'%s' sz:%zd", current, sz); + return sz; } static ssize_t diff --git a/src/linux-emmc.c b/src/linux-emmc.c index 59ef8e7524d..74cf54aa336 100644 --- a/src/linux-emmc.c +++ b/src/linux-emmc.c @@ -49,7 +49,7 @@ parse_emmc(struct device *dev, const char *current, const char *root UNUSED) { int rc; int32_t tosser0, tosser1, tosser2, tosser3, slot_id, partition; - int pos0 = 0, pos1 = 0; + int pos0 = -1, pos1 = -1; debug("entry"); @@ -57,7 +57,7 @@ parse_emmc(struct device *dev, const char *current, const char *root UNUSED) rc = sscanf(current, "mmc_host/mmc%d/mmc%d:%d/block/mmcblk%d%n/mmcblk%dp%d%n", &tosser0, &tosser1, &tosser2, &slot_id, &pos0, &tosser3, &partition, &pos1); - debug("current:\"%s\" rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); dbgmk(" ", pos0, pos1); /* * If it isn't of that form, it's not one of our emmc devices. @@ -75,6 +75,7 @@ parse_emmc(struct device *dev, const char *current, const char *root UNUSED) pos0 = pos1; } + debug("current:'%s' sz:%d\n", current, pos0); return pos0; } diff --git a/src/linux-i2o.c b/src/linux-i2o.c index ebd92aeeb53..76b3d4d5d39 100644 --- a/src/linux-i2o.c +++ b/src/linux-i2o.c @@ -33,7 +33,7 @@ * ... probably doesn't work. */ static ssize_t -parse_i2o(struct device *dev, const char *current UNUSED, const char *root UNUSED) +parse_i2o(struct device *dev, const char *current, const char *root UNUSED) { debug("entry"); /* I2O disks can have up to 16 partitions, or 4 bits worth. */ @@ -47,9 +47,9 @@ parse_i2o(struct device *dev, const char *current UNUSED, const char *root UNUSE } char *block = strstr(current, "/block/"); - if (!block) - return -1; - return block + 1 - current; + ssize_t sz = block ? block + 1 - current : -1; + debug("current:'%s' sz:%zd", current, sz); + return sz; } enum interface_type i2o_iftypes[] = { i2o, unknown }; diff --git a/src/linux-md.c b/src/linux-md.c index 1d7bd3195c0..ded7cbd169c 100644 --- a/src/linux-md.c +++ b/src/linux-md.c @@ -50,7 +50,7 @@ parse_md(struct device *dev, const char *current, const char *root UNUSED) debug("searching for mdM/mdMpN"); rc = sscanf(current, "md%d/%nmd%dp%d%n", &md, &pos0, &tosser0, &part, &pos1); - debug("current:\"%s\" rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); dbgmk(" ", pos0, pos1); /* * If it isn't of that form, it's not one of our partitioned md devices. @@ -63,10 +63,10 @@ parse_md(struct device *dev, const char *current, const char *root UNUSED) if (dev->part == -1) dev->part = part; + debug("current:'%s' sz:%d\n", current, pos1); return pos1; } - static char * make_part_name(struct device *dev) { diff --git a/src/linux-nvme.c b/src/linux-nvme.c index 0b4eae74f79..7b18d7990ac 100644 --- a/src/linux-nvme.c +++ b/src/linux-nvme.c @@ -53,6 +53,7 @@ parse_nvme(struct device *dev, const char *current, const char *root UNUSED) int rc; int32_t tosser0, tosser1, tosser2, ctrl_id, ns_id, partition; uint8_t *filebuf = NULL; + ssize_t sz = 0; int pos0 = 0, pos1 = 0; debug("entry"); @@ -61,7 +62,7 @@ parse_nvme(struct device *dev, const char *current, const char *root UNUSED) rc = sscanf(current, "nvme/nvme%d/nvme%dn%d%n/nvme%dn%dp%d%n", &tosser0, &ctrl_id, &ns_id, &pos0, &tosser1, &tosser2, &partition, &pos1); - debug("current:\"%s\" rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); dbgmk(" ", pos0, pos1); /* * If it isn't of that form, it's not one of our nvme devices. @@ -81,6 +82,8 @@ parse_nvme(struct device *dev, const char *current, const char *root UNUSED) pos0 = pos1; } + sz += pos0; + /* * now fish the eui out of sysfs is there is one... */ @@ -111,7 +114,8 @@ parse_nvme(struct device *dev, const char *current, const char *root UNUSED) memcpy(dev->nvme_info.eui, eui, sizeof(eui)); } - return pos0; + debug("current:'%s' sz:%zd\n", current, sz); + return sz; } static ssize_t diff --git a/src/linux-pci-root.c b/src/linux-pci-root.c index c84b639cbfe..c7e279118f5 100644 --- a/src/linux-pci-root.c +++ b/src/linux-pci-root.c @@ -44,7 +44,7 @@ static ssize_t parse_pci_root(struct device *dev, const char *current, const char *root UNUSED) { int rc; - int pos = 0; + int pos0 = -1, pos1 = -1; uint16_t root_domain; uint8_t root_bus; const char *devpart = current; @@ -56,15 +56,16 @@ parse_pci_root(struct device *dev, const char *current, const char *root UNUSED) * pci0000:00/ * ^d ^p */ - rc = sscanf(devpart, "../../devices/pci%hx:%hhx/%n", &root_domain, &root_bus, &pos); - debug("current:\"%s\" rc:%d pos:%d", devpart, rc, pos); - dbgmk(" ", pos); + rc = sscanf(devpart, "%n../../devices/pci%hx:%hhx/%n", &pos0, &root_domain, &root_bus, &pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d", devpart, rc, pos0, pos1); + dbgmk(" ", pos0, pos1); + /* * If we can't find that, it's not a PCI device. */ if (rc != 2) return 0; - devpart += pos; + devpart += pos1; dev->pci_root.pci_domain = root_domain; dev->pci_root.pci_bus = root_bus; @@ -75,7 +76,8 @@ parse_pci_root(struct device *dev, const char *current, const char *root UNUSED) return -1; errno = 0; - return devpart - current; + debug("current:'%s' sz:%d\n", devpart, pos1); + return pos1; } static ssize_t @@ -86,7 +88,7 @@ dp_create_pci_root(struct device *dev UNUSED, debug("entry buf:%p size:%zd off:%zd", buf, size, off); debug("returning 0"); if (dev->acpi_root.acpi_uid_str) { - debug("creating acpi_hid_ex dp hid:0x%08x uid:\"%s\"", + debug("creating acpi_hid_ex dp hid:0x%08x uid:'%s'", dev->acpi_root.acpi_hid, dev->acpi_root.acpi_uid_str); new = efidp_make_acpi_hid_ex(buf + off, size ? size - off : 0, diff --git a/src/linux-pci.c b/src/linux-pci.c index 0de330db628..a3a0dc28afd 100644 --- a/src/linux-pci.c +++ b/src/linux-pci.c @@ -46,7 +46,7 @@ static ssize_t parse_pci(struct device *dev, const char *current, const char *root) { int rc; - int pos = 0; + int pos0 = -1, pos1 = -1; const char *devpart = current; debug("entry"); @@ -62,16 +62,15 @@ parse_pci(struct device *dev, const char *current, const char *root) unsigned int i = dev->n_pci_devs; struct stat statbuf; - debug("devpart is \"%s\"", devpart); - pos = 0; + pos0 = pos1 = -1; debug("searching for 0000:00:00.0/"); - rc = sscanf(devpart, "%hx:%hhx:%hhx.%hhx/%n", - &domain, &bus, &device, &function, &pos); - debug("current:\"%s\" rc:%d pos:%d", devpart, rc, pos); - dbgmk(" ", pos); + rc = sscanf(devpart, "%n%hx:%hhx:%hhx.%hhx/%n", + &pos0, &domain, &bus, &device, &function, &pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d", devpart, rc, pos0, pos1); + dbgmk(" ", pos0, pos1); if (rc != 4) break; - devpart += pos; + devpart += pos1; debug("found pci domain %04hx:%02hhx:%02hhx.%02hhx", domain, bus, device, function); @@ -115,7 +114,7 @@ parse_pci(struct device *dev, const char *current, const char *root) dev->n_pci_devs += 1; } - debug("next:\"%s\"", devpart); + debug("current:'%s' sz:%zd\n", devpart, devpart - current); return devpart - current; } diff --git a/src/linux-pmem.c b/src/linux-pmem.c index 18eb7dce5e3..49db24560fa 100644 --- a/src/linux-pmem.c +++ b/src/linux-pmem.c @@ -75,7 +75,7 @@ parse_pmem(struct device *dev, const char *current, const char *root UNUSED) uint8_t *filebuf = NULL; uint8_t system, sysbus, acpi_id; uint16_t pnp_id; - int ndbus, region, btt_region_id, btt_id, rc, pos; + int ndbus, region, btt_region_id, btt_id, rc, pos0, pos1; char *namespace = NULL; debug("entry"); @@ -101,14 +101,16 @@ parse_pmem(struct device *dev, const char *current, const char *root UNUSED) * * 259:0 -> ../../devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0012:00/ndbus0/region12/btt12.1/block/pmem12s */ + pos0 = pos1 = -1; rc = sscanf(current, - "../../devices/LNXSYSTM:%hhx/LNXSYBUS:%hhx/ACPI%hx:%hhx/ndbus%d/region%d/btt%d.%d/%n", - &system, &sysbus, &pnp_id, &acpi_id, &ndbus, ®ion, - &btt_region_id, &btt_id, &pos); - debug("current:\"%s\" rc:%d pos:%d", current, rc, pos); - dbgmk(" ", pos); + "../../devices/%nLNXSYSTM:%hhx/LNXSYBUS:%hhx/ACPI%hx:%hhx/ndbus%d/region%d/btt%d.%d/%n", + &pos0, &system, &sysbus, &pnp_id, &acpi_id, &ndbus, + ®ion, &btt_region_id, &btt_id, &pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d", current, rc, pos0, pos1); + dbgmk(" ", pos0, pos1); if (rc < 8) return 0; + current += pos1; /* * but the UUID we really do need to have. @@ -123,7 +125,7 @@ parse_pmem(struct device *dev, const char *current, const char *root UNUSED) return -1; filebuf = NULL; - debug("nvdimm namespace is \"%s\"", namespace); + debug("nvdimm namespace is '%s'", namespace); rc = read_sysfs_file(&filebuf, "bus/nd/devices/%s/uuid", namespace); free(namespace); if (rc < 0 || filebuf == NULL) @@ -158,7 +160,8 @@ parse_pmem(struct device *dev, const char *current, const char *root UNUSED) dev->interface_type = nd_pmem; - return pos; + debug("current:'%s' sz:%d\n", current, pos1); + return pos1; } static ssize_t diff --git a/src/linux-sas.c b/src/linux-sas.c index f985deeaa3f..d14fcfb231a 100644 --- a/src/linux-sas.c +++ b/src/linux-sas.c @@ -172,6 +172,7 @@ parse_sas(struct device *dev, const char *current, const char *root UNUSED) */ if (pos < 0) return 0; + current += pos; /* * Make sure it has the actual /SAS/ bits before we continue @@ -236,6 +237,8 @@ parse_sas(struct device *dev, const char *current, const char *root UNUSED) dev->scsi_info.scsi_target = scsi_target; dev->scsi_info.scsi_lun = scsi_lun; dev->interface_type = sas; + + debug("current:'%s' sz:%zd\n", current, pos); return pos; } diff --git a/src/linux-sata.c b/src/linux-sata.c index b0caa3fa401..4f4e983568e 100644 --- a/src/linux-sata.c +++ b/src/linux-sata.c @@ -161,7 +161,7 @@ parse_sata(struct device *dev, const char *devlink, const char *root UNUSED) */ debug("searching for ata1/"); rc = sscanf(current, "ata%"PRIu32"/%n", &print_id, &pos); - debug("current:\"%s\" rc:%d pos:%d\n", current, rc, pos); + debug("current:'%s' rc:%d pos:%d\n", current, rc, pos); dbgmk(" ", pos); /* * If we don't find this one, it isn't an ata device, so return 0 not @@ -175,7 +175,7 @@ parse_sata(struct device *dev, const char *devlink, const char *root UNUSED) debug("searching for host0/"); rc = sscanf(current, "host%"PRIu32"/%n", &scsi_bus, &pos); - debug("current:\"%s\" rc:%d pos:%d\n", current, rc, pos); + debug("current:'%s' rc:%d pos:%d\n", current, rc, pos); dbgmk(" ", pos); if (rc != 1) return -1; @@ -185,7 +185,7 @@ parse_sata(struct device *dev, const char *devlink, const char *root UNUSED) debug("searching for target0:0:0:0/"); rc = sscanf(current, "target%"PRIu32":%"PRIu32":%"PRIu64"/%n", &scsi_device, &scsi_target, &scsi_lun, &pos); - debug("current:\"%s\" rc:%d pos:%d\n", current, rc, pos); + debug("current:'%s' rc:%d pos:%d\n", current, rc, pos); dbgmk(" ", pos); if (rc != 3) return -1; @@ -195,7 +195,7 @@ parse_sata(struct device *dev, const char *devlink, const char *root UNUSED) debug("searching for 0:0:0:0/"); rc = sscanf(current, "%"PRIu32":%"PRIu32":%"PRIu32":%"PRIu64"/%n", &tosser0, &tosser1, &tosser2, &tosser3, &pos); - debug("current:\"%s\" rc:%d pos:%d\n", current, rc, pos); + debug("current:'%s' rc:%d pos:%d\n", current, rc, pos); dbgmk(" ", pos); if (rc != 4) return -1; @@ -213,6 +213,7 @@ parse_sata(struct device *dev, const char *devlink, const char *root UNUSED) if (dev->interface_type == unknown) dev->interface_type = sata; + debug("current:'%s' sz:%zd\n", current, current - devlink); return current - devlink; } diff --git a/src/linux-scsi.c b/src/linux-scsi.c index 96fde7e15fa..6b92908d6bc 100644 --- a/src/linux-scsi.c +++ b/src/linux-scsi.c @@ -43,7 +43,7 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, uint32_t *remote_target_id) { int rc; - int sz = 0; + ssize_t sz = 0; int pos0 = 0, pos1 = 0; debug("entry"); @@ -100,10 +100,11 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, */ debug("searching for host4/"); rc = sscanf(current, "host%d/%n", scsi_host, &pos0); - debug("current:\"%s\" rc:%d pos0:%d\n", current+sz, rc, pos0); + debug("current:'%s' rc:%d pos0:%d\n", current, rc, pos0); dbgmk(" ", pos0); if (rc != 1) return -1; + current += pos0; sz += pos0; pos0 = 0; @@ -116,11 +117,12 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, * port-2:0:2/end_device-2:0:2/target2:0:0/2:0:0:0/block/sda/sda1 */ debug("searching for port-4:0 or port-4:0:0"); - rc = sscanf(current+sz, "port-%d:%d%n:%d%n", &tosser0, + rc = sscanf(current, "port-%d:%d%n:%d%n", &tosser0, &tosser1, &pos0, &tosser2, &pos1); - debug("current:\"%s\" rc:%d pos0:%d pos1:%d\n", current+sz, rc, pos0, pos1); + debug("current:'%s' rc:%d pos0:%d pos1:%d\n", current, rc, pos0, pos1); dbgmk(" ", pos0, pos1); if (rc == 2 || rc == 3) { + current += pos0; sz += pos0; pos0 = 0; if (local_port_id && rc == 2) @@ -128,8 +130,10 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, if (remote_port_id && rc == 3) *remote_port_id = tosser2; - if (current[sz] == '/') + if (current[0] == '/') { + current += 1; sz += 1; + } /* * We might have this next: @@ -143,8 +147,8 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, * to get past it. */ debug("searching for expander-4:0/"); - rc = sscanf(current+sz, "expander-%d:%d/%n", &tosser0, &tosser1, &pos0); - debug("current:\"%s\" rc:%d pos0:%d\n", current+sz, rc, pos0); + rc = sscanf(current, "expander-%d:%d/%n", &tosser0, &tosser1, &pos0); + debug("current:'%s' rc:%d pos0:%d\n", current, rc, pos0); dbgmk(" ", pos0); if (rc == 2) { if (!remote_target_id) { @@ -152,6 +156,7 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, return -1; } *remote_target_id = tosser1; + current += pos0; sz += pos0; pos0 = 0; @@ -159,13 +164,14 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, * if we have that, we should have a 3-part port next */ debug("searching for port-2:0:2/"); - rc = sscanf(current+sz, "port-%d:%d:%d/%n", &tosser0, &tosser1, &tosser2, &pos0); - debug("current:\"%s\" rc:%d pos0:%d\n", current+sz, rc, pos0); + rc = sscanf(current, "port-%d:%d:%d/%n", &tosser0, &tosser1, &tosser2, &pos0); + debug("current:'%s' rc:%d pos0:%d\n", current, rc, pos0); dbgmk(" ", pos0); if (rc != 3) { efi_error("Couldn't parse port expander port string"); return -1; } + current += pos0; sz += pos0; } pos0 = 0; @@ -177,13 +183,13 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, * but we don't care for now about any of them anyway. */ debug("searching for end_device-4:0/ or end_device-4:0:0/"); - rc = sscanf(current + sz, "end_device-%d:%d%n", &tosser0, &tosser1, &pos0); - debug("current:\"%s\" rc:%d pos0:%d\n", current+sz, rc, pos0); + rc = sscanf(current, "end_device-%d:%d%n", &tosser0, &tosser1, &pos0); + debug("current:'%s' rc:%d pos0:%d\n", current, rc, pos0); if (rc != 2) return -1; pos1 = 0; - rc = sscanf(current + sz + pos0, ":%d%n", &tosser2, &pos1); + rc = sscanf(current + pos0, ":%d%n", &tosser2, &pos1); if (rc != 0 && rc != 1) return -1; dbgmk(" ", pos0, pos0+pos1); @@ -191,11 +197,14 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, *remote_port_id = tosser2; if (local_port_id && rc == 0) *local_port_id = tosser1; + current += pos0 + pos1; sz += pos0 + pos1; pos0 = pos1 = 0; - if (current[sz] == '/') + if (current[0] == '/') { + current += sz; sz += 1; + } } else if (rc != 0) { return -1; } @@ -205,12 +214,13 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, */ uint64_t tosser3; debug("searching for target4:0:0/"); - rc = sscanf(current + sz, "target%d:%d:%"PRIu64"/%n", &tosser0, &tosser1, + rc = sscanf(current, "target%d:%d:%"PRIu64"/%n", &tosser0, &tosser1, &tosser3, &pos0); - debug("current:\"%s\" rc:%d pos0:%d\n", current+sz, rc, pos0); + debug("current:'%s' rc:%d pos0:%d\n", current, rc, pos0); dbgmk(" ", pos0); if (rc != 3) return -1; + current += pos0; sz += pos0; pos0 = 0; @@ -218,15 +228,16 @@ parse_scsi_link(const char *current, uint32_t *scsi_host, * %d:%d:%d:%llu/ */ debug("searching for 4:0:0:0/"); - rc = sscanf(current + sz, "%d:%d:%d:%"PRIu64"/%n", + rc = sscanf(current, "%d:%d:%d:%"PRIu64"/%n", scsi_bus, scsi_device, scsi_target, scsi_lun, &pos0); - debug("current:\"%s\" rc:%d pos0:%d\n", current+sz, rc, pos0); + debug("current:'%s' rc:%d pos0:%d\n", current, rc, pos0); dbgmk(" ", pos0); if (rc != 4) return -1; + current += pos0; sz += pos0; - debug("returning %d", sz); + debug("current:'%s' sz:%zd\n", current, sz); return sz; } @@ -248,7 +259,7 @@ parse_scsi(struct device *dev, const char *current, const char *root UNUSED) &dev->scsi_info.scsi_target, &dev->scsi_info.scsi_lun, &pos); - debug("current:\"%s\" rc:%d pos:%d\n", dev->device, rc, pos); + debug("current:'%s' rc:%d pos:%d\n", dev->device, rc, pos); dbgmk(" ", pos); if (rc != 4) return 0; @@ -259,6 +270,7 @@ parse_scsi(struct device *dev, const char *current, const char *root UNUSED) NULL, NULL, NULL); if (sz < 0) return 0; + current += sz; /* * SCSI disks can have up to 16 partitions, or 4 bits worth @@ -281,6 +293,7 @@ parse_scsi(struct device *dev, const char *current, const char *root UNUSED) return -1; } + debug("current:'%s' sz:%zd\n", current, sz); return sz; } diff --git a/src/linux-soc-root.c b/src/linux-soc-root.c index c932670ef15..9c9e9573dcd 100644 --- a/src/linux-soc-root.c +++ b/src/linux-soc-root.c @@ -49,12 +49,12 @@ parse_soc_root(struct device *dev UNUSED, const char *current, const char *root rc = sscanf(devpart, "../../devices/platform/soc/%*[^/]/%n", &pos); if (rc != 0) return 0; - debug("current:\"%s\" rc:%d pos:%d", current, rc, pos); + debug("current:'%s' rc:%d pos:%d", current, rc, pos); dbgmk(" ", pos); devpart += pos; - debug("new position is \"%s\"", devpart); - return devpart - current; + debug("current:'%s' sz:%d\n", devpart, pos); + return pos; } enum interface_type soc_root_iftypes[] = { soc_root, unknown }; diff --git a/src/linux-virtblk.c b/src/linux-virtblk.c index 7517db55555..df14673dac8 100644 --- a/src/linux-virtblk.c +++ b/src/linux-virtblk.c @@ -48,14 +48,14 @@ static ssize_t parse_virtblk(struct device *dev, const char *current, const char *root UNUSED) { uint32_t tosser; - int pos = 0; + int pos = -1; int rc; debug("entry"); debug("searching for virtio0/"); rc = sscanf(current, "virtio%x/%n", &tosser, &pos); - debug("current:\"%s\" rc:%d pos:%d\n", current, rc, pos); + debug("current:'%s' rc:%d pos:%d\n", current, rc, pos); dbgmk(" ", pos); /* * If we couldn't find virtioX/ then it isn't a virtio device. @@ -65,6 +65,7 @@ parse_virtblk(struct device *dev, const char *current, const char *root UNUSED) dev->interface_type = virtblk; + debug("current:'%s' sz:%d\n", current, pos); return pos; } diff --git a/src/linux.c b/src/linux.c index 45b1ee2d96f..45f07d3913c 100644 --- a/src/linux.c +++ b/src/linux.c @@ -182,10 +182,10 @@ set_disk_and_part_name(struct device *dev) errno = 0; debug("dev->disk_name:%p dev->part_name:%p", dev->disk_name, dev->part_name); debug("dev->part:%d", dev->part); - debug("ultimate:\"%s\"", ultimate ? : ""); - debug("penultimate:\"%s\"", penultimate ? : ""); - debug("approximate:\"%s\"", approximate ? : ""); - debug("proximate:\"%s\"", proximate ? : ""); + debug("ultimate:'%s'", ultimate ? : ""); + debug("penultimate:'%s'", penultimate ? : ""); + debug("approximate:'%s'", approximate ? : ""); + debug("proximate:'%s'", proximate ? : ""); if (ultimate && penultimate && ((proximate && !strcmp(proximate, "nvme")) || @@ -455,7 +455,11 @@ struct device HIDDEN efi_error("parsing %s failed", probe->name); goto err; } else if (pos > 0) { - debug("%s matched %s", probe->name, current); + char match[pos+1]; + + strncpy(match, current, pos); + match[pos] = '\0'; + debug("%s matched '%s'", probe->name, match); dev->flags |= probe->flags; if (probe->flags & DEV_PROVIDES_HD || @@ -465,7 +469,10 @@ struct device HIDDEN dev->probes[n++] = dev_probes[i]; current += pos; - debug("current:%s", current); + if (current[0] == '\0') + debug("finished"); + else + debug("current:'%s'", current); last_successful_probe = i; if (!*current || !strncmp(current, "block/", 6)) @@ -474,8 +481,8 @@ struct device HIDDEN continue; } - debug("dev_probes[i+1]: %p dev->interface_type: %d\n", - dev_probes[i+1], dev->interface_type); + debug("dev_probes[%d]: %p dev->interface_type: %d\n", + i+1, dev_probes[i+1], dev->interface_type); if (dev_probes[i+1] == NULL && dev->interface_type == unknown) { pos = 0; rc = sscanf(current, "%*[^/]/%n", &pos); @@ -491,8 +498,8 @@ slash_err: if (!current[pos]) goto slash_err; - debug("Cannot parse device link segment \"%s\"", current); - debug("Skipping to \"%s\"", current + pos); + debug("Cannot parse device link segment '%s'", current); + debug("Skipping to '%s'", current + pos); debug("This means we can only create abbreviated paths"); dev->flags |= DEV_ABBREV_ONLY; i = last_successful_probe; -- 2.26.2