#!/bin/sh
progname=$(basename $0) || exit
gotsig=
for sig in 1 2 3 15
do
	trap 'gotsig='"$sig" "$sig"
done

mytmpdir=$(mktemp -d --tmpdir "$progname".XXXXXXXXXX) || exit
trap 'rm -rf "$mytmpdir"' 0
for sig in 1 2 3 15
do
	trap 'trap - 0; rm -rf "$mytmpdir" && exit '`expr "$sig" + 128` "$sig"
done
[ x"$gotsig" = x ] || kill -"$gotsig" "$$"

lsusb -v > "$mytmpdir"/"$progname".00
echo -n "Connect USB device, then press <RETURN> when ready to continue: "
read x; unset x
lsusb -v > "$mytmpdir"/"$progname".01

diff \
"$mytmpdir"/"$progname".00 \
"$mytmpdir"/"$progname".01 |

perl -e '
	$^W=1;
	use strict;

	my $idVendor_hex=q();
	my $idVendor_name=q();
	my $idProduct_hex=q();
	my $iProduct=q();
	my $iSerial=q();
	while(<>){
		s/^> //o or next;
		chomp;
		s/[ \t]{2,}/ /go;
		s/^ +//o;
		s/ +$//o;
		if(/idVendor +0x([[:xdigit:]]{4})(?: +([^ ](?:.*[^ ])?))?$/o){
			$idVendor_hex=$1;
			$idVendor_name=$2 if defined($2);
		}elsif(/idProduct +0x([[:xdigit:]]{4})(?: +(?:[^ ](?:.*[^ ])?))?$/o){
			$idProduct_hex=$1;
		}elsif(/iProduct +\d+(?: +([^ ](?:.*[^ ])?))$/o){
			$iProduct=$1 if defined($1);
		}elsif(/iSerial +\d+(?: +([^ ]+))$/o){
			$iSerial=$1 if defined($1);
		};
	};
	print(
		join(
			"\n",
			#USB identification:
			q(USB identification:),

			#ID 05dc:a815 Lexar Media, Inc.
			q(ID ) .
			$idVendor_hex .
			q(:) .
			$idProduct_hex .
			(
				$idVendor_name ne q()
				?
					q( ) . $idVendor_name
				:
					q()
			),

			#Vendor 0x05dc Lexar Media, Inc.
			q(Vendor 0x) . $idVendor_hex .
			(
				$idVendor_name ne q()
				?
					q( ) . $idVendor_name
				:
					q()
			),

			#Product 0xa815 USB Flash Drive
			q(Product 0x) .
			$idProduct_hex .
			(
				$iProduct ne q()
				?
					q( ) . $iProduct
				:
					q()
			),

			#Serial AA4E8BRPOSBFCDPM
			q(Serial) .
			(
				$iSerial ne q()
				?
					q( ) . $iSerial
				:
					q()
			),
		),
		"\n",
	);
'

#USB identification:
#ID 05dc:a815 Lexar Media, Inc.
#Vendor 0x05dc Lexar Media, Inc.
#Product 0xa815 USB Flash Drive
#Serial AA4E8BRPOSBFCDPM
