1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#!/usr/bin/perl
# Reads /proc/bus/usb/devices and selectively lists and/or
# interprets it.
$DEVFILENAME = "/proc/bus/usb/devices";
$PROGNAME = $0;
print "\n";
$TAGS = $ARGV[0]; # save user TAGS
if (length ($TAGS) == 0)
{
}
if (! open (DEVNUM, "<$DEVFILENAME"))
{
print "$PROGNAME: cannot open '$DEVFILENAME'\n";
exit 1;
}
while ($line = <DEVNUM>) # read a text line from DEVNUM
{
# skip all lines except those that begin with "T:" or "D:" or "I:".
if (($line !~ "^T:") && ($line !~ "^I:") && ($line !~ "^D:"))
{
next; # to the next line
}
chomp $line; # remove line endings
# First convert '=' signs to spaces.
$line =~ tr/=/ /;
# and convert all ( and ) to spaces.
$line =~ tr/(/ /;
$line =~ tr/)/ /;
# split the line at spaces.
@fields = split / +/, $line;
if ($line =~ "^T:")
{
# split yields: $level, $port, $devnum, $speed, $maxchild.
$level = @fields [2];
$port = @fields [6];
$devnum = @fields [10];
$speed = @fields [12];
$maxchild = @fields [14];
$devclass = "?";
$intclass = "?";
$driver = "?";
if (($devnum == -1) && ($level == 0))
{
print "/: Dev# -1, root hub/$maxchild ports, $speed Mbps\n";
}
next;
} # end T: line
elsif ($line =~ "^D:")
{ # for D: line
$devclass = @fields [5];
next;
}
else
{ # for I: line
$intclass = @fields [9];
$ifnum = @fields [2];
$driver = @fields [15];
} # end I: line
if ($level > 1)
{
$temp = $level;
while ($temp > 1)
{
print " ";
$temp--;
}
}
print sprintf ("|__ Port# $port: Dev# $devnum, If# $ifnum, Class=$devclass, Ifc=$intclass, Driver=$driver%s, $speed Mbps\n",
($maxchild == 0) ? "" : ("/" . $maxchild . " ports"));
} # end while DEVNUM
close (DEVNUM);
print "\n";
# END.
|