The structure returned by USB_DEVICEINFO has the vendor/device strings
UTF-8 encoded now. We can't simply print this to a terminal, so convert it to the current codeset first.
This commit is contained in:
parent
1921d00aaf
commit
6d0b625409
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: usbdevs.c,v 1.25 2008/04/28 20:24:17 martin Exp $ */
|
/* $NetBSD: usbdevs.c,v 1.26 2010/02/02 16:25:30 drochner Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||||
|
@ -37,6 +37,9 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <langinfo.h>
|
||||||
|
#include <iconv.h>
|
||||||
#include <dev/usb/usb.h>
|
#include <dev/usb/usb.h>
|
||||||
|
|
||||||
#define USBDEV "/dev/usb"
|
#define USBDEV "/dev/usb"
|
||||||
|
@ -61,6 +64,34 @@ usage()
|
||||||
|
|
||||||
char done[USB_MAX_DEVICES];
|
char done[USB_MAX_DEVICES];
|
||||||
int indent;
|
int indent;
|
||||||
|
#define MAXLEN USB_MAX_ENCODED_STRING_LEN /* assume can't grow over UTF-8 */
|
||||||
|
char vendor[MAXLEN], product[MAXLEN], serial[MAXLEN];
|
||||||
|
|
||||||
|
static void
|
||||||
|
u2t(const char *utf8str, char *termstr)
|
||||||
|
{
|
||||||
|
static iconv_t ic;
|
||||||
|
static int iconv_inited = 0;
|
||||||
|
size_t insz, outsz, icres;
|
||||||
|
|
||||||
|
if (!iconv_inited) {
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
ic = iconv_open(nl_langinfo(CODESET), "UTF-8");
|
||||||
|
if (ic == (iconv_t)-1)
|
||||||
|
ic = iconv_open("ASCII", "UTF-8"); /* g.c.d. */
|
||||||
|
iconv_inited = 1;
|
||||||
|
}
|
||||||
|
if (ic != (iconv_t)-1) {
|
||||||
|
insz = strlen(utf8str);
|
||||||
|
outsz = MAXLEN - 1;
|
||||||
|
icres = iconv(ic, &utf8str, &insz, &termstr, &outsz);
|
||||||
|
if (icres != (size_t)-1) {
|
||||||
|
*termstr = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
strcpy(termstr, "(invalid)");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
usbdev(int f, int a, int rec)
|
usbdev(int f, int a, int rec)
|
||||||
|
@ -93,14 +124,17 @@ usbdev(int f, int a, int rec)
|
||||||
else
|
else
|
||||||
printf("unconfigured, ");
|
printf("unconfigured, ");
|
||||||
}
|
}
|
||||||
|
u2t(di.udi_product, product);
|
||||||
|
u2t(di.udi_vendor, vendor);
|
||||||
|
u2t(di.udi_serial, serial);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf("%s(0x%04x), %s(0x%04x), rev %s",
|
printf("%s(0x%04x), %s(0x%04x), rev %s",
|
||||||
di.udi_product, di.udi_productNo,
|
product, di.udi_productNo,
|
||||||
di.udi_vendor, di.udi_vendorNo, di.udi_release);
|
vendor, di.udi_vendorNo, di.udi_release);
|
||||||
if (di.udi_serial[0])
|
if (di.udi_serial[0])
|
||||||
printf(", serial %s", di.udi_serial);
|
printf(", serial %s", serial);
|
||||||
} else
|
} else
|
||||||
printf("%s, %s", di.udi_product, di.udi_vendor);
|
printf("%s, %s", product, vendor);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (showdevs) {
|
if (showdevs) {
|
||||||
for (i = 0; i < USB_MAX_DEVNAMES; i++)
|
for (i = 0; i < USB_MAX_DEVNAMES; i++)
|
||||||
|
|
Loading…
Reference in New Issue