Viewing contents of file '../idllib/astron/pro/check_tape_drv.pro'
	PRO CHECK_TAPE_DRV, UNIT, LOGICAL_DRIVE, DRIVE, LUN
;+
; NAME        :	
;	CHECK_TAPE_DRV
; PURPOSE     :	
;	Associates tape drive numbers with device files.  *Unix only*
; EXPLANATION :	
;	This is an internal routine to the CDS/SERTS Unix tape handling
;	utilities.  It converts tape drive numbers to actual device
;	names, and checks to make sure that the device file is open.
;
;		**Unix only**
;
; CALLING SEQUENCE:         :	
;	CHECK_TAPE_DRV, UNIT, LOGICAL_DRIVE, DRIVE, LUN
;
; INPUTS      
;	UNIT = Tape unit number.  Tape drives are selected via the UNIX
;		       environment variables "MT1", "MT2", etc.  The desired
;		       tape drive is thus specified by numbers, as in VMS.
;		       Must be from 0 to 9.
;
; OUTPUTS     :	
;	LOGICAL_DRIVE = Name of environment variable pointing to tape
;				drive device file, e.g. "MT0".
;	DRIVE	      = Name of device file, e.g. '/dev/nrst0'.
;	LUN	      = Logical unit number used for reads and writes.
;
; COMMON      :	
;	CHCK_TAPE_DRVS contains array TAPE_LUN, containing logical unit
;		numbers for each tape device, and TAPE_OPEN, which tells
;		whether each device is open or not.
;
; RESTRICTIONS:	
;	The environment variable "MTn", where n corresponds to the
;		variable UNIT, must be defined.  E.g.,
;
;			setenv MT0 /dev/nrst0
;
;		Requires IDL v3.0 or later.
;
; SIDE EFFECTS:	
;	If the device file is not yet open, then the tape is rewound,
;		and a file unit is opened to it.
;
; Category    :	Utilities, I/O, Tape.
;
; Prev. Hist. :	William Thompson, Apr 1991.
;
; Written     :	William Thompson, GSFC, April 1991.
;
; Modified    :	Version 1, William Thompson, GSFC, 21 December 1993.
;			Added keyword /NOSTDIO to OPEN statement.
;			Incorporated into CDS library.
;		Version 2, William Thompson, GSFC, 22 December 1993.
;			Added spawn to "mt rewind".
;		Version 3, W. Landsman GSFC 10-Apr-1996
;			Open for Readonly, if Update access is unavailable
;
; Version     :	Version 3, 10-Apr-1996.
;	Converted to IDL V5.0   W. Landsman   September 1997
;-
;
	COMMON CHCK_TAPE_DRVS, TAPE_LUN, TAPE_OPEN
	ON_ERROR, 2
;
;  Check the number of parameters passed.
;
	IF N_PARAMS() NE 4 THEN MESSAGE,	$
		'Syntax:  CHECK_TAPE, UNIT, LOGICAL_DRIVE, DRIVE, LUN'
;
;  Make sure the common block is initialized.
;
	IF N_ELEMENTS(TAPE_LUN) EQ 0 THEN BEGIN
		TAPE_LUN = LONARR(10)
		TAPE_OPEN = BYTARR(10)
	ENDIF
;
;  Check the value of UNIT.
;
	IF N_ELEMENTS(UNIT) EQ 0 THEN MESSAGE, 'UNIT not defined'
	IF N_ELEMENTS(UNIT) GT 1 THEN MESSAGE, 'UNIT must not be an array'
;
	SZ = SIZE(UNIT)
	TYPE = SZ[SZ[0]+1]
	IF TYPE GT 3 THEN MESSAGE, 'UNIT must be an integer'
	IF (UNIT LT 0) OR (UNIT GT 9) THEN MESSAGE,	$
		'UNIT must be between 0 and 9'
;
;  Form the name of the environment variable, and translate it.
;
	LOGICAL_DRIVE = 'MT' + STRTRIM(UNIT,2)
	DRIVE = GETENV(LOGICAL_DRIVE)
	IF DRIVE EQ '' THEN MESSAGE, 'Drive "' + LOGICAL_DRIVE +	$
		'" not defined'
;
;  Check to see if the device file is already open.  If not, then assign a
;  logical unit number, and open the device file for read and write.  If the
;  drive cannot open for both read and write, then try just read.  But first
;  spawn the Unix rewind command to make sure the device is ready -- otherwise,
;  errors can result.
;
	IF NOT TAPE_OPEN[UNIT] THEN BEGIN
		SPAWN,'mt -f ' + DRIVE + ' rewind'
		GET_LUN, LUN
		OPENU, LUN, DRIVE, /NOSTDIO, ERROR = ERROR 
		IF ERROR NE 0 THEN BEGIN
			OPENR, LUN, DRIVE, /NOSTDIO
			MESSAGE,'Tape Drive Opened for Read Access Only',/INF
                ENDIF
		TAPE_LUN[UNIT] = LUN
		TAPE_OPEN[UNIT] = 1
	END ELSE BEGIN
		LUN = TAPE_LUN[UNIT]
	ENDELSE
;
	RETURN
	END