#!/bin/tclsh
#
#	Date:	November 8th, 1999
#	Author:	Robin T. Miller
#
#	Description:	[ My first Tcl program, yea! ]
#
#	This script is used for testing CD-ROM's using the IOT Test Disc.
#
# Arguments:
#	1	The device name.
#	2	The log file name.
#	3	The block limit.
#	4	The block size(s).
#	5	The pass count.
#	6	Enable debug flag.
#

set PROGRAM [file tail $argv0]

if {$argc < 1} {
    puts stderr "Usage: $PROGRAM device \[ log_file data_limit block_sizes pass_count debug \]"
    puts stderr "Example: $PROGRAM rrz4c rrd42.log 250m &"
    exit 1
}

#
# Local Definitions:
#
set END_OF_FILE		254
set FAILURE		-1
set SUCCESS		0
set TRUE		1
set FALSE		0

#
# Local Variables:
#
set DebugFlag		$FALSE
set ErrorCount		0
set ExitStatus		$SUCCESS
set ExitOnError		$FALSE
set NoisyFlag		$TRUE
set StartTime		[clock seconds]
set DateString		[clock format [clock seconds] -format "%b%d,%Y"]

#
# Grab/construct the device name first.
#
set Device [lindex $argv 0]
if { ![string match {/dev*} $Device] } {
    set Device "/dev/$Device"
}
incr argc -1

#
# Set Default Parameters:
#
set DEF_BLOCK_SIZES	{128k 64k 32k 16k 5k 2k 1b}
set DEF_DATA_LIMIT	{limit=650m}
set DEF_DEBUG_FLAG	$FALSE
set DEF_DEBUG_OPTS	{enable=dump}
set DEF_LOG_FILE	"$PROGRAM-[file tail $Device]-$DateString.log"
set DEF_PASS_COUNT	1

#
# Parse Remaining Arguments:
#
if { $argc } {
    set LogFile [lindex $argv 1]
    incr argc -1
}

if { $argc } {
    set DataLimit "limit=[lindex $argv 2]"
    incr argc -1
}

if { $argc } {
    set BlockSizes "[lindex $argv 3]"
    incr argc -1
}

if { $argc } {
    set PassCount [lindex $argv 4]
    incr argc -1
}

if { $argc } {
    set DebugFlag $TRUE
    set DebugOpts "enable=[lindex $argv 5]"
    incr argc -1
}

#
# Set Variables NOT Specified by the User:
#
if { ![info exists BlockSizes] || ![string length $BlockSizes] } {
    set BlockSizes $DEF_BLOCK_SIZES
}

if { ![info exists DataLimit] || ![string length $DataLimit] } {
    set DataLimit $DEF_DATA_LIMIT
}

if { ![info exists DebugFlag] }		{ set DebugFlag  $DEF_DEBUG_FLAG }
if { ![info exists DebugOpts] }		{ set DebugOpts  $DEF_DEBUG_OPTS }

if { ![info exists LogFile] || ![string length $LogFile] } {
    set LogFile $DEF_LOG_FILE
}

if { ![info exists PassCount] || ![string length $PassCount] } {
     set PassCount $DEF_PASS_COUNT
}

if { [string compare $tcl_platform(os) "OSF1"] == 0 } {
    set DT_OPTS "aios=4"
} else {
    set DT_OPTS "procs=4"
}

if [file exists $LogFile] {
    catch {file delete $LogFile}
}

set iotype sequential

foreach bs $BlockSizes {
    if [catch {exec dt if=$Device align=rotate bs=$bs $DataLimit $DebugOpts \
	iotype=$iotype log=$LogFile pattern=iot passes=$PassCount $DT_OPTS} result] {
	if { $DebugFlag } {
#	    puts stderr "$PROGRAM: Command failed with status = '$result'"
	    puts stderr "$PROGRAM: $errorInfo"
	    puts stderr "$PROGRAM: $errorCode"
	}
	set errno [lindex $errorCode 2]
	if { $errno == $END_OF_FILE } {
	    # end of file is Ok
	} else {
	    incr ErrorCount
	    if { $ExitOnError } break
	}
    } else {
        # success!
    }
    #
    # Alternate between sequential and random I/O.
    #
    if { [string compare $iotype "sequential"] == 0 } {
	set iotype random
    } else {
	set iotype sequential
    }
}

if { $ErrorCount } {
    puts "$PROGRAM: Encountered $ErrorCount errors, please review $LogFile!" 
    set ExitStatus $FAILURE
}

if { $NoisyFlag } {
    puts ""
    puts "        Script Name: $PROGRAM"
    puts "      Device Tested: $Device"
    puts "    Errors Detected: $ErrorCount"
    puts "          Host Name: [info hostname]"
    puts "         Start Time: [clock format $StartTime]"
    puts "           End Time: [clock format [clock seconds]]"
    puts ""
}

exit $ExitStatus


syntax highlighted by Code2HTML, v. 0.9.1