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# $FreeBSD$ 28# 29 30# 31# Read and decode a SCSI disk's primary or grown defect list. 32# 33 34sub usage 35{ 36 die "usage: scsi-defects raw-device-name [Glist|Plist]\n"; 37} 38 39 40# 41# Main 42# 43 44&usage if $#ARGV < 0 || $#ARGV > 1; 45 46$ENV{'PATH'} = "/bin:/usr/bin:/sbin:/usr/sbin"; 47 48$dev = $ARGV[0]; 49 50# generic device name given? 51if ($dev =~ /^[so]d\d+$/) { $dev = "/dev/r${dev}.ctl"; } 52 53# 54# Select what you want to read. PList include the primary defect list 55# from the factory. GList is grown defects only. 56# 57if ($#ARGV > 0) { 58 if ($ARGV[1] =~ /^[Gg]/) { $glist = 1; $plist = 0; } 59 elsif ($ARGV[1] =~ /^[Pp]/) { $glist = 0; $plist = 1; } 60 else { &usage; } 61} else { 62 $glist = 1; $plist = 0; 63} 64 65open(PIPE, "scsi -f $dev " . 66 "-c '{ Op code} 37 0 0:3 v:1 v:1 5:3 0 0 0 0 4:i2 0' $plist $glist " . 67 "-i 4 '{ stuff } *i2 { Defect list length } i2' |") || 68 die "Cannot pipe to scsi(8)\n"; 69chop($amnt = <PIPE>); 70close(PIPE); 71 72if ($amnt == 0) { 73 print "There are no defects (in this list).\n"; 74 exit 0; 75} 76 77print "There are " . $amnt / 8 . " defects in this list.\n"; 78 79$amnt += 4; 80 81open(PIPE, "scsi -f $dev " . 82 "-c '{ Op code} 37 0 0:3 v:1 v:1 5:3 0 0 0 0 v:i2 0' $plist $glist " . 83 "$amnt -i $amnt - |") || 84 die "Cannot pipe to scsi(8)\n"; 85 86read(PIPE, $buf, 4); # defect list header 87 88print "cylinder head sector\n"; 89 90while(read(PIPE, $buf, 8)) { 91 ($cylhi, $cyllo, $head, $sec) = unpack("CnCN", $buf); 92 printf "%8u %4u %6u\n", $cylhi*65536+$cyllo, $head, $sec; 93} 94close(PIPE); 95