#!/bin/sh
#
# Copyright (C) 2000-2020 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# Bacula interface to get worm status of tape
#
#  isworm %l (control device name)
#
# Typical output:
# sdparm --page=0x1D -f /dev/sg0
#    /dev/st0: HP        Ultrium 5-SCSI    I5AW  [tape]
# Medium configuration (SSC) mode page:
#   WORMM       1  [cha: n, def:  1, sav:  1]
#   WMLR        1  [cha: n, def:  1, sav:  1]
#   WMFR        2  [cha: n, def:  2, sav:  2]
#
# Where WORMM is worm mode
#       WMLR is worm mode label restrictions
#          0 - No blocks can be overwritten
#          1 - Some types of format labels may not be overwritten
#          2 - All format labels can be overwritten
#       WMFR is worm mode filemark restrictions
#          0-1  - Reserved
#          2    - Any number of filemarks immediately preceding EOD can be
#                 overwritten except file mark closest to BOP (beginning of
#                 partition).
#          3    - Any number of filemarks immediately preceding the EOD
#                 can be overwritten
#          4-FF - Reserved
#

if [ x$1 = x ] ; then
   echo "First argument missing. Must be device control name."
   exit 1
fi

sdparm=`which sdparm`
if [ x${sdparm} = x ] ; then
   echo "sdparm program not found, but is required."
   exit 0
fi

#
# This should be the correct way to determine if the tape is WORM
#   but it does not work for mhvtl.  Comment out the next 5 lines
#   and the code that follows will detect correctly on mhtvl.
#
worm=`$sdparm --page=0x1D -f $1 |grep " *WORMM"|cut -b12-16|sed "s:^ *::"`
if [ $? = 0 ] ; then
   echo $worm
   exit 0
fi

tapeinfo=`which tapeinfo`
if [ x${tapeinfo} = x ] ; then
   echo "tapeinfo program not found, but is required."
   exit 1
fi

#
# Unfortunately IBM and HP handle the Medium Type differently,
#  so we detect the vendor and get the appropriate Worm flag.
#
vendor=`$tapeinfo -f $1|grep "^Vendor ID:"|cut -b13-15`
if [ x$vendor = xHP ] ; then
   worm=`$tapeinfo -f $1|grep "^Medium Type: 0x"|cut -b16-16`
   echo $worm
   exit 0
fi

if [ x$vendor = xIBM ] ; then
   worm=`$tapeinfo -f $1|grep "^Medium Type: 0x"|cut -b17-17`
   if [ x$worm = xc ]; then
      echo "1"
      exit 0
   fi
   if [ x$worm = xC ]; then
      echo "1"
      exit 0
   fi
fi
echo "0"
exit 0
