1#!/usr/bin/perl 2# 3# Copyright (C) 1997 4# Peter Dufault, Joerg Wunsch. All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25# SUCH DAMAGE. 26# 27# 28 29# 30# Read and decode a SCSI disk's primary or grown defect list. 31# 32 33sub usage 34{ 35 die "usage: scsi-defects raw-device-name [Glist|Plist]\n"; 36} 37 38 39# 40# Main 41# 42 43&usage if $#ARGV < 0 || $#ARGV > 1; 44 45$ENV{'PATH'} = "/bin:/usr/bin:/sbin:/usr/sbin"; 46 47$dev = $ARGV[0]; 48 49# generic device name given? 50if ($dev =~ /^[so]d\d+$/) { $dev = "/dev/r${dev}.ctl"; } 51 52# 53# Select what you want to read. PList include the primary defect list 54# from the factory. GList is grown defects only. 55# 56if ($#ARGV > 0) { 57 if ($ARGV[1] =~ /^[Gg]/) { $glist = 1; $plist = 0; } 58 elsif ($ARGV[1] =~ /^[Pp]/) { $glist = 0; $plist = 1; } 59 else { &usage; } 60} else { 61 $glist = 1; $plist = 0; 62} 63 64open(PIPE, "scsi -f $dev " . 65 "-c '{ Op code} 37 0 0:3 v:1 v:1 5:3 0 0 0 0 4:i2 0' $plist $glist " . 66 "-i 4 '{ stuff } *i2 { Defect list length } i2' |") || 67 die "Cannot pipe to scsi(8)\n"; 68chop($amnt = <PIPE>); 69close(PIPE); 70 71if ($amnt == 0) { 72 print "There are no defects (in this list).\n"; 73 exit 0; 74} 75 76print "There are " . $amnt / 8 . " defects in this list.\n"; 77 78$amnt += 4; 79 80open(PIPE, "scsi -f $dev " . 81 "-c '{ Op code} 37 0 0:3 v:1 v:1 5:3 0 0 0 0 v:i2 0' $plist $glist " . 82 "$amnt -i $amnt - |") || 83 die "Cannot pipe to scsi(8)\n"; 84 85read(PIPE, $buf, 4); # defect list header 86 87print "cylinder head sector\n"; 88 89while(read(PIPE, $buf, 8)) { 90 ($cylhi, $cyllo, $head, $sec) = unpack("CnCN", $buf); 91 printf "%8u %4u %6u\n", $cylhi*65536+$cyllo, $head, $sec; 92} 93close(PIPE); 94