Match bus:device for usbasp using str_busdev_eq()

This commit is contained in:
stefanrueger
2025-10-21 14:04:19 +02:00
parent 881c8f80aa
commit 88eea2f908

View File

@@ -418,22 +418,19 @@ static int usbasp_transmit(const PROGRAMMER *pgm,
return nbytes;
}
static int check_for_port_argument_match(const char *port, char *bus, char *device, char *serial_num) {
static int check_for_port_argument_match(const char *port, const char *bus,
const char *device, const char *serial_num) {
pmsg_notice("found USBasp with bus:device = %s:%s, serial_number = %s\n", bus, device, serial_num);
const size_t usb_len = strlen("usb");
if(str_starts(port, "usb") && ':' == port[usb_len]) {
port += usb_len + 1;
char *colon_pointer = strchr(port, ':');
char *dev_name = strchr(port, ':');
if(dev_name) // Compare with bus:device
return str_busdev_eq(port, bus) && str_busdev_eq(dev_name+1, device);
if(colon_pointer) {
// Value contains ':' character. Compare with bus/device.
if(strncmp(port, bus, colon_pointer - port))
return 0;
port = colon_pointer + 1;
return str_eq(port, device);
}
// Serial number case
return *port && str_ends(serial_num, port);
}
@@ -514,12 +511,11 @@ static int usbOpenDevice(const PROGRAMMER *pgm, libusb_device_handle **device, i
// -P option given
libusb_get_string_descriptor_ascii(handle, descriptor.iSerialNumber,
(unsigned char *) string, sizeof(string));
char bus_num[21];
sprintf(bus_num, "%d", libusb_get_bus_number(dev));
char dev_addr[21];
char bus_num[21], dev_addr[21];
sprintf(bus_num, "%03d", libusb_get_bus_number(dev));
sprintf(dev_addr, "%03d", libusb_get_device_address(dev));
sprintf(dev_addr, "%d", libusb_get_device_address(dev));
if(!check_for_port_argument_match(port, bus_num, dev_addr, string))
errorCode = USB_ERROR_NOTFOUND;
}
@@ -644,12 +640,11 @@ static int usbasp_open(PROGRAMMER *pgm, const char *port) {
USBASP_OLD_PID, "USBasp", port) == 0) {
cx->usb_access_error = 0;
// Found USBasp with old IDs
pmsg_error("found USB device USBasp with old VID/PID; please update firmware of USBasp\n");
pmsg_error("found USBasp with old VID/PID; please update its firmware\n");
return 0;
}
/*
* original USBasp is specified in config file, so no need to check it
* Original USBasp is specified in config file, so no need to check it
* again here; no alternative found => fall through to generic error
* message
*/