#include <hw/usb_gadget.h>
+#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
return -ENOMEM;
}
+#define CPUINFO_DIR "/proc/cpuinfo"
+#define SERIAL_TAG "Serial"
+#define LINE_LEN 64
+
+static int get_device_serial(char **out)
+{
+ FILE *fp;
+ char line[LINE_LEN], *p, *q;
+
+ fp = fopen(CPUINFO_DIR, "r");
+ if (!fp)
+ return -1;
+
+ while ((p = fgets(line, LINE_LEN, fp)) != NULL) {
+ p = strchr(p, '\t');
+ if (!p)
+ continue;
+
+ *p = '\0';
+
+ if (strncmp(line, SERIAL_TAG, LINE_LEN) != 0)
+ continue;
+
+ ++p;
+ p = strchr(p, ':');
+ if (!p)
+ continue;
+ p += 2;
+
+ q = strchrnul(p, '\n');
+ *q = '\0';
+ *out = strdup(p);
+ fclose(fp);
+ return 0;
+ }
+
+ fclose(fp);
+ return -1;
+}
+
static int alloc_default_gadget(struct usb_gadget **_gadget)
{
struct usb_gadget *gadget;
struct usb_gadget_strings *strs;
struct usb_configuration **configs;
+ int ret;
gadget = zalloc(sizeof(*gadget));
if (!gadget)
strs[0].lang_code = 0x409;
strs[0].manufacturer = strdup(DEFAULT_MANUFACTURER);
strs[0].product = strdup(DEFAULT_PRODUCT);
- strs[0].serial = strdup(DEFAULT_SERIAL);
+ ret = get_device_serial(&strs[0].serial);
+ if (ret < 0)
+ strs[0].serial = strdup(DEFAULT_SERIAL);
if (!strs[0].manufacturer || !strs[0].product || !strs[0].serial)
goto free_strs;