Module Name: src Committed By: drochner Date: Tue Feb 2 16:25:31 UTC 2010
Modified Files: src/usr.sbin/usbdevs: usbdevs.c Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/usr.sbin/usbdevs/usbdevs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/usbdevs/usbdevs.c diff -u src/usr.sbin/usbdevs/usbdevs.c:1.25 src/usr.sbin/usbdevs/usbdevs.c:1.26 --- src/usr.sbin/usbdevs/usbdevs.c:1.25 Mon Apr 28 20:24:17 2008 +++ src/usr.sbin/usbdevs/usbdevs.c Tue Feb 2 16:25:30 2010 @@ -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. @@ -37,6 +37,9 @@ #include <unistd.h> #include <err.h> #include <errno.h> +#include <locale.h> +#include <langinfo.h> +#include <iconv.h> #include <dev/usb/usb.h> #define USBDEV "/dev/usb" @@ -61,6 +64,34 @@ char done[USB_MAX_DEVICES]; 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 usbdev(int f, int a, int rec) @@ -93,14 +124,17 @@ else printf("unconfigured, "); } + u2t(di.udi_product, product); + u2t(di.udi_vendor, vendor); + u2t(di.udi_serial, serial); if (verbose) { printf("%s(0x%04x), %s(0x%04x), rev %s", - di.udi_product, di.udi_productNo, - di.udi_vendor, di.udi_vendorNo, di.udi_release); + product, di.udi_productNo, + vendor, di.udi_vendorNo, di.udi_release); if (di.udi_serial[0]) - printf(", serial %s", di.udi_serial); + printf(", serial %s", serial); } else - printf("%s, %s", di.udi_product, di.udi_vendor); + printf("%s, %s", product, vendor); printf("\n"); if (showdevs) { for (i = 0; i < USB_MAX_DEVNAMES; i++)