+# mt status output
+# SunOS No Additional Sense
+# FreeBSD Current Driver State: at rest.
+# Linux ONLINE
+# Note Debian has a different mt than the standard Linux version.
+# When no tape is in the drive it waits 2 minutes.
+# When a tape is in the drive, it prints user unfriendly output.
+#
+
+OS=`uname`
+case ${OS} in
+ SunOS)
+ ready="No Additional Sense"
+ ;;
+ FreeBSD)
+ ready="Current Driver State: at rest."
+ ;;
+ Linux)
+ if test -e /etc/debian_version ; then
+ ready="drive status"
+ else
+ ready="ONLINE"
+ fi
+ ;;
+esac
+
+#
+# log whats done
+#
+# to turn on logging, uncomment the following line
+#touch @working_dir@/mtx.log
+#
+dbgfile="@working_dir@/mtx.log"
+debug() {
+ if test -f $dbgfile; then
+ echo "`date +\"%Y%m%d-%H:%M:%S\"` $*" >> $dbgfile
+ fi
+}
+
+
+#
+# Create a temporary file
+#
+make_temp_file() {
+ TMPFILE=`mktemp @working_dir@/mtx.XXXXXXXXXX`
+ if test x${TMPFILE} = x; then
+ TMPFILE="@working_dir@/mtx.$$"
+ if test -f ${TMPFILE}; then
+ echo "Temp file security problem on: ${TMPFILE}"
+ exit 1
+ fi
+ fi
+}
+
+#
+# The purpose of this function to wait a maximum
+# time for the drive. It will
+# return as soon as the drive is ready, or after
+# waiting a maximum of 300 seconds.
+# Note, this is very system dependent, so if you are
+# not running on Linux, you will probably need to
+# re-write it, or at least change the grep target.
+# We've attempted to get the appropriate OS grep targets
+# in the code at the top of this script.
+#
+wait_for_drive() {
+ i=0
+ while [ $i -le 300 ]; do # Wait max 300 seconds
+ if mt -f $1 status 2>&1 | grep "${ready}" >/dev/null 2>&1; then
+ break
+ fi
+ debug "Device $1 - not ready, retrying..."
+ sleep 1
+ i=`expr $i + 1`
+ done
+}
+
+# check parameter count on commandline
+#
+check_parm_count() {
+ pCount=$1
+ pCountNeed=$2
+ if test $pCount -lt $pCountNeed; then
+ echo "usage: mtx-changer ctl-device command [slot archive-device drive-index]"
+ echo " Insufficient number of arguments given."
+ if test $pCount -lt 2; then
+ echo " Mimimum usage is first two arguments ..."
+ else
+ echo " Command expected $pCountNeed arguments"
+ fi
+ exit 1
+ fi
+}
+
+# Check for special cases where only 2 arguments are needed,
+# all others are a minimum of 5
+#
+case $2 in
+ list)
+ check_parm_count $# 2
+ ;;
+ slots)
+ check_parm_count $# 2
+ ;;
+ *)
+ check_parm_count $# 5
+ ;;
+esac
+
+
+# Setup arguments
+ctl=$1
+cmd="$2"
+slot=$3
+device=$4
+drive=$5
+
+debug "Parms: $ctl $cmd $slot $device $drive"
+
+case $cmd in