From 0a883973a2cfa7305a4032725c8bae3c0faa7b24 Mon Sep 17 00:00:00 2001
From: Stefan Rueger <stefan.rueger@urclocks.com>
Date: Mon, 2 Jan 2023 16:55:33 +0000
Subject: [PATCH 1/2] Move static usbsn into serdev structure, remove serno
 access function

---
 src/jtag3.c      |  6 +++---
 src/libavrdude.h |  3 +--
 src/stk500v2.c   |  6 +++---
 src/usb_hidapi.c | 10 ++--------
 src/usb_libusb.c | 11 ++---------
 5 files changed, 11 insertions(+), 25 deletions(-)

diff --git a/src/jtag3.c b/src/jtag3.c
index bab35032..2d2eedd1 100644
--- a/src/jtag3.c
+++ b/src/jtag3.c
@@ -1569,9 +1569,9 @@ int jtag3_open_common(PROGRAMMER *pgm, const char *port) {
     pmsg_notice("found CMSIS-DAP compliant device, using EDBG protocol\n");
   }
 
-  // Get USB serial number function if function pointer is present
-  if (serial_serno)
-    pgm->usbsn = serial_serno();
+  // Copy over pointer to USB serial number function
+  if (serdev && serdev->usbsn)
+    pgm->usbsn = serdev->usbsn;
 
   /*
    * drain any extraneous input
diff --git a/src/libavrdude.h b/src/libavrdude.h
index 70347037..b5ba9234 100644
--- a/src/libavrdude.h
+++ b/src/libavrdude.h
@@ -649,7 +649,6 @@ union pinfo
 struct serial_device {
   // open should return -1 on error, other values on success
   int (*open)(const char *port, union pinfo pinfo, union filedescriptor *fd);
-  const char *(*serno)();
   int (*setparams)(const union filedescriptor *fd, long baud, unsigned long cflags);
   void (*close)(union filedescriptor *fd);
 
@@ -659,6 +658,7 @@ struct serial_device {
 
   int (*set_dtr_rts)(const union filedescriptor *fd, int is_on);
 
+  const char *usbsn;
   int flags;
 #define SERDEV_FL_NONE         0x0000 /* no flags */
 #define SERDEV_FL_CANSETSPEED  0x0001 /* device can change speed */
@@ -672,7 +672,6 @@ extern struct serial_device avrdoper_serdev;
 extern struct serial_device usbhid_serdev;
 
 #define serial_open (serdev->open)
-#define serial_serno (serdev->serno)
 #define serial_setparams (serdev->setparams)
 #define serial_close (serdev->close)
 #define serial_send (serdev->send)
diff --git a/src/stk500v2.c b/src/stk500v2.c
index beecf4c1..a60fe666 100644
--- a/src/stk500v2.c
+++ b/src/stk500v2.c
@@ -1578,9 +1578,9 @@ static int stk500v2_open(PROGRAMMER *pgm, const char *port) {
     return -1;
   }
 
-  // Get USB serial number function if function pointer is present
-  if (serial_serno)
-    pgm->usbsn = serial_serno();
+  // Copy over pointer to USB serial number function
+  if (serdev && serdev->usbsn)
+    pgm->usbsn = serdev->usbsn;
 
   /*
    * drain any extraneous input
diff --git a/src/usb_hidapi.c b/src/usb_hidapi.c
index a48f39d8..4a08c1f5 100644
--- a/src/usb_hidapi.c
+++ b/src/usb_hidapi.c
@@ -42,12 +42,6 @@
 
 #include "usbdevs.h"
 
-static const char *usbsn = "";
-
-const char *usbhid_get_serno() {
-  return usbsn;
-}
-
 /*
  * The "baud" parameter is meaningless for USB devices, so we reuse it
  * to pass the desired USB device ID.
@@ -142,7 +136,8 @@ static int usbhid_open(const char *port, union pinfo pinfo, union filedescriptor
     if (n) {
       char *cn = cfg_malloc(__func__, n);
       if (wcstombs(cn, sn, n) != (size_t) -1)
-        usbsn = cache_string(cn);
+        if(serdev)
+          serdev->usbsn = cache_string(cn);
       free(cn);
     }
   }
@@ -319,7 +314,6 @@ static int usbhid_drain(const union filedescriptor *fd, int display) {
  */
 struct serial_device usbhid_serdev = {
   .open = usbhid_open,
-  .serno = usbhid_get_serno,
   .close = usbhid_close,
   .send = usbhid_send,
   .recv = usbhid_recv,
diff --git a/src/usb_libusb.c b/src/usb_libusb.c
index 8e7f81bc..605828ee 100644
--- a/src/usb_libusb.c
+++ b/src/usb_libusb.c
@@ -58,12 +58,6 @@ static int buflen = -1, bufptr;
 
 static int usb_interface;
 
-static const char *usbsn = "";
-
-const char *usbdev_get_serno() {
-  return usbsn;
-}
-
 /*
  * The "baud" parameter is meaningless for USB devices, so we reuse it
  * to pass the desired USB device ID.
@@ -144,7 +138,8 @@ static int usbdev_open(const char *port, union pinfo pinfo, union filedescriptor
 		      else
 			strcpy(string, "[unknown]");
 		    }
-		  usbsn = cache_string(string);
+		  if(serdev)
+		    serdev->usbsn = cache_string(string);
 		  if (usb_get_string_simple(udev,
 					    dev->descriptor.iProduct,
 					    product, sizeof(product)) < 0)
@@ -582,7 +577,6 @@ static int usbdev_drain(const union filedescriptor *fd, int display)
 struct serial_device usb_serdev =
 {
   .open = usbdev_open,
-  .serno = usbdev_get_serno,
   .close = usbdev_close,
   .send = usbdev_send,
   .recv = usbdev_recv,
@@ -596,7 +590,6 @@ struct serial_device usb_serdev =
 struct serial_device usb_serdev_frame =
 {
   .open = usbdev_open,
-  .serno = usbdev_get_serno,
   .close = usbdev_close,
   .send = usbdev_send,
   .recv = usbdev_recv_frame,

From 74cbb51ef528d968076120840b3f7dcb2b951069 Mon Sep 17 00:00:00 2001
From: Stefan Rueger <stefan.rueger@urclocks.com>
Date: Mon, 2 Jan 2023 17:10:15 +0000
Subject: [PATCH 2/2] Clarify comment on copying usbsn

---
 src/jtag3.c    | 2 +-
 src/stk500v2.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/jtag3.c b/src/jtag3.c
index 2d2eedd1..62b95779 100644
--- a/src/jtag3.c
+++ b/src/jtag3.c
@@ -1569,7 +1569,7 @@ int jtag3_open_common(PROGRAMMER *pgm, const char *port) {
     pmsg_notice("found CMSIS-DAP compliant device, using EDBG protocol\n");
   }
 
-  // Copy over pointer to USB serial number function
+  // Make USB serial number available to programmer
   if (serdev && serdev->usbsn)
     pgm->usbsn = serdev->usbsn;
 
diff --git a/src/stk500v2.c b/src/stk500v2.c
index a60fe666..49a331f3 100644
--- a/src/stk500v2.c
+++ b/src/stk500v2.c
@@ -1578,7 +1578,7 @@ static int stk500v2_open(PROGRAMMER *pgm, const char *port) {
     return -1;
   }
 
-  // Copy over pointer to USB serial number function
+  // Make USB serial number available to programmer
   if (serdev && serdev->usbsn)
     pgm->usbsn = serdev->usbsn;