From:	ADVAX::"mcnc!pucc.PRINCETON.EDU!moeller%gwdgv1.dnet.gwdg.de" "GWDGV1::MOELLER" 22-JAN-1991 16:57:09.84
To:	Arisia::Everhart, jim@mango.rsmas.miami.edu, R602MS5U@VB.CC.CMU.EDU, PALTER@UBVMS.BITNET, johnsond@calstate.bitnet, FOX@MSUNSCL.BITNET, awpsys@ultb.isc.rit.edu, ACCESS@KRDC.INT.Alcan.CA, moeller@dgogwdg5
CC:	
Subj:	VMS 5.4 ZTDRIVER part 1 of 4

Received: by ADVAX.DECnet (utk-mail11 v1.5) ; Tue, 22 Jan 91 16:55:14 EST
Received:  from mcnc by ge-dab.GE.COM (5.61/GE-DAB 1.15) with UUCP
	id AA14535 for ; Tue, 22 Jan 91 09:04:44 -0500
Received: from pucc.PRINCETON.EDU by mcnc.mcnc.org (5.59/MCNC/6-11-90)
	id AA09991; Tue, 22 Jan 91 06:03:57 -0500
	for Arisia.dnet.ge.com!Everhart
Message-Id: <9101221103.AA09991@mcnc.mcnc.org>
Received: from DGOGWDG1.BITNET by pucc.PRINCETON.EDU (IBM VM SMTP R1.2.2MX) with BSMTP id 6230; Tue, 22 Jan 91 06:04:11 EST
Received: from dnet.gwdg.de by DGOGWDG1.BITNET (Mailer R2.07) with BSMTP id
 7529; Mon, 21 Jan 91 22:18:00 MEZ
Date:    Mon, 21 Jan 1991 22:17:33 +0100
From: "GWDGV1::MOELLER" <mcnc!pucc.PRINCETON.EDU!moeller%gwdgv1.dnet.gwdg.de>
To: Arisia::Everhart, jim@mango.rsmas.miami.edu, R602MS5U@VB.CC.CMU.EDU,
        PALTER@UBVMS.BITNET, johnsond@calstate.bitnet, FOX@MSUNSCL.BITNET,
        awpsys@ultb.isc.rit.edu, ACCESS@KRDC.INT.Alcan.CA, moeller@dgogwdg5
Subject: VMS 5.4 ZTDRIVER part 1 of 4
 
$! ................... Cut between dotted lines and save. ...................
$!...........................................................................
$! VAX/VMS archive file created by VMS_SHARE V06.10 7-FEB-1989.
$!
$! VMS_SHARE was written by James Gray (Gray:OSBUSouth@Xerox.COM) from
$! VMS_SHAR by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au).
$!
$! To unpack, simply save, concatinate all parts into one file and
$! execute (@) that file.
$!
$! This archive was created by user MOELLER
$! on 21-JAN-1991 21:31:03.25.
$!
$! ATTENTION: To keep each article below 72 blocks (36864 bytes), this
$!            program has been transmitted in 4 parts.  You should
$!            concatenate ALL parts to ONE file and execute (@) that file.
$!
$! It contains the following 15 files:
$!        FEHLER.MAR
$!        IODEF.H
$!        MTDEF.H
$!        REDIRECT.C
$!        UCBDEF.H
$!        ZT.WRITEUP
$!        ZT1.C
$!        ZT1T.C
$!        ZT2.C
$!        ZTDEF.MAR
$!        ZTDRIVER.MAR
$!        ZTDRIVER.OPT
$!        ZTNS.H
$!        ZTNS2.C
$!        ZTSERVER.MAR
$!
$!============================================================================
$ SET SYMBOL/SCOPE=( NOLOCAL, NOGLOBAL )
$ VERSION = F$GETSYI( "VERSION" )
$ IF VERSION .GES "V4.4" THEN GOTO VERSION_OK
$ WRITE SYS$OUTPUT "You are running VMS ''VERSION'; ", -
    "VMS_SHARE V06.10 7-FEB-1989 requires VMS V4.4 or higher."
$ EXIT 44 ! SS$_ABORT
$VERSION_OK:
$ GOTO START
$!
$UNPACK_FILE:
$ WRITE SYS$OUTPUT "Creating ''FILE_IS'"
$ DEFINE/USER_MODE SYS$OUTPUT NL:
$ EDIT/TPU/COMMAND=SYS$INPUT/NODISPLAY/OUTPUT='FILE_IS'/NOSECTION -
    VMS_SHARE_DUMMY.DUMMY
b_part := CREATE_BUFFER( "{Part}", GET_INFO( COMMAND_LINE, "file_name" ) )
; s_file_spec := GET_INFO( COMMAND_LINE, "output_file" ); SET( OUTPUT_FILE
, b_part, s_file_spec ); b_errors := CREATE_BUFFER( "{Errors}" ); i_errors
:= 0; pat_beg_1 := ANCHOR & "-+-+-+ Beginning"; pat_beg_2 := LINE_BEGIN
& "+-+-+-+ Beginning"; pat_end := ANCHOR & "+-+-+-+-+ End"; POSITION
( BEGINNING_OF( b_part ) ); LOOP EXITIF SEARCH( SPAN( ' ' )@r_trail
& LINE_END, FORWARD) = 0; POSITION( r_trail ); ERASE( r_trail ); ENDLOOP
; POSITION( BEGINNING_OF( b_part ) ); i_append_line := 0; LOOP EXITIF MARK
( NONE ) = END_OF( b_part ); s_x := ERASE_CHARACTER( 1 )
; IF s_x = '+' THEN r_skip := SEARCH( pat_beg_1, FORWARD, EXACT ); IF r_skip
<> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ERASE_LINE; ENDIF
; ENDIF; IF s_x = '-' THEN r_skip := SEARCH( pat_end, FORWARD, EXACT )
; IF r_skip <> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); m_skip
:= MARK( NONE ); r_skip := SEARCH( pat_beg_2, FORWARD, EXACT ); IF r_skip
<> 0 THEN POSITION( END_OF( r_skip ) ); MOVE_HORIZONTAL( -CURRENT_OFFSET )
; MOVE_VERTICAL( 1 ); MOVE_HORIZONTAL( -1 ); ELSE POSITION( END_OF( b_part )
); ENDIF; ERASE( CREATE_RANGE( m_skip, MARK( NONE ), NONE ) ); ENDIF; ENDIF
; IF s_x = 'V' THEN s_x := ''; IF i_append_line <> 0 THEN APPEND_LINE
; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF; i_append_line := 1
; MOVE_VERTICAL( 1 ); ENDIF; IF s_x = 'X' THEN s_x := ''; IF i_append_line
<> 0 THEN APPEND_LINE; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF
; i_append_line := 0; MOVE_VERTICAL( 1 ); ENDIF; IF s_x <> '' THEN i_errors
:= i_errors + 1; s_text := CURRENT_LINE; POSITION( b_errors ); COPY_TEXT
( "The following line could not be unpacked properly:" ); SPLIT_LINE
; COPY_TEXT( s_x ); COPY_TEXT( s_text ); POSITION( b_part ); MOVE_VERTICAL
( 1 ); ENDIF; ENDLOOP; POSITION( BEGINNING_OF( b_part ) ); LOOP r_x := SEARCH
( "`", FORWARD, EXACT ); EXITIF r_x = 0; POSITION( r_x ); ERASE_CHARACTER( 1
); COPY_TEXT( ASCII( INT( ERASE_CHARACTER( 3 ) ) ) ); ENDLOOP
; IF i_errors = 0 THEN SET( NO_WRITE, b_errors, ON ); ELSE POSITION
( BEGINNING_OF( b_errors ) ); COPY_TEXT( FAO
( "The following !UL errors were detected while unpacking !AS", i_errors
, s_file_spec ) ); SPLIT_LINE; SET( OUTPUT_FILE, b_errors, "SYS$COMMAND" )
; ENDIF; EXIT;
$ DELETE VMS_SHARE_DUMMY.DUMMY;*
$ CHECKSUM 'FILE_IS
$ WRITE SYS$OUTPUT " CHECKSUM ", -
  F$ELEMENT( CHECKSUM_IS .EQ. CHECKSUM$CHECKSUM, ",", "failed!!,passed." )
$ RETURN
$!
$START:
$ FILE_IS = "FEHLER.MAR"
$ CHECKSUM_IS = 87885753
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X`009.title`009FEHLER`009abort a program with message & status
X;
X;`009w.j.m. ??? (FORTRAN version)
X;`009change apr 85: do not rely on own msg definition,
X;`009`009`009use "shared" msg instead.
X;`009`009`009disadvantage: unwinding become unwieldy,
X;`009`009`009`009message is output in any case
X;
X;`009entry:`009FEHLER(string)
X;
X;
X;`009note: this program had to written in MACRO to allow
X;`009`009access to the address of the stringdescriptor
X;`009`009passed by the calling routine!
X;`009      the FORTRAN program included does not work since
X;`009      literal strings are passed to it without descriptor!!
X;
X;
X;*****
X;
X`009.psect`009$LOCAL,pic,usr,con,rel,lcl,noshr,noexe,rd,wrt,novec
X;
Xfehler_name:`009.ascid`009"FEHLER"`009;.ADDRESS is not (PIC,SHR) !!
X;
X;
X`009.psect`009$CODE,pic,usr,con,rel,lcl,shr,exe,rd,nowrt,novec
X;
X`009.entry`009fehler,`094m<>
X;
X;=`009`009subroutine fehler(strdsc)
X;=`009`009implicit none
X;=`009`009integer*4 strdsc(2)`009! actual argument is character*(*) !
X;=`009c
X;=`009`009integer*4 msgvec(4)
X;=`009`009external shr$_text
X;=`009c
X;
Xmsgvec=-<4*4>`009;(fp)
X;
X`009moval`009msgvec(fp),sp
X;
X;=`009c
X;=`009`009msgvec(1)=3
X;=`009`009msgvec(2)=(%loc(shr$_text).and.'0000fff8'x) + 4 + '08000000'x
X;=`009c`009`009! # force fatal status
X;=`009c`009`009! # fake (user) facility other than "ss$_"
X;=`009c`009`009!   to allow for $fao argument
X;=`009`009msgvec(3)=1`009`009`009! # fao
X;=`009`009msgvec(4)=%loc(strdsc)`009`009! need %loc of descriptor here
X;
X`009movl`009#3,msgvec(fp)
X`009movl`009#<<shr$_text&`094x0000fff8>!`094x08000004>,msgvec+<1*4>(fp)
X`009movl`009#1,msgvec+<2*4>(fp)
X`009moval`009@1*4(ap),msgvec+<3*4>(fp)
X;
X;=`009`009call sys$putmsg(msgvec,,'FEHLER',)
X;
X`009$putmsg_s`009msgvec=msgvec(fp),-
X`009`009`009facnam=fehler_name
X;
X;=`009`009call lib$stop(%val(msgvec(2).or.'10000000'x))`009! no more output,
X;=`009c`009`009`009`009`009`009`009! but ggf. trace
X;
X`009bisl3`009msgvec+<1*4>(fp),#`094x10000000,-(sp)
X`009calls`009#1,g`094lib$stop
X;
X;=`009`009end
X;
X`009ret
X;
X`009.end
$ GOSUB UNPACK_FILE
 
$ FILE_IS = "IODEF.H"
$ CHECKSUM_IS = 242363424
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X/*
X * definitions created by C_GBLINI at 28-DEC-1990 13:48:30.59
X */
X#define`009IO$_NOP`0090
X#define`009IO$_UNLOAD`0091
X#define`009IO$_LOADMCODE`0091
X#define`009IO$_SEEK`0092
X#define`009IO$_SPACEFILE`0092
X#define`009IO$_STARTMPROC`0092
X#define`009IO$_RECAL`0093
X#define`009IO$_DUPLEX`0093
X#define`009IO$_STOP`0093
X#define`009IO$_DRVCLR`0094
X#define`009IO$_INITIALIZE`0094
X#define`009IO$_MIMIC`0094
X#define`009IO$_RELEASE`0095
X#define`009IO$_SETCLOCKP`0095
X#define`009IO$_OFFSET`0096
X#define`009IO$_ERASETAPE`0096
X#define`009IO$_STARTDATAP`0096
X#define`009IO$_RETCENTER`0097
X#define`009IO$_QSTOP`0097
X#define`009IO$_PACKACK`0098
X#define`009IO$_SEARCH`0099
X#define`009IO$_SPACERECORD`0099
X#define`009IO$_READRCT`0099
X#define`009IO$_WRITECHECK`00910
X#define`009IO$_WRITEPBLK`00911
X#define`009IO$_READPBLK`00912
X#define`009IO$_WRITEHEAD`00913
X#define`009IO$_RDSTATS`00913
X#define`009IO$_CRESHAD`00913
X#define`009IO$_READHEAD`00914
X#define`009IO$_ADDSHAD`00914
X#define`009IO$_WRITETRACKD`00915
X#define`009IO$_COPYSHAD`00915
X#define`009IO$_READTRACKD`00916
X#define`009IO$_REMSHAD`00916
X#define`009IO$_AVAILABLE`00917
X#define`009IO$_SETPRFPATH`00918
X#define`009IO$_DISPLAY`00919
X#define`009IO$_DSE`00921
X#define`009IO$_REREADN`00922
X#define`009IO$_REREADP`00923
X#define`009IO$_WRITERET`00924
X#define`009IO$_WRITECHECKH`00924
X#define`009IO$_READPRESET`00925
X#define`009IO$_STARTSPNDL`00925
X#define`009IO$_SETCHAR`00926
X#define`009IO$_SENSECHAR`00927
X#define`009IO$_WRITEMARK`00928
X#define`009IO$_COPYMEM`00928
X#define`009IO$_WRTTMKR`00929
X#define`009IO$_DIAGNOSE`00929
X#define`009IO$_SHADMV`00929
X#define`009IO$_FORMAT`00930
X#define`009IO$_CLEAN`00930
X#define`009IO$_PHYSICAL`00931
X#define`009IO$_WRITELBLK`00932
X#define`009IO$_READLBLK`00933
X#define`009IO$_REWINDOFF`00934
X#define`009IO$_READRCTL`00934
X#define`009IO$_SETMODE`00935
X#define`009IO$_REWIND`00936
X#define`009IO$_SKIPFILE`00937
X#define`009IO$_SKIPRECORD`00938
X#define`009IO$_SENSEMODE`00939
X#define`009IO$_WRITEOF`00940
X#define`009IO$_TTY_PORT`00941
X#define`009IO$_FREECAP`00941
X#define`009IO$_FLUSH`00942
X#define`009IO$_READLCHUNK`00943
X#define`009IO$_WRITELCHUNK`00944
X#define`009IO$_LOGICAL`00947
X#define`009IO$_WRITEVBLK`00948
X#define`009IO$_READVBLK`00949
X#define`009IO$_ACCESS`00950
X#define`009IO$_CREATE`00951
X#define`009IO$_DEACCESS`00952
X#define`009IO$_DELETE`00953
X#define`009IO$_MODIFY`00954
X#define`009IO$_NETCONTROL`00954
X#define`009IO$_READPROMPT`00955
X#define`009IO$_SETCLOCK`00955
X#define`009IO$_ACPCONTROL`00956
X#define`009IO$_STARTDATA`00956
X#define`009IO$_MOUNT`00957
X#define`009IO$_TTYREADALL`00958
X#define`009IO$_TTYREADPALL`00959
X#define`009IO$_CONINTREAD`00960
X#define`009IO$_CONINTWRITE`00961
X#define`009IO$_VIRTUAL`00963
X#define`009IO$M_FCODE`00963
X#define`009IO$M_FMODIFIERS`00965472
X#define`009IO$M_INHERLOG`0092048
X#define`009IO$M_ERASE`0091024
X#define`009IO$M_ENCRYPT`0098192
X#define`009IO$M_DATACHECK`00916384
X#define`009IO$M_INHRETRY`00932768
X#define`009IO$M_INHSEEK`0094096
X#define`009IO$M_REVERSE`00964
X#define`009IO$M_NOWAIT`009128
X#define`009IO$M_INHEXTGAP`0094096
X#define`009IO$M_MSCPMODIFS`009256
X#define`009IO$M_SHADOW`00964
X#define`009IO$M_LOCATE`009128
X#define`009IO$M_MSCP_FORMAT`00964
X#define`009IO$M_ALLHOSTS`00964
X#define`009IO$M_DISSOLVE`009128
X#define`009IO$M_NOCLEANUP`009256
X#define`009IO$M_SPINDOWN`00964
X#define`009IO$M_FORCEPATH`00964
X#define`009IO$M_STEPOVER`00964
X#define`009IO$M_COPYOP`009256
X#define`009IO$M_EXISTS`00964
X#define`009IO$M_CBS`009128
X#define`009IO$M_BOOTING`009256
X#define`009IO$M_VUEX_FC`009512
X#define`009IO$M_COMMOD`00964
X#define`009IO$M_MOVETRACKD`009128
X#define`009IO$M_DIAGNOSTIC`009256
X#define`009IO$M_SKPSECINH`009512
X#define`009IO$M_DELDATA`00964
X#define`009IO$M_NOMRSP`00964
X#define`009IO$M_SWAP`009256
X#define`009IO$M_OPPOSITE`009512
X#define`009IO$M_CLSEREXCP`009512
X#define`009IO$M_CHUNKDIAG`00964
X#define`009IO$M_TBC`0091024
X#define`009IO$M_ENAREP`00964
X#define`009IO$M_ACCESS`00964
X#define`009IO$M_CREATE`009128
X#define`009IO$M_DELETE`009256
X#define`009IO$M_MOUNT`009512
X#define`009IO$M_DMOUNT`0091024
X#define`009IO$M_REMOUNT`0092048
X#define`009IO$M_MOVEFILE`0094096
X#define`009IO$M_BINARY`00964
X#define`009IO$M_PACKED`009128
X#define`009IO$M_NOW`00964
X#define`009IO$M_READATTN`009128
X#define`009IO$M_WRTATTN`009256
X#define`009IO$M_SETPROT`009512
X#define`009IO$M_NORSWAIT`0091024
X#define`009IO$M_NOECHO`00964
X#define`009IO$M_TIMED`009128
X#define`009IO$M_CVTLOW`009256
X#define`009IO$M_NOFILTR`009512
X#define`009IO$M_DSABLMBX`0091024
X#define`009IO$M_PURGE`0092048
X#define`009IO$M_TRMNOECHO`0094096
X#define`009IO$M_REFRESH`0098192
X#define`009IO$M_ESCAPE`00916384
X#define`009IO$M_EXTEND`00932768
X#define`009IO$M_CANCTRLO`00964
X#define`009IO$M_ENABLMBX`009128
X#define`009IO$M_NOFORMAT`009256
X#define`009IO$M_BREAKTHRU`009512
X#define`009IO$M_NEWLINE`0091024
X#define`009IO$M_TYPEAHDCNT`00964
X#define`009IO$M_MAINT`00964
X#define`009IO$M_CTRLYAST`009128
X#define`009IO$M_CTRLCAST`009256
X#define`009IO$M_HANGUP`009512
X#define`009IO$M_OUTBAND`0091024
X#define`009IO$M_TT_CONNECT`0092048
X#define`009IO$M_TT_DISCON`0094096
X#define`009IO$M_TT_PROCESS`0098192
X#define`009IO$M_BRDCST`00916384
X#define`009IO$M_LOOP`009128
X#define`009IO$M_UNLOOP`009256
X#define`009IO$M_LINE_OFF`009512
X#define`009IO$M_SET_MODEM`0091024
X#define`009IO$M_LINE_ON`0092048
X#define`009IO$M_LOOP_EXT`0094096
X#define`009IO$M_AUTXOF_ENA`0098192
X#define`009IO$M_AUTXOF_DIS`00916384
X#define`009IO$M_INCLUDE`0092048
X#define`009IO$M_TT_ABORT`0094096
X#define`009IO$M_INTERRUPT`00964
X#define`009IO$M_MULTIPLE`009128
X#define`009IO$M_LOCKBUF`009256
X#define`009IO$M_NOBLOCK`009512
X#define`009IO$M_ABORT`009256
X#define`009IO$M_SYNCH`009512
X#define`009IO$M_RESPONSE`00964
X#define`009IO$M_STARTUP`00964
X#define`009IO$M_SHUTDOWN`009128
X#define`009IO$M_ATTNAST`009256
X#define`009IO$M_CTRL`009512
X#define`009IO$M_RD_MEM`00964
X#define`009IO$M_RD_MODEM`009128
X#define`009IO$M_RD_COUNT`009256
X#define`009IO$M_CLR_COUNT`0091024
X#define`009IO$K_SRRUNOUT`0090
X#define`009IO$K_PTPBSC`0098192
X#define`009IO$K_LOOPTEST`00957344
X#define`009IO$M_MORE`00964
X#define`009IO$M_QUALIFIED`009128
X#define`009IO$M_REDIRECT`00964
X#define`009IO$M_ACCEPT`009128
X#define`009IO$M_SETEVF`00964
X#define`009IO$M_WORD`00964
X#define`009IO$M_SETFNCT`009512
X#define`009IO$M_DATAPATH`0091024
X#define`009IO$M_CYCLE`0094096
X#define`009IO$M_RESET`0098192
X#define`009IO$M_SETCUADR`009256
X#define`009IO$M_SETBSIZE`009512
X#define`009IO$M_SETPOOLSZ`0091024
X#define`009IO$M_SETENQCNT`0092048
X#define`009IO$M_CLEAR`0094096
X#define`009IO$M_LPBEXT`0098192
X#define`009IO$M_LPBINT`00916384
X#define`009IO$M_READCSR`00932768
X#define`009IO$M_NOCTSWAIT`00964
X#define`009IO$M_SLAVLOOP`009128
X#define`009IO$M_NODSRWAIT`009256
X#define`009IO$M_MAINTLOOP`009512
X#define`009IO$M_LASTBLOCK`0091024
X#define`009IO$M_INTCLOCK`0094096
X#define`009IO$M_LT_CONNECT`00964
X#define`009IO$M_LT_DISCON`009128
X#define`009IO$M_LT_READPORT`009256
X#define`009IO$M_LT_MAP_PORT`009512
X#define`009IO$M_LT_RATING`0091024
X#define`009IO$M_LT_SOL_INFO`0092048
X#define`009IO$M_LT_RCV_INFO`0094096
X#define`009IO$M_LT_MAP_FILLER`0091
X#define`009IO$M_LT_MAP_NODNAM`0092
X#define`009IO$M_LT_MAP_PORNAM`0094
X#define`009IO$M_LT_MAP_SRVNAM`0098
X#define`009IO$M_LT_MAP_LNKNAM`00916
X#define`009IO$M_LT_MAP_NETADR`00932
X#define`009IO$S_IODEF`0092
X#define`009IO$S_FCODE`0096
X#define`009IO$V_FCODE`0090
X#define`009IO$S_FMODIFIERS`00910
X#define`009IO$V_FMODIFIERS`0096
X#define`009IO$V_INHERLOG`00911
X#define`009IO$V_ERASE`00910
X#define`009IO$V_ENCRYPT`00913
X#define`009IO$V_DATACHECK`00914
X#define`009IO$V_INHRETRY`00915
X#define`009IO$V_INHSEEK`00912
X#define`009IO$V_REVERSE`0096
X#define`009IO$V_NOWAIT`0097
X#define`009IO$V_INHEXTGAP`00912
X#define`009IO$V_MSCPMODIFS`0098
X#define`009IO$V_SHADOW`0096
X#define`009IO$V_LOCATE`0097
X#define`009IO$V_MSCP_FORMAT`0096
X#define`009IO$V_ALLHOSTS`0096
X#define`009IO$V_DISSOLVE`0097
X#define`009IO$V_NOCLEANUP`0098
X#define`009IO$V_SPINDOWN`0096
X#define`009IO$V_FORCEPATH`0096
X#define`009IO$V_STEPOVER`0096
X#define`009IO$V_COPYOP`0098
X#define`009IO$V_EXISTS`0096
X#define`009IO$V_CBS`0097
X#define`009IO$V_BOOTING`0098
X#define`009IO$V_VUEX_FC`0099
X#define`009IO$V_COMMOD`0096
X#define`009IO$V_MOVETRACKD`0097
X#define`009IO$V_DIAGNOSTIC`0098
X#define`009IO$V_SKPSECINH`0099
X#define`009IO$V_DELDATA`0096
X#define`009IO$V_NOMRSP`0096
X#define`009IO$V_SWAP`0098
X#define`009IO$V_OPPOSITE`0099
X#define`009IO$V_CLSEREXCP`0099
X#define`009IO$V_CHUNKDIAG`0096
X#define`009IO$V_TBC`00910
X#define`009IO$V_ENAREP`0096
X#define`009IO$V_ACCESS`0096
X#define`009IO$V_CREATE`0097
X#define`009IO$V_DELETE`0098
X#define`009IO$V_MOUNT`0099
X#define`009IO$V_DMOUNT`00910
X#define`009IO$V_REMOUNT`00911
X#define`009IO$V_MOVEFILE`00912
X#define`009IO$V_BINARY`0096
X#define`009IO$V_PACKED`0097
X#define`009IO$V_NOW`0096
X#define`009IO$V_READATTN`0097
X#define`009IO$V_WRTATTN`0098
X#define`009IO$V_SETPROT`0099
X#define`009IO$V_NORSWAIT`00910
X#define`009IO$V_NOECHO`0096
X#define`009IO$V_TIMED`0097
X#define`009IO$V_CVTLOW`0098
X#define`009IO$V_NOFILTR`0099
X#define`009IO$V_DSABLMBX`00910
X#define`009IO$V_PURGE`00911
X#define`009IO$V_TRMNOECHO`00912
X#define`009IO$V_REFRESH`00913
X#define`009IO$V_ESCAPE`00914
X#define`009IO$V_EXTEND`00915
X#define`009IO$V_CANCTRLO`0096
X#define`009IO$V_ENABLMBX`0097
X#define`009IO$V_NOFORMAT`0098
X#define`009IO$V_BREAKTHRU`0099
X#define`009IO$V_NEWLINE`00910
X#define`009IO$V_TYPEAHDCNT`0096
X#define`009IO$V_MAINT`0096
X#define`009IO$V_CTRLYAST`0097
X#define`009IO$V_CTRLCAST`0098
X#define`009IO$V_HANGUP`0099
X#define`009IO$V_OUTBAND`00910
X#define`009IO$V_TT_CONNECT`00911
X#define`009IO$V_TT_DISCON`00912
X#define`009IO$V_TT_PROCESS`00913
X#define`009IO$V_BRDCST`00914
X#define`009IO$V_LOOP`0097
X#define`009IO$V_UNLOOP`0098
X#define`009IO$V_LINE_OFF`0099
X#define`009IO$V_SET_MODEM`00910
X#define`009IO$V_LINE_ON`00911
X#define`009IO$V_LOOP_EXT`00912
X#define`009IO$V_AUTXOF_ENA`00913
X#define`009IO$V_AUTXOF_DIS`00914
X#define`009IO$V_INCLUDE`00911
X#define`009IO$V_TT_ABORT`00912
X#define`009IO$V_INTERRUPT`0096
X#define`009IO$V_MULTIPLE`0097
X#define`009IO$V_LOCKBUF`0098
X#define`009IO$V_NOBLOCK`0099
X#define`009IO$V_ABORT`0098
X#define`009IO$V_SYNCH`0099
X#define`009IO$V_RESPONSE`0096
X#define`009IO$V_STARTUP`0096
X#define`009IO$V_SHUTDOWN`0097
X#define`009IO$V_ATTNAST`0098
X#define`009IO$V_CTRL`0099
X#define`009IO$V_RD_MEM`0096
X#define`009IO$V_RD_MODEM`0097
X#define`009IO$V_RD_COUNT`0098
X#define`009IO$V_CLR_COUNT`00910
X#define`009IO$V_MORE`0096
X#define`009IO$V_QUALIFIED`0097
X#define`009IO$V_REDIRECT`0096
X#define`009IO$V_ACCEPT`0097
X#define`009IO$V_SETEVF`0096
X#define`009IO$V_WORD`0096
X#define`009IO$V_SETFNCT`0099
X#define`009IO$V_DATAPATH`00910
X#define`009IO$V_CYCLE`00912
X#define`009IO$V_RESET`00913
X#define`009IO$V_SETCUADR`0098
X#define`009IO$V_SETBSIZE`0099
X#define`009IO$V_SETPOOLSZ`00910
X#define`009IO$V_SETENQCNT`00911
X#define`009IO$V_CLEAR`00912
X#define`009IO$V_LPBEXT`00913
X#define`009IO$V_LPBINT`00914
X#define`009IO$V_READCSR`00915
X#define`009IO$V_NOCTSWAIT`0096
X#define`009IO$V_SLAVLOOP`0097
X#define`009IO$V_NODSRWAIT`0098
X#define`009IO$V_MAINTLOOP`0099
X#define`009IO$V_LASTBLOCK`00910
X#define`009IO$V_INTCLOCK`00912
X#define`009IO$V_LT_CONNECT`0096
X#define`009IO$V_LT_DISCON`0097
X#define`009IO$V_LT_READPORT`0098
X#define`009IO$V_LT_MAP_PORT`0099
X#define`009IO$V_LT_RATING`00910
X#define`009IO$V_LT_SOL_INFO`00911
X#define`009IO$V_LT_RCV_INFO`00912
X#define`009IO$V_LT_MAP_FILLER`0090
X#define`009IO$V_LT_MAP_NODNAM`0091
X#define`009IO$V_LT_MAP_PORNAM`0092
X#define`009IO$V_LT_MAP_SRVNAM`0093
X#define`009IO$V_LT_MAP_LNKNAM`0094
X#define`009IO$V_LT_MAP_NETADR`0095
X/*
X * end of C_GBLINI definitions
X */
$ GOSUB UNPACK_FILE
 
$ FILE_IS = "MTDEF.H"
$ CHECKSUM_IS = 1443239590
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X/*
X * definitions created by C_GBLINI at 28-DEC-1990 13:49:01.31
X */
X#define`009MT$M_SEREXCP`0091
X#define`009MT$M_ENAUTOPACK`0092
X#define`009MT$M_ENSEREXCP`0094
X#define`009MT$M_PARITY`0098
X#define`009MT$M_FORMAT`009240
X#define`009MT$M_DENSITY`0097936
X#define`009MT$M_LOGSOFT`00916384
X#define`009MT$M_LOGSOFTOG`00932768
X#define`009MT$M_BOT`00965536
X#define`009MT$M_EOF`009131072
X#define`009MT$M_EOT`009262144
X#define`009MT$M_HWL`009524288
X#define`009MT$M_LOST`0091048576
X#define`009MT$M_SUP_NRZI`0092097152
X#define`009MT$M_SUP_PE`0094194304
X#define`009MT$M_SUP_GCR`0098388608
X#define`009MT$M_SPEED`009(-16777216)
X#define`009MT$K_DEFAULT`0090
X#define`009MT$K_NORMAL11`00912
X#define`009MT$K_CORDMP11`00913
X#define`009MT$K_NORMAL15`00914
X#define`009MT$K_NRZI_800`0093
X#define`009MT$K_PE_1600`0094
X#define`009MT$K_GCR_6250`0095
X#define`009MT$K_WOD_6250`0098
X#define`009MT$K_HPC_40K`00912
X#define`009MT$K_HPC_COMP`00913
X#define`009MT$K_XPC_80K`00914
X#define`009MT$K_XPC_COMP`00915
X#define`009MT$K_BLK_833`00917
X#define`009MT$K_BLK_1250`00918
X#define`009MT$K_SPEED_DEF`0090
X#define`009MT$K_SPEED_25`00925
X#define`009MT$K_SPEED_75`00975
X#define`009MT$S_MTDEF`0094
X#define`009MT$V_SEREXCP`0090
X#define`009MT$V_ENAUTOPACK`0091
X#define`009MT$V_ENSEREXCP`0092
X#define`009MT$V_PARITY`0093
X#define`009MT$S_FORMAT`0094
X#define`009MT$V_FORMAT`0094
X#define`009MT$S_DENSITY`0095
X#define`009MT$V_DENSITY`0098
X#define`009MT$V_LOGSOFT`00914
X#define`009MT$V_LOGSOFTOG`00915
X#define`009MT$V_BOT`00916
X#define`009MT$V_EOF`00917
X#define`009MT$V_EOT`00918
X#define`009MT$V_HWL`00919
X#define`009MT$V_LOST`00920
X#define`009MT$V_SUP_NRZI`00921
X#define`009MT$V_SUP_PE`00922
X#define`009MT$V_SUP_GCR`00923
X#define`009MT$S_SPEED`0098
X#define`009MT$V_SPEED`00924
X/*
X * end of C_GBLINI definitions
X */
$ GOSUB UNPACK_FILE
 
$ FILE_IS = "REDIRECT.C"
$ CHECKSUM_IS = 336937157
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X/*`009simulate SHELL redirection for VAXC
X`009w.j.m. feb 86
X`009fix aug 86 wjm
X`009mod apr 87 wjm: allow for ">>"
X`009mod 26-may-1990 wjm: use "mbc=16" for efficiency (seq. I/O only!)
X
Xusage:
X
X`009main(argc,argv)
X`009int argc; char **argv;
X`009`123
X`009#ifdef VAXC
X`009`009redirect(&argc,&argv);
X`009#endif
X`009`009...
X
Xbugs:
X`009does not handle redirection of stderr.
X
X`009overwrites argument vector (*argv).
X
X*/
X
X#include stdio
X#include perror
X
Xstatic myerr(str,flag)
Xchar *str; int flag;
X`123
X`009extern noshare int vaxc$errno;
X
X`009fprintf(stderr,"%%-F-REDIRECT, %s\n",str);
X`009if(flag) `123
X`009`009exit(vaxc$errno);
X`009`125 else`009exit(0x10000004);
X`125
X
Xredirect(argcp,argvp)
Xint *argcp; char ***argvp;
X`123
X`009char **av,**nav;
X`009int ac,nac;
X`009int inx = 0, outx = 0;
X
X`009av = nav = *argvp;
X`009ac = *argcp;
X
X`009if(ac <= 0) return;`009`009/* no arg, no action */
X
X`009av++; nav++; ac--; nac = 1;`009/* 1st arg untouched */
X
X`009for( ; ac > 0; av++, ac--) `123
X`009`009switch(**av) `123
X`009`009  case '<':
X`009`009`009if(inx++) myerr("double input redirection",0);
X`009`009`009if((stdin=freopen(*av+1,"r",stdin,"mbc=16"))==NULL)
X`009`009`009`009myerr("cannot redirect stdin",1);
X`009`009`009break;
X`009`009  case '>':
X`009`009`009if(outx++) myerr("double output redirection",0);
X`009`009`009if(*(*av+1) == '>') `123
X`009`009`009`009if((stdout=freopen(*av+2,"a",stdout,"mbc=16"))==NULL)
X`009`009`009`009`009myerr("cannot redirect stdout",1);
X`009`009`009`125 else `123
X`009`009`009`009if((stdout=freopen(*av+1,"w",stdout,"mbc=16"))==NULL)
X`009`009`009`009`009myerr("cannot redirect stdout",1);
X`009`009`009`125
X`009`009`009break;
X`009`009  default:
X`009`009`009*nav++ = *av; nac++;
X`009`009`125
X`009`125
X
X`009/* note: K&R does not say that argv[argc] == NULL */
X
X`009*argcp = nac;
X`125
$ GOSUB UNPACK_FILE
 
$ FILE_IS = "UCBDEF.H"
$ CHECKSUM_IS = 1346593642
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X/*
X * This is a stub - the .C programs only refer to a single flag.
X *
X * This definition is valid at least for VMS versions  4.0 .. 5.4
X */
X#define`009UCB$M_VALID`0092048
$ GOSUB UNPACK_FILE
 
$ FILE_IS = "ZT.WRITEUP"
$ CHECKSUM_IS = 1465242050
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
V=============================================================================
X===
X
XNote: ZTDRIVER is NOT public domain. COPYRIGHT (c) 1989,1991 W.J.Moeller,
X`009all rights reserved ...
X
V=============================================================================
X===
X
X   Note to the January 1991 distribution:
X
X`009The programs as "described" below assume VMS V5.4 (and up?).
X
X`009Due to a change in the documented behaviour of magtape drivers,
X`009you'll have have to compile ZT1.C and ZT2.C with
X`009`009/DEFINE="PRE_V54=1"
X`009in order to generate programs that correctly support
X`009earlier VMS versions. For VMS 4.7, you also have to`032
X`009re-assemble the .MAR programs on a 4.7 system.
X
X`009If you have an older distribution, the only changes are in
X`009ZT1.C and ZT2.C - no need to rebuild the driver.
X`009(Also, the writeup below did *not* change - sorry.)
X
X`009`009w.j.m. 21-jan-1991
X
V=============================================================================
X===
X
X   ZTDRIVER has been tested & used under VMS V4.7, V5.1-1 and V5.4 .
X
X   I myself hardly use it for "production"; in fact I mainly did it`032
X`009(a) as an exercise to port a driver from V4 to V5
X`009(b) to test VMS V5's great new magtape (BACKUP) features -
X`009`009we had tapes only on the 8650
X
X   Be warned: In my experience DECnet/Ethernet (around 50kb/s) is just SLOW,
Xcompared to the speed of 'real' tapes. Anyway I think that ZT won't be faster
Vthan BACKUP to a remote disk file. So there is no point in tying up a 'served
X'`032
Vreal tape for the duration of DECnet data transfer, unless you're really shor
Xt`032
Xof disk space.
X
V=============== A little description/technical note, made up in a hurry =====
X===
X
V   ZTDRIVER owes most of its size to my (essentially) copying of MTDRIVER's`0
X32
XFDT stuff, since I didn't know at the outset which I/O functions`032
Xare in actual use (MTAACP/RMS/BACKUP). Now I know - it's indeed only`032
Vthe documented ones plus IO$_NOP, sometimes also represented as a SKIP 0 bloc
Xks
X(if I remember correctly), with the ACP adding an apparently un-named
Xmodifier bit 1@9.
X   It handles a request in its STARTIO routine the following way:
Xcopy pertinent data into its UCB extension, send that as a mailbox msg to
Vthe server (which indicates its presence by storing its mailbox into the UCB)
X.
XIt then WFIKPCH's where the timeout is not only very long, but the timeout
Xroutine itself is a NOP (Same for CANCEL!).`032
VAt this point the server process is supposed to do just everything on its own
X,
Xexcept for modifying externally visible UCB fields. Currently, the server
Xneed not go into kernel mode initially; only when it has figured out what
Xis actually to be done, it possibly calls IOC$MOVxxUSER to transfer data.
XFinally the server into kernel mode, copies back its results into the
XUCB extension, and does a fake 'interrupt' to wake the driver.
X   When awake, the driver just updates the 'real' UCB fields from the data
Xit finds in the UCB extension and completes the I/O request.
X   Currently this description is not completely correct, since there are
Va few error paths where the driver decides on its own to reject a request;`03
X2
XI don't like them anymore.
X   The driver starts out as OFFLINE, the server will set it ONLINE (when
Xstoring its mailbox address) and turn it off again in its exit handler -
Xnote that there is currently no EXEC mode exit handler!
X`009*** CAUTION: don't STOP the server, always $FORCEX it! ***
X   Actually, the worst that can happen is that the driver gets stuck,`032
Vand as far as I know this should block just 1 process (and possibly its ACP -
X`032
XMTAACP is not shared). The server initialization, is intended to clear this
Xcondition in any case: it just overwrites the UCB extension fields that`032
Xmay be left from an earlier instance and also triggers a pseudo-interrupt`032
X(which will normally be ignored). So if the server dies, just re-start it!
X`009*** CAUTION: the server does not check if it is the only one!
X`009`009Once I had 3 servers running by mistake - just "force"d
X`009`009all of them (ZTA0 went offline) and started a new one`032
X`009`009(ZTA0 online again) - my first chance to experience`032
X`009`009VMS V5's new mount verification stuff ...
X
X   Files: ZTDEF.MAR (defines message area / 'shared' UCB extension)
X`009`009must be made into ZT.MLB, since the .MAR use '.include "ZT"'
X`009ZTDRIVER.MAR is the driver (VMS 4.7 .. 5.4), to make:
X`009`009$ MAC ZTDRIVER
X`009`009$ LINK ZTDRIVER/OPT
X`009ZTSERVER.MAR encapsulated the server's kernel mode stuff`032
X`009`009in a few simple-minded subroutines.
X`009`009(needs just CMKRNL privilege to run, by the way).
X`009*** CAUTION: ZTSERVER and ZTDRIVER have to be generated and *used*
X`009`009*together* for a particular VMS version,`032
X`009`009there is no built-in version check!`032
X`009`009(I think the fact that both link with SYS.STB`032
X`009`009will make it impossible to run a wrong server)
X
X   Now for the server: what could it do???
XA first 'test' version (ZT1 + ZT1T) tried to make up a 'memory tape'.`032
XI think such a thing is utterly useless, and as it stands, it can serve
Xas a rudimentary test device only since it won't switch reels.
X[Just for fun: naturally I included EOT detection, but no way to simulate
Xan unloaded tape. The ACP bravely asks the operator, but silly old BACKUP
Xindeed initiates UNLOAD, then immediately tests if the tape is loaded;
Vif that succeeds - as in my case, and allegedly for some initial V5 TUDRIVER
X -
Xit happily continues without asking anyone!]
X   If desired, I might include this program for completeness ...
X
V   The second program (and the only one mentioned above) is a DECnet tape ser
Xver
Xpair. The program serving the pseudo-tape is called ZT2
Xand the real server, which serves a real tape, is called ZTNS2.`032
V   There is quite a bit of black magic involved in getting a real tape served
X,
Xthe biggest problem being that there is nowhere a documentation for
Xthe 'correct' behaviour of a tape driver - in fact different DEC drivers
Xdo return different status codes on identical conditions. The second trouble
Xcomes with hard errors: if the real-tape-server (ZTNS2, for short) receives
Xa media/hardware related error status, it does not know what exactly happened
Xand in particular, where the tape is positioned (and of course ZTNS2 ought
Xto be device-independent)!
X   Here comes a horrible thing with VMS: apparently the author(s)
Xof MTAACP noted this problem, and so there was created a cell UCB$L_RECORD
Xwhere a magtape driver has to put the current block number (0 at BOT,
XEOF marks are counted as blocks). I know that the ACP looks at this cell,
Xbut normal programs can't, since it's not on the list of $GETDVI!
X   Currently, ZTNS2 (intended to be a harmless, unprivileged program)`032
Vdoes not go into kernel mode to find out about UCB$L_RECORD, so it has to gue
Xss
Xand also return "tape position lost" status. There are actually 2 ways to do
Xjust that, the first is to say so (SS$_TAPEPOSLOST) and the second is to
Xset a status bit MT$V_LOST (does anyone look at this status word, anyway?? -
Xthere is a bit MT$V_EOF allegedly indicating "end of file mark passed",`032
XMTDRIVER sets it from some hardware register, newer drivers apparently
Xnever set it (?)). ZTNS2 has a conditional of which behaviour is preferred.
X
X   I have to admit that all of the code has not yet been sufficiently tested,
Xbecause I was too lazy to implement "error insertion" in my memory tape,
Xand with real tapes you have to wait and see - and that takes time...!
X   The 'protocol' used between ZT2 and ZTNS2 is strictly half-duplex:
VZT2 sends (sort of) I/O function, ZTNS2 finally replies with status & some mo
Xre
Xinformation. In between, ZTNS2 may send at most a single 'DMA request':
X   - on tape read, this is immediately followed by data (split into
X`009reasonably-sized packets) , upon which ZT2 replies`032
X`009(with a 'DMA status', always good so far)
X   - on tape write, ZT2 replies with the data requested
XI unnecessarily wrote ZTNS2 such that it would support full-duplex operation
Xof the DECnet link; on the other hand, ZT2 is completely synchronous.
X
X   ZT2/ZTNS2 is not complete. Both programs conspire to ignore
Xmost of the I/O function modifier bits, notably IO$M_INHRETRY;
Xthey do not implement read backward (I don't even know in what direction
Xand where data would have to be placed in the user buffer);`032
XDATACHECK is not end-to-end, but only done on the ZTNS2 end.
XAlso, IO$_SETMODE/CHAR is not propagated to ZTNS2 at all, and neither are the
Xreal tape "characteristics" to ZT2 - this is truly a shortcoming in the
Xtask-to-task protocol. The virtual ZT defaults to "TE16 at 1600bpi";
Xin fact this can be changed with IO$_SETCHAR without any influence on the
Xdriver's behaviour.
X   I did implement the IO$_WRITECHECK function from MTDRIVER,
Xwhich actually means "compare tape data to memory". Unfortunately,
Xno program uses it, so it's completely untested.
X
X   Files:
X`009ZT1.C + ZT1T.C make up the memory tapes (ZT1 is the "driver" part,
X`009`009`009ZT1T is just subroutines for in-core storage
X`009`009`009of tape blocks and EOF marks).
X`009ZT2.C is the ZT-server for the task-to-task design
X`009*** CAUTION: ZT1.C *and* ZT2.C each carry their own definition
X`009`009`009of the message area defined in ZTDEF.MAR ***
X`009`009Both ZT1 and ZT2 have an options to log all I/O operations;
X`009`009so far I had that always enabled.
X`009ZTNS2.C is the real-tape-server
X`009`009ZT1, ZT2 and ZTNS2 include:
X`009IODEF.H, MTDEF.H, UCBDEF.H which I created with my 'C_DEFS'
X`009`009procedure (recently re-posted on info-vax by Jerry Leichter).
X`009`009Note: IODEF.H from VAXC (VMS V4 version) won't do.
X`009`009By silly design, UCBDEF is currently *only* required to define
X`009`009a single bit position, UCB$M_VALID (this bit did *not* change
X`009`009from VMS V4 to V5 - UCBDEF changed a lot).
X`009ZTNS.H is included by ZT2.C and ZTNS2.C, it defines`032
X`009`009the task-to-task messages.
X
X`009To make ZT1:
X`009`009$ CC ZT1,ZT1T
X`009`009$ LINK ZT1,ZT1T,ZTSERVER`009! links with SYS
X`009To make ZT2 and ZTNS2:
X`009`009$ CC ZT2
X`009`009$ LINK ZT2,ZTSERVER`009`009! links with SYS
X`009`009$ CC ZTNS2
X`009`009$ LINK ZTNS2
X
X   To use the programs,`032
X`009(a)`009$ SYSGEN CONNECT ZTA0/noadapter
X`009*** BUG: ZTSERVER.MAR has _ZTA0 hard-coded. ***
X`009(b1)`009$ run ZT1`009! from anywhere: terminal, batch, detached ...
X`009(c1)`009when you are done, somehow stop ZT1 by $FORCEX,
X`009`009CTRL-Y, or STOP/QUE/ENTRY when in batch.
X`009(b2a)`009on the ZT-side, make up a Network object, e.g. ZT2.COM,
X`009`009`009like:`009$ set proc/priv=cmkrnl
X`009`009`009`009$ run ZT2
X`009(b2b)`009on the real tape side:
X`009`009`009$ define ZT_TAPE <any tape>
X`009`009`009$ mount/foreign ZT_TAPE/multi_volume
X`009`009`009`009`009       `094-- for V5, I guess
X`009`009`009`009`009`009(my tapes are still with V4)
X`009`009`009$ define ZT_NETOBJECT "node::""task=ZT2/"
X`009`009`009`009`009`009     `094---------`094 wierd (sorry),
X`009`009`009`009`009`009task spec starts with quotation
X`009`009`009`009`009`009mark and ends with slash.
X`009`009`009$ run ZTNS2
X`009(c2)`009when done, either kill ZT2 with $FORCEX (ZT-side),
X`009`009or stop ZTNS2 (by any means).
X`009*** BUG: ZT2 will *not* instantly notice that ZTNS2 has gone,
X`009`009but only on the next I/O.`032
X`009`009MOUNT/FOREIGN is ok to force an I/O (=> SS$_DEVOFFLINE).
X
V=============================================================================
X==
X
X
XEnjoy,
X`009-wjm
X
XWolfgang J. Moeller, GWDG, D-3400 Goettingen, F.R.Germany `124 Disclaimer ...
VBitnet/Earn: U0012@DGOGWDG5         Phone: +49 551 201516 `124 No claim inten
Xded!
VInternet: Moeller@gwdgv1.dnet.gwdg.de   `124 This space intentionally left bl
Xank.
$ GOSUB UNPACK_FILE
 
$ FILE_IS = "ZT1.C"
$ CHECKSUM_IS = 84370110
$ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
X/*`009first test of ZTDRIVER ...
X`009w.j.m. jun 1989
X`009mod 28-dec-1990 wjm: VMS V5.4 *always* does end-of-volume recognition,
X`009`009`009`009no longer dependent upon FOREIGN MOUNT.
X`009`009`009     Old behaviour now only with PRE_V54 defined.
X`009fix 14-jan-1991 wjm: fix(?) file count returned when reverse
X`009`009`009`009SKIPFILE hits BOT (required for 5.4 MTAAACP)
X*/
X
X#ifndef TRACE
X#define TRACE 1
X#endif
X
V#ifndef PRE_V54`009`009/* might be conditional on UCBDEF or IODEF;`009   */`0
X09
X#define PRE_V54 0`009/* e.g. UCB$L_SHAD & IO$V_MOVEFILE are new in V5.4 */
X#endif
-+-+-+-+-+ End of part 1 +-+-+-+-+-
