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