/9~ SOURCE.BCKt SOURCE.BCK(BACKUP/LOG/VERIFY *.* [-]SOURCE.BCK/SAVE DENTON_D 0y>IV5.5 _BPOUSA::  _HSC005$DUA81: V5.5 ~  0*[USERS.DENTON_D.DECUS.LT.SOURCE]ADD_RIGHTS.COM;3+,<,./0 4,f-8A0123KPWO5K6 R7A H89@dHG0HJ'$ DEFINE/USER SYS$OUTPUT RIGHTS_IDS.LOG$ MCR AUTHORIZESHOW/ID/FULL SYSTEMSSTAFFSHOW/ID/FULL LT_TOOL_MGRSHOW/ID/FULL LT_USER SHOW/ID/FULL LT_QUEUE SHOW/ID/FULL LT_FILE SHOW/ID/FULL LT_REPLY SHOW/ID/FULL LT_IDENTIFIERSHOW/ID/FULL LT_AUTHORIZESHOW/ID/FULL LT_DISK SHOW/ID/FULL LT_ENTRY SHOW/ID/FULL LT_NETWORKSHOW/ID/FULL LT_PROCESSSHOW/ID/FULL LT_TAPE SHOW/ID/FULL LT_DATABASESHOW/ID/FULL LT_DATABASE_PRIVSHOW/ID/FULL LT_OPERATORSHOW/ID/FULL LT_INSTALLSHOW/ID/FULL LT_MAILBOX,ADD/ID SYSTEMSSTAFF /VALUE=ID=%X01000100,ADD/ID LT_TOOL_MGR /VALUE=ID=%X01000000,ADD/ID LT_USER /VALUE=ID=%X01000001,ADD/ID LT_QUEUE /VALUE=ID=%X01000002,ADD/ID LT_FILE /VALUE=ID=%X01000003,ADD/ID LT_REPLY /VALUE=ID=%X01000004,ADD/ID LT_IDENTIFIER /VALUE=ID=%X01000005,ADD/ID LT_AUTHORIZE /VALUE=ID=%X01000006,ADD/ID LT_DISK /VALUE=ID=%X01000007,ADD/ID LT_ENTRY /VALUE=ID=%X01000008,ADD/ID LT_NETWORK /VALUE=ID=%X01000009,ADD/ID LT_PROCESS /VALUE=ID=%X0100000A,ADD/ID LT_TAPE /VALUE=ID=%X0100000B,ADD/ID LT_DATABASE /VALUE=ID=%X0100000C,ADD/ID LT_DATABASE_PRIV /VALUE=ID=%X0100000D,ADD/ID LT_OPERATOR /VALUE=ID=%X0100000E,ADD/ID LT_INSTALL /VALUE=ID=%X0100000F,ADD/ID LT_MAILBOX /VALUE=ID=%X01000010EXIT$ EXIT0*[USERS.DENTON_D.DECUS.LT.SOURCE]BUILD_FRAG.COM;1+,A\./0 4p-8A0123KPWO5h6@O2Ej7 7H89@dHG0HJ$!$ macro disk_frag$ macro file_frag$ link/notraceback disk_frag$ link/notraceback file_frag$ exit.*[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.COM;6+,D{./0 4L8-8A0123KPWO56 Ŗ7z>I89G0HJ$ VERIFY = F$VERIFY("No")$ ! Cerberus.Com I$ ! Interface procedure betweek CERBERUS and the users command procedureG$ ! This procedure saves and restores the users environment around the'$ ! invoked procedure and traps exits.F$ ! This is accomplished by removing all symbols, saving the previousF$ ! privileges, setting a safeguard control_Y action, masking off theK$ ! message suppression bit, and restoring the old privileges and symbols.$ !'$ Set Symbol /Scope=(NoLocal ,NoGlobal) $ Set NoOn#$ On Control_Y Then Set NoControl_Y($ Current_Privs = F$Getjpi("","CURPRIV")$!+K$! Make some changes to allow logical name search lists in the P1 parameterL$! and make sure the any logical names used in the P1 specification come off$! the system table only.$!-B$!! P1 = F$PARSE(P1,".COM",,) - Removed to allow lnm search lists.A$ define/user/table=lnm$process_directory lnm$file_dev lnm$system?$ @'P1' "''P2'" "''P3'" "''P4'" "''P5'" "''P6'" "''P7'" "''P8'"'$ STATUS = $STATUS .and..not.%X10000000"$ Set Symbol /Scope=(Local,Global)$ Set Process /Priv=Noall%$ Set Process /Priv=('Current_Privs')$!G$! It shall be assumed that the CERBERUS image is in the same directory%$! as the CERBERUS command procedure.$!($ This_Proc = F$Environment("Procedure"),$ Image_Spec = F$Parse(This_Proc,,,"Device")<$ Image_Spec = Image_Spec + F$Parse(This_Proc,,,"Directory")7$ Image_Spec = Image_Spec + F$Parse(This_Proc,,,"Name")$ Cerberus = "$ ''Image_Spec'"$ Cerberus /off$ Set Control=Y$ VERIFY = F$VERIFY(VERIFY) $ Exit STATUS.*[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.EXE;1+,./0 4-8A0123 KPWO56@K7@>I89G0HJ0DX0205(KCERBERUS01K05-05@@@    ?B!d FORRTL_001! LIBRTL_001"! SECURESHR_001#!SECURESHRP_001Sys$library:cerberus.comSecurity alarm on !AS / Executing CERBERUS!/!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/!_File:!_!_!ASSecurity alarm on !AS / Attempt to execute CERBERUS aborted!/!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/!_File:!_!_!AS!/!_Status:!_!_Command File Execution UnauthorizedSecurity alarm on !AS / Attempt to execute CERBERUS aborted!/!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/!_File:!_!_!AS!/!_Status:!_!_Error opening the privileged command fileCommand file name: /OFF%Cer-CMK%Cer-JPI$_PID%Cer-JPI$PRCNAM%Cer-JPI$USERNAME%Cer-LIB$SYS_ASCTIM%Cer-LIB$GETSYI%Cer-CHK_ACCESS %Cer-Rsa&Fid%Cer-SYS$FAO%Cer-SEND_MSGSYSTEMSSTAFF%Cer-ASCTOID%CER-CMK%Cer-LIB$DO_COMMAND%Cer-ENA_CTRLASCTIMSYS$FAOSEND_MSG Qio error on IO$_ACCESS, J = IOSB =, %Cer-F-Invalid_Own, Unauthorized input file+ %CER-F-OPNERR, error opening command file )p xwv v     $ D L .l  &  4  D   V$   jT h p z        2p  4p@ l1|      .8L\ x     0P`PK[XP`ZP`\P>8``P`d:P Pxt@T˰ˀˌPPTT#˘P^˰ˬ^˸P^c^P^ G^P^@<+^HP^hd^pP^˘˔^XP`YP`\P`2PPˠˤ˰P^^PЫPP˰*P z2\\˯ PP 42L<@XpDPRR˨).hRS?MJ2ˈ<|ˀ2VV˼Ы 2WW\˯PP^^PP 2P,Pˮ `P2PPPXP^0,N^@P^\X2^8k1dP^|x ^X«^(˰nЫY ~Y^(nY@~YY˄YX^ˈˌ-X^P^ˠ˜^˨ P^˼˸^1P^e^VЫ $W\˯ PP^<8!^2P,Pˮ `P2PPPDXHLP^`\^+H[}PQPkP^Hh[}PQPk}PQ PP`P`P޼ `P`P`<VfW(WW0PJzHP9 WW <V(WЬVf P1<2K l0<P &<PЬVV ЬW W<P< PПXTФlTWVWVdWV<P.ComмPP:l+PF~PnR})bݼ-}@@8  8@x x @FORRTLLIBRTL SECURESHR SECURESHRP/*[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.FOR;70+,@./0 4Px-8A0123KPWO56&K7`Fݞ>I89G0HJPC+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++C+ +PC+ This program is the Shell around a corresponding procedure which allows +PC+ users to execute selected command procedures with privilege. It does this +PC+ by setting the privileges, executing the procedure, and restoring the +PC+ privileges. The command procedure has the responsibility of deleting +PC+ all DCL symbols, saving old privileges, controlling Control_Y, and restoring+PC+ privileges and symbols. This program checks for proper ownership of the +PC+ requested procedure, set the required privileges (CMKRNL & SYSPRV), and +2C+ executing the requested procedure. +C+ +PC+ Modifications: +PC+ 16-Jan-1992 DLD Removed the disabling of ^Y, this responsibility +PC+ now lies with the command procedures executed +PC+ as the Liaison Tool facility. +PC+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROGRAM CERBERUS. IMPLICIT NONE !require everything declared* INCLUDE '($SSDEF)' !include definitions INCLUDE '($LIBDEF)' !... INCLUDE '($LIBCLIDEF)' !... INCLUDE '($PRVDEF)' !... Include '($Jpidef)' Include '($Syidef)' Include '($Armdef)' Include '($IOdef)' Include '($Atrdef)' EXTERNAL Exe_Pprv C declare everything we needLC===========================================================================LC........................................................................... Character*16 Chrfib Integer*4 Uic_I4, File_Owner" Integer*2 Fid(3), Iosb(4), Uic(2) Byte I1Fib(16)@ EQUIVALENCE (CHRFIB,I1Fib), (FID,I1FIB(5)), (Uic, Uic_I4, Lid)FC.....................................................................FC=====================================================================! PARAMETER SETPRV=PRV$V_SETPRV* INTEGER*4 LID, LIDR, LAT, COMLEN, LEN, IS8 INTEGER*4 LIB$GET_FOREIGN, LIB$DISABLE_CTRL, LIB$SIGNAL$ Integer*4 LIB$ENABLE_CTRL, Sys$Qiow> INTEGER*4 LIB$DO_COMMAND, SYS$CMKRNL, SYS$ASCTOID, Sys$Assign# INTEGER*4 SETPRV_ON(3)/2,SETPRV,0/! CHARACTER*255 COMMAND, Out_Strng: Integer*4 Sys$Fao, Lib$Getjpi, Lib$Getsyi, Lib$Sys_Asctim> Integer*4 Iferr, Pid, i, j, Send_Msg, Chk_Access, Fid_And_Rsa Integer*2 Spec_Len, Chan" Character*5 On_Off, File_Spec*2554 Parameter Cerberus_Com = 'Sys$library:cerberus.com'; Parameter Cntrl_Str_1 = 'Security alarm on !AS / Executing 1 CERBERUS!/4 2!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/ 3!_File:!_!_!AS'< Parameter Cntrl_Str_2 = 'Security alarm on !AS / Attempt to 1 execute CERBERUS aborted!/4 2!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/C 3!_File:!_!_!AS!/!_Status:!_!_Command File Execution Unauthorized'< Parameter Cntrl_Str_3 = 'Security alarm on !AS / Attempt to 1 execute CERBERUS aborted!/4 2!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/C 3!_File:!_!_!AS!/!_Status:!_!_Error opening the privileged command 4 file' Character*256 Out_Buf= Integer*2 Out_Len, User_Len, Prc_Len, Tim_Len, Node_Len, Loc< Character Proc_Name*15, User_Name*12, Date_Time*24, Node*15 Structure /Message/ Union Map Byte Type, Enable(3) Integer*4 Req_Id Character*247 Msg End Map Map Character*255 String End Map End Union End Structure Record /Message/ Msg_BufLC===========================================================================LC........................................................................... Structure /Atr_Lst/ Union Map Integer*2 Atr_Size, Atr_Type Integer*4 Atr_Addr End Map Map Integer*4 End_List End Map End Union End Structure Record /Atr_Lst/ Atr_List(10)$ Atr_List(1).Atr_Size = Atr$S_Uic_Ro$ Atr_List(1).Atr_Type = Atr$C_Uic_Ro! Atr_List(1).Atr_Addr = %Loc(Uic) Atr_Lis t(2).End_List = 0FC.....................................................................FC===================================================================== C Get command file name9 IS=LIB$GET_FOREIGN(COMMAND,'Command file name: ',COMLEN)' IF (.NOT.IS) CALL SYS$EXIT(%VAL(IS))  Setprv_On(3) = 1" Loc = Index(Command(:6) , '/OFF')! If (Loc .Gt. 0) Setprv_On(3) = 0 If ( Setprv_On(3) .Eq. 0 ) Then2 IS = Iferr( SYS$CMKRNL( EXE_PPRV , SETPRV_ON) 1 , '%Cer-CMK') Call Exit End If 3 i = Iferr( Lib$Getjpi( Jpi$_Pid , , , Pid , , ) 1 , '%Cer-JPI$_PID' ). i = Iferr( Lib$Getjpi( Jpi$_Prcnam , , , ,3 1 Proc_Name , Prc_Len ) , '%Cer-JPI$PRCNAM' )0 i = Iferr( Lib$Getjpi( Jpi$_Username , , , , 1 User_Name , User_Len ) 2 , '%Cer-JPI$USERNAME' )6 i = Iferr( Lib$Sys_Asctim ( Tim_Len , Date_Time , , ) 1 , '%Cer-LIB$SYS_ASCTIM' )? i = Iferr( Lib$GetSyi( Syi$_NodeName , , Node , Node_Len , , ) 1 , '%Cer-LIB$GETSYI' )& Msg_Buf.Type = 3 ! Opc$_Rq_Rqst* Msg_Buf.Enable(1) = 7 ! Opc$_Rq_Security) Msg_Buf.Req_Id = 1 ! Opc$L_Ms_Rqstid9C Check to see if user has EXECUTE access to CERBERUS.COM< i = Iferr (Chk_Access ( User_Name(:User_Len) , Cerberus_Com. 1 , Arm$M_Execute) , '%Cer-CHK_ACCESS' ) LEN=INDEX(COMMAND,' ') IF (LEN.EQ.0) LEN=COMLENLC===========================================================================LC...........................................................................< j = Fid_And_Rsa ( Command(:Len), File_Spec, Spec_Len, Fid )! j = Iferr ( j , '%Cer-Rsa&Fid' )/ J = SYS$ASSIGN( File_Spec(:Spec_Len), CHAN,,)# IF(.NOT.J) CALL EXIT(J)  6 J = SYS$QIOW( , %VAL(CHAN), %VAL(IO$_ACCESS), IOSB,,,( 1 CHRFIB(1:10),,,,Atr_List,)& IF( .NOT. J .OR. .NOT. IOSB(1) ) Then Write(6,666) J,Iosb.666 Format(' Qio error on IO$_ACCESS, J =',Z8, 1 ' IOSB =',4Z6) End If8 J = SYS$QIOW( , %VAL(CHAN), %VAL(IO$_DEACCESS), IOSB,,, 1  CHRFIB(1:10),,,,,)FC.....................................................................FC=====================================================================% i = Iferr ( Sys$Fao ( Cntrl_Str_1 , 1 Out_Len, 2 Out_Buf, 3 Node(:Node_Len), 3 Date_Time, 4 %Val(Pid), 5 Proc_Name(:Prc_Len),. 6 File_Spec(:Spec_Len) ) , '%Cer-SYS$FAO' )* If ( .Not. i ) Call Lib$Signal( %Val(i) ) Msg_Buf.Msg = Out_Buf(:Out_Len)4 i = Iferr ( Send_Msg ( Msg_Buf.String(:Out_Len+8) ) 1 , '%Cer-SEND_MSG')9C If correct ownership, proceed: Disable control_Y's, set/C temporary privileges and pass command to DCL6 IS = Iferr( SYS$ASCTOID ('SYSTEMSSTAFF', LIDR, LAT) 1 ,'%Cer-ASCTOID' ) If ( Lid .Eq. Lidr ) Then3C IS = Iferr( LIB$DISABLE_CTRL(LIB$M_CLI_CTRLY)C 1 ,'%Cer-DIS_CTRL' )2 IS = Iferr( SYS$CMKRNL( EXE_PPRV , SETPRV_ON) 1 , '%CER-CMK') IS = Iferr( LIB$DO_COMMAND2 1 ('@' // Cerberus_Com //' '// COMMAND(:COMLEN)) 2 , '%Cer-LIB$DO_COMMAND')OC Note that this statement will not be executed unless the LIB$DO_COMMANDJC call fails. LIB$DO_COMMAND passes control to the CLI and does NOT3C return to this image upon completion. - DLDD IS = Iferr( LIB$ENABLE_CTRL(LIB$M_CLI_CTRLY), '%Cer-ENA_CTRL' ) Else Write (6,11):11 Format(' %Cer-F-Invalid_Own, Unauthorized input file' )B i = Iferr( Lib$Sys_Asctim ( Tim_Len , Date_Time , , ) , 'ASCTIM')% i = Iferr ( Sys$Fao ( Cntrl_Str_2 , 1 Out_Len, 2 Out_Buf, 3 Node(:Node_Len), 3 Date_Time, 4 %Val(Pid), 5 Proc_Name(:Prc_Len),) 6 File_Spec(:Spec_Len) ) , 'SYS$FAO' ) Msg_Buf.Msg = Out_Buf(:Out_Len)B i = Iferr ( Send_Msg ( Msg_Buf.String(:Out_Len+8) ) , 'SEND_MSG') End If Call Exit 10 Continue Write(6,22) Command(:Len)<22 Format(' %CER-F-OPNERR, error opening command file ', a )% i = Iferr ( Sys$Fao ( Cntrl_Str_3 , 1 Out_Len, 2 Out_Buf, 3 Node(:Node_Len), 3 Date_Time, 4 %Val(Pid), 5 Proc_Name(:Prc_Len), 6 Command(:Len) ) , )* If ( .Not. i ) Call Lib$Signal( %Val(i) ) Msg_Buf.Msg = Out_Buf(:Out_Len)8 i = Iferr ( Send_Msg ( Msg_Buf.String(:Out_Len+8) ) , ) Call Exit End Subroutine Send_Msg ( Message ) Character*(*) Message Integer*4 i, Iferr, Sys$Sndopr* i = Iferr ( Sys$Sndopr ( Message , ) , )  Return End.*[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.LNK;4+,a./0 4D^-8A0123KPWO56k|7@>I89G0HJ$ Link /Map /Notrace -D Cerberus,Setprv,Fid_And_Rsa,Chk_Access,Iferr,Sys$System:Sys.Stb/Sel.*[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.MAP;6+,./0 4^-8A0123KPWO56`PK7`>>I89G0HJ 16-JAN-1992 13:04 VAX-11 Linker V05-05 Page 1G +------------------------+G ! Object Module Synopsis !G +------------------------+lModule Name Ident Bytes File Creation Date Creatorl----------- ----- ----- ----- ------------- -------vCERBERUS 01 4347 IST$ROOT:[CERBERUS]CERBERUS.OBJ;33 16-Jan-1992 13:03 VAX FORTRAN V5.6-119vSEND_MSG 01 75 IST$ROOT:[CERBERUS]CERBERUS.OBJ;33 16-Jan-1992 13:03 VAX FORTRAN V5.6-119sSETPRV V01.01 96 IST$ROOT:[CERBERUS]SETPRV.OBJ;3 11-NOV-1991 13:28 VAX MACRO T5.2V-4vFID_AND_RSA 0 1092 IST$ROOT:[CERBERUS]FID_AND_RSA.OBJ;4 11-NOV-1986 10:35 VAX/VMS Macro V04-00vCHK_ACCESS 01 239 IST$ROOT:[CERBERUS]CHK_ACCESS.OBJ;3 7-Nov-1986 14:33 VAX FORTRAN V4.5-219vIFERR 0 99 IST$ROOT:[CERBERUS]IFERR.OBJ;1 19-SEP-1986 16:31 VAX/VMS Macro V04-00vSYS X-124U6U13 0 SYS$COMMON:[SYSEXE]SYS.STB;1 19-JUN-1990 04:38 VAX-11 Linker V05-05H +--------------------------+H ! Program Section Synopsis !H +--------------------------+kPsect Name Module Name Base End Length Align Attributesk---------- ----------- ---- --- ------ ----- ----------$PDATA 00000200 000005A3 000003A4 ( 932.) QUAD 3 PIC,USR,CON,REL,LCL, SHR,NOEXE, RD,NOWRT,NOVECP CERBERUS 00000200 0000059D 0000039E ( 926.) QUAD 3P CHK_ACCESS 000005A0 000005A3 00000004 ( 4.) LONG 2$LOCAL 00000600 00000FEF 000009F0 ( 2544.) QUAD 3 PIC,USR,CON,REL,LCL,NOSHR,NOEXE, RD, WRT,NOVECP CERBERUS 00000600 00000F2F 00000930 ( 2352.) QUAD 3P SEND_MSG 00000F30 00000F4F 00000020 ( 32.) QUAD 3P CHK_ACCESS 00000F50 00000FEF 000000A0 ( 160.) LONG 2DATA 00000FF0 000013A8 000003B9 ( 953.) BYTE 0 NOPIC,USR,CON,REL,LCL,NOSHR,NOEXE, RD, WRT,NOVECP FID_AND_RSA 00000FF0 000013A8 000003B9 ( 953.) BYTE 0$CODE 00001400 000018A6 000004A7 ( 1191.) QUAD 3 PIC,USR,CON,REL,LCL, SHR, EXE, RD,NOWRT,NOVECP CERBERUS 00001400 0000182C 0000042D ( 1069.) QUAD 3P SEND_MSG 00001830 0000185A 0000002B ( 43.) QUAD 3P CHK_ACCESS 0000185C 000018A6 0000004B ( 75.) LONG 2CODE 000018A7 0000192D 00000087 ( 135.) BYTE 0 NOPIC,USR,CON,REL,LCL,NOSHR, EXE, RD,NOWRT,NOVECP FID_AND_RSA 000018A7 0000192D 00000087 ( 135.) BYTE 0EXE_PPRV 0000192E 0000198D 00000060 ( 96.) BYTE 0 NOPIC,USR,CON,REL,LCL,NOSHR, EXE, RD,NOWRT,NOVECP SETPRV 0000192E 0000198D 00000060 ( 96.) BYTE 0$RMSNAM 00001A00 00001A03 00000004 ( 4.) BYTE 0 NOPIC,USR,CON,REL,LCL,NOSHR, EXE, RD, WRT,NOVECP FID_AND_RSA 00001A00 00001A03 00000004 ( 4.) BYTE 0. BLANK . 00001A04 00001A66 00000063 ( 99.) BYTE 0 NOPIC,USR,CON,REL,LCL,NOSHR, EXE, RD, WRT,NOVECP IFERR 00001A04 00001A66 00000063 ( 99.) BYTE 0C +-----------------+C  ! Symbols By Name !C +-----------------+Symbol Value Symbol Value Symbol Value ------ ----- ------ ----- ------ ----- CERBERUS 00001400-R SEND_MSG 00001830-R SYS$K_VERSION_04 00010040 CHK_ACCESS 0000185C-R SYS$EXIT 7FFEDF40 SYS$K_VERSION_05 00010040 CTL$GL_PCB 7FFEFF58 SYS$K_VERSION 01000000 SYS$K_VERSION_06 00010040 CTL$GQ_PROCPRIV 7FFEFF10 SYS$K_VERSION_00 01000000 SYS$K_VERSION_07 00010000 EXE_PPRV 0000192E-R SYS$K_VERSION_01 00010040 SYS$K_VERSION_08 00010000 FID_AND_RSA 000018A7-R SYS$K_VERSION_02 00010040 SYS$K_VERSION_09 00010040 IFERR 00001A04-R SYS$K_VERSION_03 00010040 SYS$K_VERSION_10 00010040  IST$ROOT:[CERBERUS]CERBERUS.EXE;1 16-JAN-1992 13:04 VAX-11 Linker V05-05 Page 2Symbol Value Symbol Value Symbol Value ------ ----- ------ ----- ------ ----- ,SYS$K_VERSION_11 00010040 ,SYS$K_VERSION_12 00010040 ,SYS$K_VERSION_13 00010040 ,SYS$K_VERSION_14 00010040 ,SYS$K_VERSION_15 00010040 ,SYS$K_VERSION_16 00010040 $ Key for special characters above: +------------------+ ! * - Undefined ! ! U - Universal ! ! R - Relocatable ! ! X - External ! ! WK - Weak ! ! M - Mask value ! +------------------+ IST$ROOT:[CERBERUS]CERBERUS.EXE;1 16-JAN-1992 13:04 VAX-11 Linker V05-05 Page 3C +----------------+C ! Image Synopsis !C +----------------+eVirtual memory allocated: 00000200 00001DFF 00001C00 (7168. bytes, 14. pages)AStack size: 20. pagesTImage header virtual block limits: 1. 1. ( 1. block)UImage binary virtual block limits: 2. 15. ( 14. blocks)=Image name and identification: CERBERUS 01;System component mask: 000110106 SYS$K_VERSION_PROCESS_SCHED 1,646 SYS$K_VERSION_STABLE 1,646 SYS$K_VERSION_SHELL 1,64;Number of files: 12.;Number of modules: 12.;Number of program sections: 15.;Number of global symbols: 482.;Number of image sections: 24.:User transfer address: 00001400;Number of code references to shareable images: 15.=Image type: EXECUTABLE.cMap format: DEFAULT in file IST$ROOT:[CERBERUS]CERBERUS.MAP;6<Estimated map length: 55. blocksE +---------------------+E ! Link Run Statistics !E e#~ SOURCE.BCK8A.[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.MAP;6C+---------------------+ SPerformance Indicators Page Faults CPU Time Elapsed Time5S---------------------- ----------- -------- -------------U Command processing: 102 00:00:00.19 00:00:00.43 U Pass 1: 208 00:00:00.58 00:00:02.52NU Allocation/Relocation: 36 00:00:00.04 00:00:00.35 U Pass 2:  54 00:00:00.23 00:00:00.81 U Map data after object module synopsis: 5 00:00:00.04 00:00:00.07[U Symbol table output: 2 00:00:00.00 00:00:00.10 UTotal run values: 407 00:00:01.08 00:00:04.28AXUsing a working set limited to 1350 pages and 92 pages of data storage (excluding image)5Total number object records read (both passes): 435 U of which 23 were in libraries and 16 were DEBUG data records containing 497 bytesa6Number of modules extracted explicitly = 01 with 1 extracted to resolve undefined symbols ?0 library searches were for symbols not in the library searched$4A total of 0 global symbol table records was writtenTLINK/MAP/NOTRACE CERBERUS,SETPRV,FID_AND_RSA,CHK_ACCESS,IFERR,SYS$SYSTEM:SYS.STB/SEL/*[USERS.DENTON_D.DECUS.LT.SOURCE]CERBERUS.OBJ;33+,ʤo. /0 4 -8A0123KPWO 56HӁK7i>I89G0HJ3CERBERUS0116-Jan-1992 13:0316-Jan-1992 13:03VAX FORTRAN V5.6-119CERBERUSPSys$library:cerberus.comSecurity alarm on !AS / Executing CERBERUS!/!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/!_File:!_!_!ASSecurity alarm on !AS / Attempt to execute CERBERUS aborted!/!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/!_File:!_!_!AS!/!_Status:!_!_Command File Execution UnauthorizedSecurity alarm on !AS / Attempt to execute CERBERUS aborted!/!_Time:!_!_!AS!/!_PID:!_!_!XL!/!_User Name:!_!AS!/!_File:!_!_!AS!/!_Status:!_!_Error opening the privileged command fileCommand file name: /OFF%Cer-CMK%Cer-JPI$_PID%Cer-JPI$PRCNAM%Cer-JPI$USERNAME%Cer-LIB$SYS_ASCTIM%Cer-LIB$GETSYI%Cer-CHK_ACCESS %Cer-Rsa&Fid%Cer-SYS$FAO%Cer-SEND_MSGSYSTEMSSTAFF%Cer-ASCTOID%CER-CMK%Cer-LIB$DO_COMMAND%Cer-ENA_CTRLASCTIMSYS$FAOSEND_MSG Qio error on IO$_ACCESS, J = IOSB =, %Cer-F-Invalid_Own, Unauthorized input file+ %CER-F-OPNERR, error opening command file )CERBERUSPp xwvv $ LIB$GET_FOREIGN@DLEXE_PPRVl IFERR@ && IFERR@44 IFERR@ DD IFERR@V$V IFERR@ jTj IFERR@hp CHK_ACCESS@zz IFERR@  IFERR@  2p  4p@l1|1 SYS$FAO@  IFERR@  IFERR@  SYS$ASCTOID@  IFERR@EXE_PPRV8 IFERR@L\ IFERR@ x IFERR@ IFERR@ SYS$FAO@ IFERR@   IFERR@QPK[XP`ZP`\P>8``P`dLIB$GET_FOREIGNPPxtSYS$EXITT˰ˀˌ LIB$INDEXPPTT˘ SYS$CMKRNLP^˰ˬIFERR^FOR$EXIT˸ LIB$GETJPIP^IFERR^ LIB$GETJPIP^ IFERR^ LIB$GETJPIP^@<IFERR^HLIB$SYS_ASCTIMP^hdIFERR^p LIB$GETSYIP^˘˔IFERR^XP`YP`\P`2PPˠˤ˰ CHK_ACCESSP^IFERR^ LIB$INDEXPЫPP˰ FID_AND_RSAP IFERR2\\˯  SYS$ASSIGNP4FOR$EXIT2L<@XpDSYS$QIOWPRR˨ FOR$WRITE_SFR FOR$IO_L_V? FOR$IO_X_DA FOR$IO_END2ˈ<|ˀSYS$QIOW2VV˼Ы 2WW\˯SYS$FAOP^IFERR^PP  LIB$SIGNAL2P,Pˮ `P2PPPXSEND_MSGP^0,IFERR^@ SYS$ASCTOIDP^\XIFERR^8k1d SYS$CMKRNLP^|xIFERR^X«^(˰nЫY ~Y^(nY@~YY˄YX^ˈˌLIB$DO_COMMANDX^P^ˠ˜IFERR^˨LIB$ENABLE_CTRLP^˼˸IFERR^1@ FOR$WRITE_SF FOR$IO_ENDLIB$SYS_ASCTIMP^IFERR^VЫ $W\˯ SYS$FAOP^<8IFERR^2P,Pˮ `P2PPPDXHLSEND_MSGP^`\IFERR^FOR$EXIT KCERBERUSEXE_PPRVLIB$GET_FOREIGN LIB$SIGNALLIB$ENABLE_CTRLSYS$QIOWLIB$DO_COMMAND SYS$CMKRNL SYS$ASCTOID SYS$ASSIGNSYS$FAO LIB$GETJPI LIB$GETSYILIB$SYS_ASCTIMIFERRSEND_MSG CHK_ACCESS FID_AND_RSASYS$EXIT LIB$INDEXFOR$EXIT-$CODE$PDATA0 $LOCAL FOR$IO_END FOR$IO_L_V FOR$IO_X_DA FOR$WRITE_SFP4P ZPdP#cPP PP)jPPnP{o q -3SEND_MSG0116-Jan-1992 13:0316-Jan-1992 13:03VAX FORTRAN V5.6-119SEND_MSGSEND_MSGhPPH[}PQPk SYS$SNDOPRP^IFERR^ HSEND_MSGIFERR SYS$SNDOPR+$CODE$PDATA $LOCAL +0*[USERS.DENTON_D.DECUS.LT.SOURCE]CHK_ACCESS.FOR;3+,./0 4@-8A0123KPWO5 6IѶy7 T>I89G0HJ@ Integer*4 Function Chk_Access ( User_Name , Obj_Name , Access ) Implicit Integer (a-z) Include '($Chpdef)' Include '($Acldef)'& Character Obj_Name*(*), User_Name*(*) Structure /Itmlst/ Union Map Integer*2 Buflen, Itmcod Integer*4 Bufadr, RetLenAdr End Map Map Integer*4 End_List End Map End Union End Structure# Record /Itmlst/ Chk_Access_Lst(10) Chk_Access_Lst(1).Buflen = 4* Chk_Access_Lst(1).Itmcod = Chp$_Access+ Chk_Access_Lst(1).Bufadr = %Loc(Access) Chk_Access_Lst(1).RetLenAdr = 0 Chk_Access_Lst(2).End_List = 0) Status = Sys$Check_Access ( Acl$C_File , 1 Obj_Name , 2 User_Name , 3 Chk_Access_Lst ) Chk_Access = Status Return End0*[USERS.DENTON_D.DECUS.LT.SOURCE]CHK_ACCESS.OBJ;3+,N../0 4-8A0123KPWO5 6ֶy7`jџ>I89G0HJ5 CHK_ACCESS01 7-Nov-1986 14:33 7-Nov-1986 14:33VAX FORTRAN V4.5-219 CHK_ACCESS P CHK_ACCESS|P|PH|[}PQPk}PQ PP`P`P޼ `P`P`SYS$CHECK_ACCESS` H CHK_ACCESSSYS$CHECK_ACCESSK$CODE$PDATA$LOCAL}K/*[USERS.DENTON_D.DECUS.LT.SOURCE]DISK_FRAG.MAR;1+,H-. /0 4Q -8A0123KPWO!5^6dĄa7bH89@dHG0HJ .TITLE READ_BITMAP5; This program will read the storage bitmap file into4; an extension of process virtual address space. It6; will then look at the string as one long bit string,?; and dump out the ranges ofareas on the disk (according to the6; bitmap), that are not in use. This will serve as an.; indicator of fragmentation of a disk volume.;; Author: P.J. LoVecchio;:; Numerous modifications to the code...to obtain sizes in /; each range, largest piece in each range, etc.;; Symbolic definitions; .LIBRARY /SYS$LIBRARY:LIB/; $FABDEF ;FAB definitions) $DVIDEF ;$GETDVI item code definitions- $SCBDEF ;Storage Control Block definitions% $SECDEF ;Section flags for $CRMPSC;$; Macro definitions used in the code;) .MACRO DO_OUTPUT CONTROL,BUFFER,ARG1=0,-* ARG2=0,ARG3=0,ARG4=0,LENGTH=0,ARG5=0,- ARG6=0,ARG7=0< $FAO_S ctrstr=CONTROL,outbuf=BUFFER,outlen=LENGTH,p1=ARG1,-1 p2=ARG2,p3=ARG3,p4=ARG4,p5=ARG5,p6=ARG6,p7=ARG7 PUSHAL BUFFER CALLS #1,G^LIB$PUT_OUTPUT .ENDM DO_OUTPUT; .MACRO CLEAR_SCREEN) PUSHL #1 ;Erase the screen, if on a VT PUSHL #1 CALLS #2,G^SCR$ERASE_PAGE .END CLEAR_SCREEN .MACRO WAIT PUSHAL PROMPT2 PUSHAL OUTPUT2 CALLS #2,G^LIB$GET_INPUT .ENDM WAIT;; End of macro definitions;; Constant definitons;CR=13LF=10; .PSECT DATA PIC,NOEXE,LONG,WRT .ALIGN LONG*INFAB: $FAB fop=UFO ;FAB for bitmap file;); Descriptors for various names/locations;,MESSAGE:.ASCID /No such device by that name/"PROMPT: .ASCID /Disk device name>/1COLON: .ASCID /:/ ;Colon descriptor for testing(PROMPT2:.ASCID / Hit to continue/,DEVICE: .BLKW 1 ;Dynamic string descriptor% .BYTE 14,2 ;for device name string .BLKL 14NAME: .ASCID /[0,0]BITMAP.SYS/ ;File spec for bitmap1RESULT: .BLKW 1 ;Resultant file spec for concat% .BYTE 14,2 ;of device and filespec .BLKL 1QINITIAL:.ASCII /Note that this program shows the free space as reflected/L .ASCII ?by the storage bitmap --> [0,0]BITMAP.SYS. When a VAX/VMS?K .ASCII /disk is mounted, approximately 10 - 15 % of the available/K .ASCII /free space is marked as allocated in the bitmap, and used/J .ASCII /for the bitmap cache by the XQP. Thus the displays that/J .ASCII /this program shows do not reflect the information in the/G .ASCII /cache, rather only the BITMAP itself./INITLEN=.-INITIALINITDSC:.LONG INITLEN .ADDRESS INITIAL;%; FAO descriptors and control strings;*FINAL_DESC: ;FAO desc for final summary .LONG FINAL_LENGTH .ADDRESS FINAL'FINAL: .ASCII ?!/!/!/Device !AS?% .ASCII ?!/Free blocks !UL (total)?& .ASCII ?!/Free blocks !UL (bitmap)? .ASCII ?!/Total blocks !UL ?% .ASCII ?!/Free space !UL % !UL %? .ASCII ?!/Largest piece !UL!/?FINAL_LENGTH=.-FINAL3HEADER: .ASCII /Contiguous ranges for device !15AS/G .ASCII ?!/!/!_RANGE!_!_PIECES !_% OF PCS % FREE RANGE TOT LARGEST?J .ASCII ?!/!_-------------!_------!_-------- ------ --------- -------?HEADER1:.LONG .-HEADER .ADDRESS HEADEROUTPUT2:.LONG 280 .ADDRESS BUFFER3BUFFER3:.BLKB 280OCTRSTR1:.ASCID /!8UL - !8UL: !8UL!_!8UL!6UL !8UL !8UL/ ;FAO control string5CONTROL:.ASCII ?Information for disk volume !AS !/!/? .ASCII ?Cluster factor !8UL!/? .ASCII ?Volume size !8UL!/? .ASCII ?Block factor !8UL!/? .ASCII ?Sectors/track !8UL!/? .ASCII ?Total tracks !8UL!/? .ASCII ?Total Cylinder !8UL!/? .ASCII ?Volume label !AD !/? .ASCII ?Time of mount !%D!/!/?TEMP=.-CONTROL=CONTROL2:.ASCID /Range= !8UL R10= !8UL R8= !8UL Total= !8UL/DESC: .LONG TEMP .ADDRESS CONTROLOUTPUT: .LONG 80 .ADDRESS BUFFER2BUFFER2: .BLKB 80;; LIB$GETDVI and related items;8DVIITEM:.LONG DVI$_FREEBLOCKS ;Item desc for LIB$GETDVI(FREE: .BLKL 1 ;For free blocks storage;;; Disk volume items from the bitmap's storage control block;)MAXBLOCK:.BLKL 1 ;For max block storage*CLUSTER:.BLKL 1 ;For volume cluster size-BLKSIZE:.BLKL 1 ;For volume blocking factor%SECTORS:.BLKL 1 ;For volume sectors$TRACKS: .BLKL 1 ;For volume tracks)CYLINDERS:.BLKL 1 ;For volume cylinders0VOLNAME:.BLKB 12 ;For volume lock (label) name-TIME: .BLKQ 1 ;For volume's last mount time;; $CRMPSC items;-INADR: .LONG 0 ;Passed addresses to $CRMPSC .LONG 0 ;Says to use P0 space/SYSADR:.BLKQ 1 ;Return addresses from $CRMPSC;;&; Miscellaneous locations and counters;0START: .LONG 0 ;Start block for array checking4END: .LONG 100 ;End block value for array checking)NUMBERS:.BLKL 10000 ;Array for counters/NUMBERS2:.BLKL 10000 ;Array for size counters0LARGEST:.BLKL 10000 ;Holds largest free pieces.LARGEST2:.BLKL 1 ;Holds largest single pieceREM: .BLKL 1 ;Counters$BITS: .BLKL 1 ;Bits in bitmap file2STARTPOS:.BLKL 1 ;Start position of colon holder(BLOCKS: .BLKL 1 ;Blocks in bitmap file)FREE1: .BLKL 1 ;First free block number)FREE2: .BLKL 1 ;End of free block range5RANGE: .BLKQ 1 ;Number of free blocks in this range,SWITCH: .LONG 0 ;Switch to show LBN rangesSWITCH2:.LONG 1 .ADDRESS ONE ONE: .BLKB 12LOGICAL:.ASCID /BITMAP$LBNS/ ;Logical name to set'COUNTER:.LONG 10 ;Output line counter;; Code section; .PSECT CODE PIC,NOWRT,LONG+ .ENTRY BITMAP, ^M<> ;Entry point and mask3TOP: PUSHAL PROMPT ;Prompt for, and obtain device PUSHAL DEVICE ;name string CALLS #2,G^LIB$GET_INPUT TSTW DEVICE ;Any input ? BNEQ 10$ ;Continue if so JMP ENDER ;Branch out if not10$:- PUSHAL DEVICE ;Convert to uppercase so the+ PUSHAL DEVICE ;translate logical doesn't CALLS #2,G^STR$UPCASE ;go nuts; 2 PUSHAL STARTPOS ;Check for the colon character--+ PUSHAL COLON ;the translate logical does- PUSHAL DEVICE ;not deal with actual device0 CALLS #3,G^STR$POSITION ;names w/o the colon... TSTL R0 ;R0=position of colon BNEQ 14$;0 PUSHAL COLON ;If colon not present; append it+ PUSHAL DEVICE ;to the device name string CALLS #2,G^STR$APPEND; .14$: PUSHAL DEVICE ;See if name passed is a " PUSHL #0 ;logical name, and get+ PUSHAL DEVICE ;correct equivalence if so CALLS #3,G^LIB$SYS_TRNLOG  BLBS R0,11$ ;Check status JMP ERR 11$:& PUSHAL NAME ;Concatenate the device! PUSHAL DEVICE ;and bitmap file" PUSHAL RESULT ;specification... CALLS #3,G^STR$CONCAT - BLBS R0,13$ ;Check status,continue if okay JMP ERR 13$:4 PUSHAL SWITCH2 ;See if a logical name BITMAP$LBNS- PUSHL #0 ;is defined; if so, a value of 18 PUSHAL LOGICAL ;means to show the LBN ranges as found CALLS #3,G^LIB$SYS_TRNLOG # CMPL R0,#SS$_NOTRAN ;Check status* BEQL 12$ ;Continue if no logical is set7 MOVL #1,SWITCH ;If the logical is present, set switch12$:: MOVL RESULT+4,INFAB+FAB$L_FNA;Set file name string in FAB> MOVB RESULT,INFAB+FAB$B_FNS ;Set file name string size in FAB;NEXT: $OPEN FAB=INFAB ;Open the bitmap file to get channel BLBS R0,10$ ;Check status JMP ERR10$:7 MOVZWL INFAB+FAB$L_STV,R10 ;Get channel number to file $CRMPSC_S inadr=INADR,- retadr=SYSADR,- flags=#SEC$M_EXPREG,-- chan=R10 ;Map the bitmap as a priv section. BLBS R0,11$ ;Check status, continue if okay RET11$:;=; Get various items of volume information about the disk fromE; the first "block" of the bitmap that is now in our address space...;7 MOVL SYSADR,R11 ;Get start of space mapped by $CRMPSC MOVZWL SCB$W_CLUSTER(R11),-( CLUSTER ;Get volume's cluster factor MOVL SCB$L_VOLSIZE(R11),-) MAXBLOCK ;Get size of volume in blocks MOVL SCB$L_BLKSIZE(R11),-) BLKSIZE ;Get volume's blocking factor MOVQ SCB$Q_MOUNTTIME(R11),-! TIME ;Get volume's mount time MOVL SCB$L_SECTORS(R11),-& SECTORS ;Get volume's sector count MOVL SCB$L_TRACKS(R11),- TRACKS ;Get volume's tracks MOVL SCB$L_CYLINDER(R11),-$ CYLINDERS ;Get volume's cylinders" MOVC3 #12,SCB$T_VOLOCKNAME(R11),-+ VOLNAME ;Get volumes' lock (label) name;! PUSHAL INITDSC ;Initial screen CALLS #1,G^LIB$PUT_OUTPUT;$ $FAO_S ctrstr=DESC,outbuf=OUTPUT2,-0 p1=#DEVICE,p2=CLUSTER,p3=MAXBLOCK,p4=BLKSIZE,-% p5=SECTORS,p6=TRACKS,p7=CYLINDERS,-: p8=#12,p9=#VOLNAME,p10=#TIME ;Dump the bitmap's hdr info PUSHAL OUTPUT2 CALLS #1,G^LIB$PUT_OUTPUT; WAIT;;-; Main loop for reading bits and calculations;6 DIVL3 CLUSTER,MAXBLOCK,BITS ;Get total bits in bitmap2 ADDL2 #512,R11 ;Point to 1st actual bitmap block;; Register usage:.; R3 = hold address of largest segment array2; R4 = holds address of total extent sizes array); R5 = # of extents in each block range*; R6 = total of free extents on the disk-; R7 = base address of extent counter array,; R8 = next bit in bitmap array to FFS/FFC); R9 = total free blocks per the BITMAP,; R10= index into the extent counter array0; R11= holds % of each extent to total extents;3 MOVAB LARGEST,R3 ;Load address of "largest" array7 MOVAB NUMBERS2,R4 ;Load address of size array element$ CLRL R6 ;Use R6 as extent counter/ MOVAB NUMBERS,R7 ;Load address of 1st element& CLRL R8 ;Use R8 as pointer register! CLRL R9 ;Use R9 as accumulator( CLRL R10 ;Use R10 as index into array;A; Loops that read the bitmap and figure out free/allocated blocks;*LOOP2: CMPL BITS,R8 ;Read all bits yet ?0 BGTR 1$ ;If not, continue to look for set bit1 JMP DONE ;If done, jump out of loop for calcs.;1$: FFS R8,#32,(R11),R8 ;Look for 1st set bit, put into R81 BEQL LOOP2 ;Z-bit set means no free blocks yet6GOT_SET_BIT: ;Fall through here is we found set bit? MULL3 CLUSTER,R8,FREE1 ;Get logical block number of free block*LOOP3: CMPL BITS,R8 ;Read all bits yet ?2 BGTR 1$ ;If not, continue to look for clear bit1 JMP DONE ;If done, jump out of loop for calcs.?1$: FFC R8,#32,(R11),R8 ;Fall thru here to find next alloc blk2 BEQL LOOP3 ;Z-bit set means no alloc blocks yet2GOT_CLEAR_BIT: ;Fall thru here to find range...? MULL3 CLUSTER,R8,FREE2 ;Get logical block number of alloc blk@ SUBL3 FREE1,FREE2,RANGE ;Get the number of blocks in this range3 ADDL2 RANGE,R9 ;Keep running total of free blocksA2$: EDIV #100,RANGE,R10,R2 ;Bias to get correct index into arrays0 TSTL R2 ;Check remainder: if it's 0, then we3 BNEQ 1$ ; hit an "even" extent (and subtract 1)* DECL R10 ;If not, leave the index alone51$: CMPL BITS,R8 ;One more sanity check for done.... BLEQ DONE ;If so, do final calcs and output3 INCL (R7)[R10] ;Increment extent counter locatoin6 ADDL2 RANGE,(R4)[R10] ;Increment size array location4 CMPL RANGE,LARGEST2 ;Largest piece we've hit yet ?& BLEQ 4$ ;Keep current if not bigger/ MOVL RANGE,LARGEST2 ;Save this size if larger?4$: CMPL RANGE,(R3)[R10] ;Largest piece in this extent range ?% BLEQ 3$ ;Keep current piece if not5 MOVL RANGE,(R3)[R10] ;Save new size if it is larger/3$: INCL R6 ;Increment count of total extents' TSTL SWITCH ;Show this range, etc. ?) BEQL 5$ ;Don't bother if not requested5 CALLS #0,SHOW_LBNS ;Call routine if switch is "set"*5$: BRW LOOP2 ;No, look for next set bit;#; Final calculations and outputs...;DONE:+ MOVL #1,START ;Set up initial start value/ MOVL #100,END ;Set up initial end range value4 MOVAL LARGEST,R3 ;Reset R3 to largest size element6 MOVAL NUMBERS,R7 ;Reset R7 to initial array location5 MOVAL NUMBERS2,R8 ;Reset R8 to initial size element1 CLRL R10 ;Index to first (0) element initially;D; Call $GETDVI to get the "actual" number of free blocks on the disk;) PUSHAL FREE ;Receives free block count PUSHAL DEVICE ;for this disk& PUSHL #0 ;Omit the channel argument# PUSHAL DVIITEM ;DVI item we want) CALLS #4,G^LIB$GETDVI ;Call the routine;$ TSTL SWITCH ;See if switch is set BEQL 10$ ;Contine if so;H10$: $FAO_S ctrstr=HEADER1,outbuf=OUTPUT2,- ;Output top lines in display p1=#DEVICE PUSHAL OUTPUT2 CALLS #1,G^LIB$PUT_OUTPUT;-LOOP4: ;MACRO's a lot of work, isn't it ?+ CMPL #10000,R10 ;Compare to maximum index BGTR 1$ ;Continue if not done+ JMP NEXT3 ;Branch out if done processing,1$: TSTL (R7) ;Any extents in this range ?$ BEQL NEXT2 ;Branch around if none9 MULL3 #100,(R7),R5 ;Bias extent count by 100 for % calc4 DIVL3 R6,R5,R4 ;Get % of total extents /this rangeB MULL3 #100,(R8)[R10],R11 ;Bias this range total by 100 for % calc6 DIVL2 R9,R11 ;Get % of total free / this range free92$: MOVL (R8)[R10],R0 ;Pick up total size for this range9 MOVL (R3)[R10],R1 ;Pick up largest piece for this range DO_OUTPUT -$ CTRSTR1,OUTPUT,START,END,(R7),R4,,- R11,R0,R1 ;Do the outputNEXT2:7 ADDL2 #100,START ;Point START to next range beginning0 ADDL2 #100,END ;Point END to next range finish. ADDL2 #4,R7 ;Point R7 to next array element, INCL R10 ;Incr R10 for next array element+ CMPL #10000,R10 ;Compare to maximum index, BLSS NEXT3 ;Branch out if done processing JMP LOOP4 ;Loop back if not;; Final summary output;NEXT3:5 MULL3 #100,FREE,R1 ;Bias freeblocks for calculation1 DIVL3 MAXBLOCK,R1,R0 ;Get Free block percentage4 MULL3 #100,R9,R10 ;Bias bitmap freeblocks for calc6 DIVL2 MAXBLOCK,R10 ;Get bitmap free block percentage $FAO_S ctrstr=FINAL_DESC,- outlen=OUTPUT2,- outbuf=OUTPUT2,- p1=#DEVICE,p2=FREE,- p3=R9,p4=MAXBLOCK,-' p5=R0,p6=R10,- ;Format output string p7=LARGEST2 PUSHAL OUTPUT2 CALLS #1,G^LIB$PUT_OUTPUT;ENDER:3 $CLOSE fab=INFAB ;Break the channel to the bitmap3 MOVL #SS$_NORMAL,R0 ;Set normal completion status RET0ERR: PUSHAL MESSAGE ;and tell this bozo device) CALLS #1,G^LIB$PUT_OUTPUT ;name is bogus RET;E; Subroutine that will show specific ranges found (if SWITCH is "on"); .PSECT DATAACTR1: .ASCID /Found at Start block !8UL End block !8UL Size !8UL/ BUF: .LONG 80 .LONG STORAGESTORAGE:.BLKB 80LINES: .LONG 20; .PSECT CODE .ENTRY SHOW_LBNS, ^M<>5 $FAO_S ctrstr=CTR1,outbuf=BUF,- ;Build output string p1=FREE1,p2=FREE2,- p3=RANGE PUSHAL BUF ;And display it CALLS #1,G^LIB$PUT_OUTPUT& DECL LINES ;Decrement line counter& BGTR 10$ ;Continue if not yet zero% MOVL #20,LINES ;Reset line counter( WAIT ;Let user tell you to continue10$: MOVL #SS$_NORMAL,R0 RET .END BITMAP1*[USERS.DENTON_D.DECUS.LT.SOURCE]FID_AND_RSA.MAR;3+,;./0 4:-8A0123KPWO5 6|7#>I89G0HJ .Title Fid_And_Rsa; .Psect Data,Noexe,WrtNam_Blk:, $Nam Rsa=Res_Str,- ; Result buffer address) Rss=Nam$C_Maxrss,- ; Result buffer size* Esa=Exp_Str,- ; Expanded buffer address- Ess=Nam$C_Maxrss ; Expanded buffer size Fab_Blk: $Fab Fna=Inp_Str,- Fop=Nam,- Dnm=<.Com>,- Nam=Nam_Blk$Exp_Str: ; Expanded string buffer .Blkb Nam$C_Maxrss%Res_Str: ; Resultant string buffer .Blkb Nam$C_Maxrss+Res_Str_D: ; Resultant string descriptor .Blkl 1 .Long Res_Str!Inp_Str: ; Input string buffer .Blkb 255%Inp_Str_Len: ; Input string length .Blkl 1 .Psect Code,Exe,Nowrt) .Entry Fid_And_Rsa,^m Movzwl 4(Ap),r6 Movzbl (r6),r7 Movc3 r7,@4(r6),Inp_Str Movb r7,- ; Set string size Fab_Blk+Fab$B_Fns* $Parse Fab=Fab_Blk ; Parse the file spec' Blbc r0,F_Err ; Quit and signal error; $Search Fab=Fab_Blk Blbc r0,Open_Err 4 Movzbl Nam_Blk+Nam$B_Rsl,r7 ; Get RSA String Length Movw r7,@12(ap) Movzwl 8(ap),r6# Movc3 r7,@Nam_Blk+Nam$L_Rsa,@4(r6) Movl 16(ap),r6 Movw Nam_Blk+Nam$W_Fid,(r6) Movw Nam_Blk+Nam$W_Fid+2,2(r6) Movw Nam_Blk+Nam$W_Fid+4,4(r6) Movl #1,r0 Brw Exit Open_Err: Ret;:F_Err: Pushl Fab_Blk+Fab$L_Stv ; Push STV and STS on stack+ Pushl Fab_Blk+Fab$L_Sts ; in reverse order& Calls #2,G^Lib$Signal ; Signal error Exit: Ret .End1*[USERS.DENTON_D.DECUS.LT.SOURCE]FID_AND_RSA.OBJ;4+,֧}<./0 4R-8A0123KPWO56Q/J|7V%>I89G0HJ5 FID_AND_RSA011-NOV-1986 10:35 VAX/VMS Macro V04-00MAC/LIS FID_AND_RSA - LIB$SIGNAL SYS$PARSE SYS$SEARCH . ABS .PDATAP$ABS$P`Q^QQQQQQL`PPQNQQQ$RMSNAMBP.ComPQQQQQQQQCODEP  FID_AND_RSA&<VfW(WW`43` SYS$PARSEPJ` SYS$SEARCHP93WW <V(W3ЬV$3f$33$33P1` 3`3 LIB$SIGNAL, FID_AND_RSA FID_AND_RSA:DATA$RMSNAMCODE/*[USERS.DENTON_D.DECUS.LT.SOURCE]FILE_FRAG.MAR;1+,I . /0 4H -8A0123KPWO!5^6@M˄a7@DH89@dHG0HJ .TITLE READINDEX; ; Author:; ; P.J. Lovecchio, Jr.;; Functional description:;>; Routine to read the INDEXF.SYS file, and dump each file nameA; with the number of mapping pointers in use...note that symbolic@; offsets into the home block and into the file header are takenB; from the symbolic definition files $FH2DEF,$FI2DEF, and $HM2DEF,G; which are located in the library SYS$LIBRARY:LIB.MLB. NOTE that this?; program does NOT check the delete bit in the file header, and?; therefore some files may be displayed that have actually been4; deleted, yet the file header has NOT been re-used.;; INPUT:;*; None. Program will prompt for disk name.; ; OUTPUT:;); SS$_NORMAL normal successful completion<; SS$_NOSUCHDEV indicates incorrect/inaccessible device name;; FORWARD ROUTINES:;; READINDEX Main routine/; OPEN_INDEX_FILE Opens index file second time.; FID_TO_NAME Obtains directory spec from FID; ; HISTORY:; ; Feb 24-27B; Added code for CLI callbacks. The callbacks added at this point@; are for a "full" listing (names or just stats), and the deviceA; name. A CLD file for a command named READINDEX will be created#; and must be used with this image.; ; Feb 18-20H; Added code to check for the directory bit in the file characteristics.G; A problem would occur if we were trying to derive a directory string,A; and the backlink somehow got pointed to something other than a F; directory. Right now, we just skip this file, and go on to the next.C; Also added code to check for a valid backlink. An output problemA; was occurring if we tried to look at a fragmented file that was@; not catalogued anywhere. If the backlink is creamed, we just 2; ignore displaying any information for this file.; ; Feb 13-16 ;; Added code FID_TO_NAME to get the directory spec from the9; FID. Previous versions only showed the file id and the>; directory id. This code was patterned after the VMS routine9; LIB$FID_TO_NAME, although liberal usage of RTL routines@; was included, to take advantage of dynamic string descriptors.;>; Added code to obtain the complete 24 bit file header number.1; Previous version only obtain the first 16 bits.;=; All offsets used in either home block, file header area, or5; file ident area, are completely symbolic in origin.;; September 12-15>; Original Macro version was written for the system programmer>; class. This was patterned after the FORTRAN version written); the year before for system performance.;; Library needed;  .LIBRARY /SYS$LIBRARY:LIB/;; Symbolic offsets needed;' $FATDEF ; File attribute definitions- $FCHDEF ; File characteristics definitions, $FH2DEF ; File header general definitions. $FI2DEF ; File header ident area defintions# $HM2DEF ; Home block definitions;; Macro to build descriptors; .MACRO BUILD_DESCRIPTOR NAME NAME: .BLKW 1 .BYTE 14,2 .BLKL 1 .END BUILD_DESCRIPTOR$ .PSECT NONSHARED PIC,NOEXE,WRT,LONG;; Printing information;4TOP: .ASCID /!_!_ Fragmented files for device !AS/HEADER: .ASCID -= /File specification!_!_!_!_File identification Size Mapptr/DASHED: .ASCID -= /------------------!_!_!_!_------------------- ----- ------/2CTRSTR: .ASCID /!49AS !14<(!UL,!UW)!> !8UL !4UL//CONTROL:.ASCII ?!/Starting time of run : !AS!/?( .ASCII ?Total file headers read: !UL!/?( .ASCII ?Total directory hdrs rd: !UL!/?( .ASCII ?Fragmented files found: !UL!/?( .ASCII ?Percentage of fragfiles: !U1~ SOURCE.BCKI 8A/[USERS.DENTON_D.DECUS.LT.SOURCE]FILE_FRAG.MAR;1H  L!/?* .ASCII ?Lost files seen in srch: !UL!/!/?& .ASCII ?Ending time of run : !AS? LEN=.-CONTROL/CTRSTR2:.LONG LEN ; Descriptor for FAO string .ADDRESS CONTROLSCROLLT:.LONG 4SCROLLB:.LONG 24ERASE: .LONG 1/OUT: .LONG 80 ; Output buffer for FAO headers .LONG A A: .BLKB 80,OUT2: .LONG 80 ; Output for final FAO line .LONG B B: .BLKB 2804COLON: .ASCID /:/ ;Colon descriptor for device2STARTPOS:.BLKL 1 ;Start position of colon holderINDEX: .ASCID /[0,0]INDEXF.SYS/;; File and storage information;,DEVICE: .BLKW 1 ;Descriptor for device name .BYTE 14,2 .BLKL 1 DIR_CONCAT:1 .BLKW 1 ;Descriptor for directory concatenation .BYTE 14,2 .BLKL 14CONCAT: .BLKW 1 ;Descriptor for final concatenation .BYTE 14,2 .BLKL 13FRAGFIL:.BLKW 1 ;Descriptor to pick up file string .BYTE 14,2 .BLKL 15FINAL: .BLKW 1 ;Descriptor for final dir/file string .BYTE 14,2 .BLKL 17STARTTIME:.BLKW 1 ;Descriptor for starting time of run .BYTE 14,2 .BLKL 13ENDTIME:.BLKW 1 ;Descriptor for ending time of run .BYTE 14,2 .BLKL 14FILE: .LONG 86 ;Descriptor for complete file string .LONG BUF BUF: .BLKB 20BUF3: .BLKB 66 DIR: .LONG 86 .ADDRESS BUF2BUF2: .BLKB 20BUF4: .BLKB 663DEVQUAL:.ASCID /DEVICE/ ;Qualfier name for CLI call1FULL: .ASCID /FULL/ ;Qualifier name for CLI call:PERIOD: .ASCID /./ ;Descriptors for miscellaneous stringsFRONTB: .ASCID /[/ENDB: .ASCID /]/COUNT: .LONG 0)FILE_COUNT: .LONG 0 ;Total files examined+DIR_COUNT: .LONG 0 ;Total directories found0FRAG_COUNT: .LONG 0 ;Total fragmented file found+LOST_COUNT: .LONG 0 ;Total lost files found%FULLOUT: .LONG 0 ;Full listing or not,FILESIZE: .LONG 0 ;Holds file size in blocks;; FABs and RABs for index file; .ALIGN LONG INDFAB: $FAB *INDRAB: $RAB fab=INDFAB,UBF=BUFFER,USZ=512INDFAB2:$FAB fac=4INDRAB2:$RAB fab=INDFAB2,UBF=BUFFER2,USZ=512,rop=BIOBUFFER2:.BLKB 512DIRBUF: .BLKW 1 .BYTE 14,2 .BLKL 1;%; Descriptors for FID_TO_NAME routine; BUILD_DESCRIPTOR EIGHT BUILD_DESCRIPTOR SEVEN BUILD_DESCRIPTOR SIX BUILD_DESCRIPTOR FIVE BUILD_DESCRIPTOR FOUR BUILD_DESCRIPTOR THREE BUILD_DESCRIPTOR TWO BUILD_DESCRIPTOR ONEADDRESS_ARRAY: .ADDRESS EIGHT .ADDRESS SEVEN .ADDRESS SIX .ADDRESS FIVE .ADDRESS FOUR .ADDRESS THREE .ADDRESS TWO .ADDRESS ONE;-; Miscellaneous storage elements and counters;;BLOCKS_TO_SKIP: ;Storage for blocks to skip in INDEXF.SYS .LONG 0FID: .LONG 0 ;FID number SEQ: .WORD 0 .WORD 03BUFFER: .BLKB 512 ;Buffer to read file header into/MAP: .BLKL 1 ;Storage for mapping words in use3CLUSTER:.BLKL 1 ;Storage for disk's cluster factor2MAX: .BLKL 1 ;Blocks that we need to skip reading;BACKLINK:.LONG 0 ;Holds directory backlink file hdr number"PROMPT: .ASCID /Disk device name>/; .PSECT CODE PIC,NOWRT,SHR,LONG .ENTRY READINDEX, ^M<> # PUSHAL PROMPT ;Prompt for device( PUSHAL DEVICE ;Storage for device name CALLS #2,G^LIB$GET_INPUT BLBS R0,10$ ;Check status BRW ERROR ;Scram out if not010$: MOVL #1,FULLOUT ;Set location for later... ; 2 PUSHAL STARTPOS ;Check for the colon character--+ PUSHAL COLON ;the translate logical does- PUSHAL DEVICE ;not deal with actual device0 CALLS #3,G^STR$POSITION ;names w/o the colon... TSTL R0 ;R0=position of colon BNEQ 15$;0 PUSHAL COLON ;If colon not present; append it+ PUSHAL DEVICE ;to the device name string CALLS #2,G^STR$APPEND; 15$: PUSHAQ INDEX PUSHAQ DEVICE PUSHAQ CONCAT3 CALLS #3,G^STR$CONCAT ;Concat the device/file spec BLBS R0,20$ ;Check status BRW ERROR20$: MOVL CONCAT+4,-+ INDFAB+FAB$L_FNA;Set up file spec address MOVB CONCAT,-1 INDFAB+FAB$B_FNS;Set up file spec string length; ; Do initial screen setup now...; PUSHAL ERASE  PUSHAL ERASE  CALLS #2,G^LIB$ERASE_PAGE( $FAO_S CTRSTR=TOP,OUTBUF=OUT,P1=#DEVICE PUSHAL OUT CALLS #1,G^LIB$PUT_OUTPUT$21$: $FAO_S CTRSTR=HEADER,OUTBUF=OUT PUSHAL OUT CALLS #1,G^LIB$PUT_OUTPUT $FAO_S CTRSTR=DASHED,OUTBUF=OUT PUSHAL OUT CALLS #1,G^LIB$PUT_OUTPUT;0; Do the open of the index file for later calls.;25$: PUSHAL STARTTIME CALLS #1,G^LIB$DATE_TIME CALLS #0,OPEN_INDEX_FILE;3 $OPEN fab=INDFAB ;Open up the index file for reads BLBS R0,30$ ;Check status$ BRW ERROR ;On error, branch out...230$: $CONNECT rab=INDRAB ;Connect up record stream BLBS R0,40$ ;Check status$ BRW ERROR ;On error, branch out...740$: $GET rab=INDRAB ;Read the first block (boot block) BLBS R0,50$ ;Check status$ BRW ERROR ;On error, branch out...)50$: $GET rab=INDRAB ;Read the home block BLBS R0,60$ ;Check status$ BRW ERROR ;On error, branch out...;>; Now we figure out which block to start the actual read on...=; since the first 4 clusters are index-file specific, we want9; to skip them. That total will be the cluster size * 4.;<; Next, we want to skip the index file bitmap. This is also=; found in the home block. All we then need to do is performB; a simple addition (cluster-size * 4) + index-file-bitmap size...?; and we will just set up a loop and read "through" that number; of blocks...;>; The next instructions get and manipulate the home block data;(60$: MOVZWL BUFFER+HM2$W_CLUSTER,CLUSTER" MOVZWL BUFFER+HM2$W_IBMAPSIZE,MAP / MULL2 #4,CLUSTER ;Get total size of clusters5 ADDL3 CLUSTER,MAP,MAX ;and add the size of idx map+ MOVL MAX,BLOCKS_TO_SKIP ;Save this number- SUBL2 #2,MAX ;Bias number correctly since$ ;we have read the first 2 blks70$: $GET rab=INDRAB. SOBGTR MAX,70$ ;Read/skip unwanted records280$: $GET rab=INDRAB ;Read the first file header( CMPL R0,#RMS$_EOF ;Last record read ? BNEQ 85$ JMP DONE/85$: INCL FILE_COUNT ;Note we have a file hdr. MOVAB BUFFER,R6 ;Get address of file header. MOVL FH2$L_FILECHAR(R6),R10 ;Get file chars.9 BBC #FCH$V_DIRECTORY,R10,86$ ;See if this is a directory INCL DIR_COUNT ;Note if soA86$: MOVZBL FH2$B_MAP_INUSE(R6),MAP ;Get number of mapping words) DIVL2 #2,MAP ;Get approx map pointers, CMPL MAP,#7 ;Check for number of extents* BLSS 80$ ;if not >= 7, get next record8 ADDL3 #FH2$W_RECATTR,R6,R7 ;Get addr of record attrib.9 MOVW FAT$W_HIBLKH(R7),FILESIZE+2 ;Retrieve blocks infile MOVW FAT$W_HIBLKL(R7),FILESIZE; MOVW FH2$W_FID_NUM(R6),FID ;Get low order file hdr number> MOVB FH2$B_FID_NMX(R6),FID+2 ;Get high order file hdr number) CLRB FID+3  ;Zero high byte for sanity) TSTL FID ;Zero indicates deleted file% BNEQ 87$ ;Ignore this block if so JMP 80$E87$: MOVW FH2$W_BK_FIDNUM(R6),BACKLINK ;Obtain the directory backlinkB MOVB FH2$B_BK_FIDNMX(R6),BACKLINK+2 ;Obtain high byte of dir b.l.- CLRB BACKLINK+3 ;Zero high byte for sanity- TSTL BACKLINK ;See if backlink is zipped--, BNEQ 88$ ;this file is lost; skip now...( INCL LOST_COUNT ;increment counter...! JMP 80$ ;and read next header688$: INCL FRAG_COUNT ;Note we have found a frag file0 TSTL FULLOUT ;Do we want output at this pt ? BNEQ 90$ ;Yes, keep going...( JMP 80$ ;No, get next file header...890$: MOVW FH2$W_FID_SEQ(R6),SEQ ;Get header usage count: MOVZBL FH2$B_IDOFFSET(R6),R7 ;Get word offset to ID area$ MULL2 #2,R7 ;Bias to byte offset ADDL3 R6,R7,R8 = MOVC3 #20,FI2$T_FILENAME(R8),BUF ;Get first 20 bytes of file$ MOVC3 #66,FI2$T_FILENAMEXT(R8),BUF3* PUSHAL FILE ;Now trim off extra blanks PUSHAL FRAGFIL  CALLS #2,G^STR$TRIM@ ADDL3 BACKLINK,BLOCKS_TO_SKIP,R0 ;Get the correct block to read% PUSHL R0 ;for the dir file header6 CALLS #1,FID_TO_NAME ;Call routine with this number- BLBS R0,150$ ;R0 clear indicates bad file$ JMP 80$ ;If so, read next header;4150$: PUSHAL FRAGFIL ;Build the final conatenated0 PUSHAL DIR_CONCAT ;string from dir/file names PUSHAL FINAL5 CALLS #3,G^STR$CONCAT ;Do final name concatenation# $FAO_S ctrstr=CTRSTR,outbuf=OUT2,- p1=#FINAL,P2=FID,p3=SEQ,-. p4=FILESIZE,p5=MAP ;Build the output string# PUSHAL OUT2 ;And display string CALLS #1,G^LIB$PUT_OUTPUT ( JMP 80$ ;Loop back for next file hdrDONE: $CLOSE FAB=INDFAB $CLOSE FAB=INDFAB2 PUSHAL ENDTIME6 CALLS #1,G^LIB$DATE_TIME ;Get ending time for output MOVL #280,OUT2 MULL3 #100,FRAG_COUNT,R11; SUBL3 DIR_COUNT,FILE_COUNT,R8 DIVL3 FILE_COUNT,R11,R10$ $FAO_S ctrstr=CTRSTR2,outbuf=OUT2,-, p1=#STARTTIME,p2=FILE_COUNT,p3=DIR_COUNT,-0 p4=FRAG_COUNT,p5=R10,p6=LOST_COUNT,p7=#ENDTIME PUSHAL OUT2 CALLS #1,G^LIB$PUT_OUTPUT ERROR: RET;; .SUBTITLE SUBROUTINES .PSECT CODE PIC,NOWRT,SHR,LONG .ENTRY OPEN_INDEX_FILE, ^M<>;9; Procedure to open the index file again, for later calls; to FID_TO_NAME;20$: MOVL CONCAT+4,-, INDFAB2+FAB$L_FNA;Set up file spec address MOVB CONCAT,-2 INDFAB2+FAB$B_FNS;Set up file spec string length* $OPEN fab=INDFAB2 ;Open up the index file BLBC R0,ERR ;Check status+ MOVL #SS$_NORMAL,R0 ;Set normal completion RETERR: $EXIT_S R08 .ENTRY FID_TO_NAME, ^M;:; Procedure to take the file's FID and return the complete;; directory specification...this procedure assumes that the5; index file has already been opened by the procedure; OPEN_INDEX_FILE;) CLRL R10 ;Use R10 as index into array3 MOVAL ADDRESS_ARRAY,R11 ;Load start addr of array; MOVL 4(AP),INDRAB2+RAB$L_BKT ;Load index file VBN to read+ $CONNECT rab=INDRAB2 ;Setup record stream ; BLBC R0,ERR2 ;Check status +10$: $READ rab=INDRAB2 ;Read in the block; BLBC R0,ERR2 ;Check status- MOVAB BUFFER2,R6 ;Load file hdr addr in R66 MOVL FH2$L_FILECHAR(R6),R7 ;Get file characteristics BBS #FCH$V_DIRECTORY,-' R7,15$ ;Verify this is a directory1 INCL LOST_COUNT ;Incrment lost counter for now, BRW NO_DIR ;If not, scram out with error>15$: MOVZBL FH2$B_IDOFFSET(R6),R7 ;Get word offset to ID areaA MOVW FH2$W_BK_FIDNUM(R6),BACKLINK ;Obtain the directory backlinkB MOVB FH2$B_BK_FIDNMX(R6),BACKLINK+2 ;Obtain high byte of dir b.l.- CLRB BACKLINK+3 ;Zero high byte for sanity- TSTL BACKLINK ;Verify contents of backlink BNEQ 20$1 INCL LOST_COUNT ;Increment error counter if so BRW NO_DIR ;Scram if none(20$: MULL2 #2,R7 ;Bias to byte offset+ ADDL3 R6,R7,R8 ;Load start of ident area> MOVC3 #20,FI2$T_FILENAME(R8),BUF2 ;Get first 20 bytes of fileF MOVC3 #66,FI2$T_FILENAMEXT(R8),BUF2+20;Get last 66 bytes of file name( PUSHAL DIR ;Search for the period in- PUSHAL PERIOD ;the file name string--this3 CALLS #2,G^LIB$LOCC ;delimits the file from type2 SUBL3 #1,R0,DIR ;Bias pointer to exclude period+ PUSHAL DIR ;Now copy the file name ONLY1 PUSHL (R11)[R10] ;to the (next) array element,7 CALLS #2,G^STR$COPY_DX ;using a dyn string descriptor/ MOVL #86,DIR ;Reset dir descrp for next use, INCL R10 ;Set index to nxt array element( CMPL #4,BACKLINK ;Bcklnk=4 is the MFD1 BEQL BUILD_STRING ;If so, build the dir string ADDL3 BACKLINK,BLOCKS_TO_SKIP,-3 INDRAB2+RAB$L_BKT ;If not, get VBN for next read% BRW 10$ ;Branch back for the read BUILD_STRING:& CLRL COUNT ;Initialize arg counter PUSHAL ENDB ;Load end "]"% INCL COUNT ;Increment arg counter% CLRL R9 ;Initialize array pointer*10$: PUSHL (R11)[R9] ;Load LAST dir name% INCL COUNT ;Increment arg counter& DECL R10 ;R10 tells how many names. BEQL SHOW_STRING ;No more, concat the names' PUSHAL PERIOD ;If more, add the "."- INCL COUNT ;And increment the arg counter" INCL R9 ;Point to next element" BRB 10$ ;And process next name SHOW_STRING:$ PUSHAL FRONTB ;Add the front "["% INCL COUNT ;Increment arg counter, PUSHAL DIR_CONCAT ;Load the concat buffer+ INCL COUNT ;Final arg counter increment0 CALLS COUNT,G^STR$CONCAT ;And build the string4 $DISCONNECT RAB=INDRAB2 ;Return back to add on the RET ;file specificationNO_DIR: $DISCONNECT RAB=INDRAB2 CLRL R0 RET  .END READINDEX+*[USERS.DENTON_D.DECUS.LT.SOURCE]IFERR.OBJ;1+,./0 4r-8A0123KPWO56qI7FS7@P>I89G0HJ/IFERR019-SEP-1986 16:31 VAX/VMS Macro V04-00MAC/LIS IFERR , IFERRLIB$STOP SYS$PUTMSG . ABS .c . BLANK .PмPP:l+P[~PnR}ODb SYS$PUTMSGݼLIB$STOP}O IFERR . BLANK .c8*[USERS.DENTON_D.DECUS.LT.SOURCE]LT_CONFIRM_NODISUSER.C;5+,[. /0 4 -8A0123KPWO 5J6(@7@'H89@dHG0HJ8#module LT_CONFIRM_NODISUSER "Acct is LT NODISUSERable?"/***++!** FACILITY: LT - LIAISON TOOLS**** MODULE DESCRIPTION:**I** This module contains the program that accepts an account usernameA** from the command line and checks to see if that account can be'** NODISUSERed from Liaison Tools.** ** AUTHORS:**&** Doug Denton - INTEC Consulting**%** CREATION DATE: 21 October, 1991.**** DESIGN ISSUES:**** {@tbs@}** ** VERSION:** ** 1.00** **** MODIFICATION HISTORY:**** 1.00 DLD 21-Oct-91** Original version.**--*//* ** ** INCLUDED FILES:** */#include ctype#include descrip #include file#include opcdef#include rmsdef#include ssdef#include stdlib#include string#include uaidef#include unixio/* ** ** MACRO DEFINITIONS:** */"#define OK_PRIVS_MASK 0X040108100LN#define OPCMSG_TARGET (OPC$M_NM_SECURITY|OPC$M_NM_OPER11) * 256 + OPC$_RQ_RQST /***++** FUNCTIONAL DESCRIPTION:**** {@tbs@}**** FORMAL PARAMETERS:**** {@subtags@}**** RETURN VALUE:**** {@description or none@}**** SIDE EFFECTS:**** {@description or none@}** ** DESIGN:**** {@description or none@}********--*/!int main (int argc, char *argv[]) MAIN_PROGRAM{short int login_failures;long int def_privs[2], auth_privs[2], last_login_date[2], num_days, last_login, answer, *tmp_mask, ret_stat,( opcmsg_buffer[22] = {OPCMSG_TARGET,0};Gstruct dsc$descriptor_s username_dsc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S},2 opcmsg_dsc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S};struct { short int buffer_length; short int item_code; char *buffer_address;% short int *return_length_address;} get_values[5] = {# {8,UAI$_DEF_PRIV,&def_privs,0}, {8,UAI$_PRIV,&auth_privs,0},, {8,UAI$_LASTLOGIN_I,&last_login_date,0},( {2,UAI$_LOGFAILS,&login_failures,0}, {0,0,0,0} };/* E** An account can be NODISUSERed if it has TMPMBX, NETMBX, GROUP, orJ** SYSLCK privileges. Any other priv's and LIASON TOOLS can't enable it.*/ /* H** The first parameter on the command line must be the username of the ** account to check.*/ if (!argv[1]) exit(SS$_INSFARG);%username_dsc.dsc$a_pointer = argv[1];,username_dsc.dsc$w_length = strlen(argv[1]);*opcmsg_dsc.dsc$a_pointer = &opcmsg_buffer;/* K** Use the $GETUAI system service to get basic information from the SYSUAF ** file.*/ Lif((ret_stat=sys$getuai(0,0,&username_dsc,&get_values,0,0,0)) != SS$_NORMAL) {8 if (ret_stat == RMS$_RNF) ret_stat = SS$_NOSUCHUSER; exit(ret_stat); }/* J** An account with privileges other than those specified in OK_PRIVS_MASKH** cannot be enabled by LIASON TOOLS. Check the authorized and default ** privs.*/ auth_privs[0] |= def_privs[0];auth_privs[1] |= def_privs[1];6if (auth_privs[1] || (auth_privs[0] & ~OK_PRIVS_MASK)) {H printf ("%%LIATOO-F-PRIVACCT, cannot enable a priviledged account"); exit(SS$_NOPRIV); }/* I** An account with several login failures can be enabled by LTs but only5** after a confirming response to a warning message.*/ if (login_failures > 10) {a printf ("\n* WARNING - This account has %d login failures, enable anyway? ", login_failures); answer = getchar();+ if ((answer != 'y') && (answer != 'Y')) { exit(SS$_ABORT); } else { sprintf (&opcmsg_buffer[2], "LIATOO(AUTHORIZE) - Approved %s for NODISUSER although %d login failures.",argv[1],login_failures);7 opcmsg_dsc.dsc$w_length = strlen(&opcmsg_buffer[2])+8;H if ((ret_stat=sys$sndopr(&opcmsg_dsc,0)) != SS$_NORMAL) exit(ret_stat); } }ret_stat = lib$day(&num_days);1ret_stat = lib$day(&last_login,&last_login_date);num_days -= last_login;answer = getchar();if (num_days > 30) {d printf ("\n* WARNING - This account has has not be used in %d days, enable anyway? ", num_days); answer = getchar();+ if ((answer != 'y') && (answer != 'Y')) { exit(SS$_ABORT); } else {| sprintf (&opcmsg_buffer[2], "LIATOO(AUTHORIZE) - Approved %s for NODISUSER although unused for %d days.",argv[1],num_days);7 opcmsg_dsc.dsc$w_length = strlen(&opcmsg_buffer[2])+8;H if ((ret_stat=sys$sndopr(&opcmsg_dsc,0)) != SS$_NORMAL) exit(ret_stat); } }exit(SS$_NORMAL);}:*[USERS.DENTON_D.DECUS.LT.SOURCE]LT_CONFIRM_NODISUSER.OBJ;2+,\./0 4 -8A0123KPWO576N1/7VH89@dHG0HJVLT_CONFIRM_NODISUSERAcct is LT NODISUSERable?11-DEC-1991 11:00VAX C V2.3-024P%%LIATOO-F-PRIVACCT, cannot enable a priviledged account9P * WARNING - This account has %d login failures, enable anyway? zPLIATOO(AUTHORIZE) - Approved %s for NODISUSER although %d login failures.P * WARNING - This account has has not be used in %d days, enable anyway? PLIATOO(AUTHORIZE) - Approved %s for NODISUSER although unused for %d days.P4^ C$MAIN_ARGSSTЏ@ԭz|}rtu6 8ޭ:>BDޭFJNPޭRVZ\>^|b|jЬPՠ <~EXITЬPР~ݠSTRLENPzޭv|~6z|~ SYS$GETUAIPRRR< RREXITȭȭ ˏ@PcPRINTF$EXIT񱭂 |2~ߣ9PRINTFdFGETCPyPY,EXITHP2~ЬPݠߣzSPRINTFSTRLENPPrr SYS$SNDOPRP PEXIT߭LIB$DAYPR߭߭LIB$DAYPR­ܭdFGETCѭ{ݭPRINTFdFGETCPyPY ,EXITGPݭЬPݠRLT_CONFIRM_NODISUSER mainb X   C$V_CTYPEDEFSSPRINTFPRINTFFGETCSTRLENEXITLIB$DAY SYS$SNDOPR SYS$GETUAI MAIN C$MAIN_ARGSb$CODE$DATA_CTYPE_ERRNOSTDINSTDOUTSTDERRY$CHAR_STRING_CONSTANTSZSPRINTFSTRLENPPrr SYS$SNDOPRP PEXITEXITP5*[USERS.DENTON_D.DECUS.LT.SOURCE]LT_DEINSTALL_LT.COM;4+,a./0 4_-8A0123KPWO5J6P7H89@dHG0HJ$ on errot then $ exit$ set proc/priv=(sysprv,bypass) $ set noonI$ dir/nohead/notrail/out=sys$scratch:deinstall_lt.tmp lt_root:[*...]*.*;*U$ convert/fdl=sys$input/pad sys$scratch:deinstall_lt.tmp sys$scratch:deinstall_lt.dat0IDENT " 3-OCT-1991 15:20:40 VAX-11 FDL Editor"SYSTEM SOURCE "VAX/VMS"FILE ALLOCATION 249 BEST_TRY_CONTIGUOUS yes EXTENSION 24 ORGANIZATION sequentialRECORD BLOCK_SPAN yes! CARRIAGE_CONTROL carriage_return FORMAT fixed SIZE 255'$ delete sys$scratch:deinstall_lt.tmp;*_$ sort/key=(pos:1,size:255,character) sys$scratch:deinstall_lt.dat sys$scratch:deinstall_lt.srt'$ delete sys$scratch:deinstall_lt.dat;*/$ open/read iofile sys$scratch:deinstall_lt.srt$ _delete_file_list_loop:.$ read/end=_delete_file_list_eof iofile record$ delete 'record'$ goto _delete_file_list_loop$ _delete_file_list_eof:$ close iofile'$ delete sys$scratch:deinstall_lt.srt;*!$ delete sys$library:cerberus.*;*%$ delete sys$startup:lt$startup.com;*%$ save_dir = f$environment("default")$ set default sys$system$ mcr authorizeremove/id systemsstaffremove/id lt_tool_mgrremove/id lt_userremove/id lt_queueremove/id lt_fileremove/id lt_replyremove/id lt_identifierremove/id lt_authorizeremove/id lt_diskremove/id lt_entryremove/id lt_networkremove/id lt_processremove/id lt_taperemove/id lt_databaseremove/id lt_database_privremove/id lt_loginsremove/id lt_installremove/id lt_mailboxexit$ deassign/system/exec lt_root$ deassign/system/exec lt_data $ deassign/system/exec lt_custom $ deassign/system/exec lt_system($ deassign/system/exec ist$liaison_tools$ set def 'save_dir'$ exit2*[USERS.DENTON_D.DECUS.LT.SOURCE]LT_FIND_HOLDER.C;1+,c./0 4\.-8A0123KPWO 5U6`7 fH89@dHG0HJ 3#module LT_FIND_HOLDER "Find holders of RIGHTS ID."/***++ ** FACILITY: LT - LIASON TOOLS**** MODULE DESCRIPTION:**J** This module contains a routine that will check the RIGHTS databaseA** and report the usernames of the accounts granted the specified ** rights id.** ** AUTHORS:**,** Douglas L Denton - INTEC Consulting.**$** CREATION DATE: 9 October, 1991.**** DESIGN ISSUES:** ** VERSION:**** 1.00**** MODIFICATION HISTORY:**%** 01.00-0 DLD 09-Oct-91"** Original version of module.**--*//***** INCLUDE FILES***/#include descrip#include rmsdef#include stdio#include ssdef/***** MACRO DEFINITIONS***/#define L_RIGHTSID 20#define L_RESULTANT_STR 80 /***++** FUNCTIONAL DESCRIPTION:**M** Translate the LT_RID logical name to get the name of the RIGHTS ID ofJ** interest and convert the text ID to the numerical form. Then, for eachJ** holder of that ID, get the UIC, convert it to the named form, and print** it to SYS$OUTPUT.****** FORMAL PARAMETERS:**** None.**** IMPLICIT INPUT:**** LT_RID logical name.**** RETURN VALUE:***** Status returned in $STATUS symbol.**** SIDE EFFECTS:**7** Information displayed on SYS$OUTPUT via PRINTF.** ** DESIGN:** ** None**** PRECONDITIONS:** F** Logical name LT_RID must be defined to the name of the identifier** of interest.** ******--*/main(argc,argv) MAIN_PROGRAM{int SYS$ASCTOID(), SYS$FIND_HELD(), LIB$PUT_OUTPUT(), LIB$SYS_TRNLOG(), LIB$SYS_FAO();'static $DESCRIPTOR(input_lnm,"LT_RID");*static $DESCRIPTOR(control_str," !%I");Lstatic struct dsc$descriptor_s rights_asc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S};Ostatic struct dsc$descriptor_s resultant_str = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S};long id, holder[2], context, ret_stat; char rights_asc_buf[L_RIGHTSID],$ resultant_str_buf[L_RESULTANT_STR];%rights_asc.dsc$w_length = L_RIGHTSID;+rights_asc.dsc$a_pointer = &rights_asc_buf;-resultant_str.dsc$w_length = L_RESULTANT_STR;1resultant_str.dsc$a_pointer = &resultant_str_buf;Tif ((ret_stat=LIB$SYS_TRNLOG(&input_lnm,&rights_asc.dsc$w_length,&rights_asc,0,0,0)) != SS$_NORMAL) exit(ret_stat);Lif ((ret_stat=SYS$ASCTOID(&rights_asc,&id,0)) != SS$_NORMAL) exit(ret_stat);,rights_asc_buf[rights_asc.dsc$w_length] = 0;Iprintf("\nThe following users have the %s identifier:\n",rights_asc_buf); context=0;Gwhile ((ret_stat=sys$find_holder(id,&holder,0,&context)) == SS$_NORMAL) {\ ret_stat=LIB$SYS_FAO(&control_str,&resultant_str.dsc$w_length,&resultant_str,holder[0]);, ret_stat=LIB$PUT_OUTPUT(&resultant_str);1 resultant_str.dsc$w_length = L_RESULTANT_STR; }}1*[USERS.DENTON_D.DECUS.LT.SOURCE]LT_LIST_UAF.C;206+,e6.(/0 4z((-8A0123KPWO)56!s 7H89@dHG0HJ#module LT_LISTUAF "V1.04"/***++!** FACILITY: LT - LIAISON TOOLS**** MODULE DESCRIPTION:**** ** AUTHORS:**&** Doug Denton - INTEC Consulting**&** CREATION DATE: 09 December, 1991.**** DESIGN ISSUES:**** {@tbs@}** ** VERSION:** ** 1.04** **** MODIFICATION HISTORY:**!** 1.04 DLD 07-May-92<** Display all the privileges owned by the account.!** 1.03 DLD 16-Jan-92J** Display the same information for privileged and non-privileged** accounts.!** 1.02 DLD 14-Jan-92K** Corrected error causing infinite loop when last account on list/** has a rights ID but no user record.!** 1.01 DLD 03-Jan-92L** Added wildcard processing for username and added data to display** 1.00 DLD 09-Dec-91** Original version.**--*//* ** ** INCLUDED FILES:** #include string*/#include ctype#include descrip#include prvdef#include rmsdef#include ssdef#include strdef#include uaidef/* ** ** MACRO DEFINITIONS:** */"#define OK_PRIVS_MASK 0X040108100L /***++** FUNCTIONAL DESCRIPTION:**M** This routine traverses the SYSUAF file in order of ascending usernameC** displaying information about accounts that match the given P** specification. Privileged accounts have a reduced amount of informationI** displayed. Usernames can be specified using wildcard characters.**L** A foreign command must be defined to execute. Parameters are passed(** via the argc and argv mechanism.**** FORMAL PARAMETERS:**I** Parameters are passed during image startup via the argc and argv ** mechanism.**** USER SPECIFICATIONC** Can be either username or UIC code. Wildcard characters areI** permitted in the username and in the member field of the UIC.$** Lists are not permitted.**** FORMATM** Can be FULL or BRIEF. Actually, unless the substring BRIE exists1** within the parameter FULL is assumed.**** RETURN VALUE:**/** SS$_NORMAL normal successful completion**** SIDE EFFECTS:**F** Displays information on SYS$OUTPUT using the printf C utility.****--*/!int main (int argc, char *argv[]) MAIN_PROGRAM{long int _align(LONGWORD) str$match_wild(), lib$sys_fao(), sys$asctoid(), sys$find_held(), sys$idtoasc();long int _align(LONGWORD) brief, flags, flags_len, bytlm, pgflquota, wsdef, wsextent, wsquota, id, id2, rights_id, resid, attrib, contxt, contxt2, uic_given, c," pattern_group = 0,# pattern_member = 0, ret_stat, ret_stat2;char _align(LONGWORD) byte_value, account_buf[11], flags_buf[400], defdev_buf[98], defdir_buf[65], lgicmd_buf[65], owner_buf[33], faostr_buf[133], groupname_buf[31], rightname_buf[31];short int _align(LONGWORD) account_len, owner_len, faostr_len, uic[4] = {0,0,0,0}, biolm, diolm, enqlm, fillm, astlm, tqcnt, logfails, namlen;long int _align(QUADWORD) def_privs[2], auth_privs[2], expiration[2], pwd_lifetime[2], pwd_date[2], last_login_i[2], last_login_n[2];/* H** Define the data structure (item_list_3) that will be used to get the0** information from the $GETUAI system service.*/ struct { short int buffer_length; short int item_code; char *buffer_address;% short int *return_length_address;} get_values[27] = {# {8,UAI$_DEF_PRIV,&def_privs,0}, {8,UAI$_PRIV,&auth_privs,0},# {64,UAI$_LGICMD,&lgicmd_buf,0}, {4,UAI$_FLAGS,&flags,0},& {8,UAI$_EXPIRATION,&expiration,0},* {8,UAI$_PWD_LIFETIME,&pwd_lifetime,0}," {8,UAI$_PWD_DATE,&pwd_date,0}, ) {8,UAI$_LASTLOGIN_I,&last_login_i,0},) {8,UAI$_LASTLOGIN_N,&last_login_n,0}," {2,UAI$_LOGFAILS,&logfails,0}, {2,UAI$_BIOLM,&biolm,0}, {4,UAI$_BYTLM,&bytlm,0}, {2,UAI$_DIOLM,&diolm,0}, {2,UAI$_ENQLM,&enqlm,0}, {2,UAI$_FILLM,&fillm,0}, {2,UAI$_ASTLM,&astlm,0},$ {4,UAI$_PGFLQUOTA,&pgflquota,0}, {2,UAI$_TQCNT,&tqcnt,0}, {4,UAI$_DFWSCNT,&wsdef,0}," {4,UAI$_WSEXTENT,&wsextent,0}, {4,UAI$_WSQUOTA,&wsquota,0},* {32,UAI$_OWNER,&owner_buf,&owner_len},# {32,UAI$_DEFDEV,&defdev_buf,0},# {64,UAI$_DEFDIR,&defdir_buf,0}, {4,UAI$_UIC,&uic,0},/ {9,UAI$_ACCOUNT,&account_buf,&account_len}, {0,0,0,0} };/* K** Define the descriptors for the character strings that must be processed** by non-C code.*/ Xstruct dsc$descriptor_s groupname_dsc = {30,DSC$K_DTYPE_T,DSC$K_CLASS_S,&groupname_buf},C rightname_dsc = {30,DSC$K_DTYPE_T,DSC$K_CLASS_S,&rightname_buf},A faostr_dsc = {133,DSC$K_DTYPE_T,DSC$K_CLASS_S,&fao}~ SOURCE.BCKe68A1[USERS.DENTON_D.DECUS.LT.SOURCE]LT_LIST_UAF.C;206z( str_buf},I ctrstr_dsc = {80,DSC$K_DTYPE_T,DSC$K_CLASS_S},3 pattern_str = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S};/* H** Define the control strings used by the $FAO system service to format** the account information.*/ @char ctrstr1[80] = "Expiration: !17%D Login fails: !6UL\n",H ctrstr1a[80]= "Expiration: (none) Login fails: !6UL\n",C ctrstr2[80] = "Fillm: !6UL ASTlm: !6UL WSdef: !6UL\n",C ctrstr3[80] = "BIOlm: !6UL TQElm: !6UL WSquo: !6UL\n",C ctrstr4[80] = "DIOlm: !6UL ENQlm: !6UL WSextent: !6UL\n",E ctrstr5[80] = "BYTlm: !6UL Pgflquo: !6UL\n",P ctrstr6[80] = "Pwdlifetime: !10%D Pwdchange: !17%D\n",[ ctrstr7[90] = "Last Login: !17%D (interactive), !17%D (non-interactive)\n";/* >** The first parameter on the command line must be specified.*/ if (!argv[1]) exit(SS$_INSFARG); contxt = 0;id = -1;/* M** Initialize the p0 attern_str variable to use the capitalized version of the!** first command line parameter.*/ $pattern_str.dsc$a_pointer = argv[1];,pattern_str.dsc$w_length = strlen(argv[1]);Ofor (c=0;c pattern_member = pattern_member * 8 + argv[1][c] - 48;$ pattern_group += pattern_member; uic_given = 1; }else { /* P ** The username was not given in UIC format. If no wildcards are specifiedM ** then set the value of id to the id of the username. Otherwise id will? ** remain -1, setting up a wildcard operation for $ASCTOID. */  uic_given = 0;, if ((c = strpbrk(argv[1],"*%")) == '\0')S if((ret_stat=sys$asctoid(&pattern_str,&id,0)) != SS$_NORMAL) exit(ret_stat); }/* -** See if the BRIEF qualifier was specified.*/ if (argv[2]) {D for (c=0;argv[2][c] != 0;c++) argv[2][c] = _toupper(argv[2][c]);% brief = strstr (argv[2], "BRIE"); }else brief = 0;/* M** Process the SYSUAF file searching for accounts with matching usernames orK** UICs. Note that if wildcards were specified the the value of id is -1.*/ `while ((ret_stat=sys$idtoasc(id,&namlen,&rightname_dsc,&resid,&attrib,&contxt)) != SS$_NOSUCHID) {H if ((c=isalnum(argv[1][0])) && (argv[1][0]5 >"&*A,ޭ.2̀668>:>B9D>FJN:P>RVZ8\>^bf?hޭjnr7t>vz~=̀ޭ͂͆͊>͌ޭ͎͖͒<͘ޭ͚͞ ͢ ͤͦ>ͪ ͮ Ͱ͒ͲͶ@ͺͼO; ޭ>|͞͠͡=͖͙͚͎͐͑͘͢_͒P͈͉͆~̀́()g.(5)(0^͎(0ǎ>(0Ǿ(2͞(/ N(:OЬRբ <~EXITԭެVfRТ͂ݢSTRLENP~S<~RSR@ЦTCafR޲RCbz CbU PfR޲RCbUUCS<~RSRެXhRТYi[1TDiRRRBk(hVЦUxSDeRRS0STDeRRRBkxRRTެXhR޲RDbRRRBk(hVЦUxSDeRRS0STDeRRRBk2ԮljYSTRPBRKP߭~ SYS$ASCTOIDP PEXITެVfRТR]SCb>TCafR޲RCbz CbU PfR޲RCbUUCSCnjЬRݢSTRSTRPnn͖߭߭߭?ݭ SYS$IDTOASCP!1 STRTOKSTRLENZPRINTFYEXIT$STRCATX SYS$IDTOASC STRCPY LIB$SYS_FAOЬR޲ScRRRBkRRR c1r խ1F ծBЭSSRʏR1, ծSRʏR1 ʏSS1 'Pѭ~͖STR$MATCH_WILDP$1 |~͖ͦ|~ SYS$GETUAIPSǑ PRjPRR  BRR )SFS72RBǓiѭ1 ծ1\ ծ1x 1Q PS(ȭȭǴ߭ PR߭jPRR  BRR Ƕ͒ PSǸO PSORRR͒hPSn0͒RRR߭2~2 ~RRRǺi1 P2RBRRRi2RBɏR|~͞?R$P2RB==2~2 ~߭i͒RRR)i7  RRR9iG HhʏOhʏ@ǀZhchʏ@lhʏ魾thʏ魼}hLJh Ǐhʏǚh Ǧhխ ǯhǸiխխM.͊.jP͆2~͎߭?͆0PP(2RB__iH͊jP͆2~͎?͆,PP(2RB__iN͊NjP͆߭߭؟͎?͆0PP(2RB__i͊jP͆߭߭ȟ͎?͆0PP(2RB__i͎͎͊jP͆ݭ2~2~͎?͆4PP(2RB__i>͊>jP͆ݭ2~2~͎?͆4PP(2RB__i͊jP͆ݭ2~2~͎?͆4PP(2RB__i͞͞ͅjP͆ݭݭ͎?͆0P Ѯ ݮ (2RB__ii h h h h h )h 3h =h Gh Qh [h eh oh yh ǃh Ǎh Ǘh ǡh ǫh ǵh ǿh h h hSTRCATSTRCATSTRCATSTRCATSTRCATSTRCAT#STRCAT-STRCAT7STRCATASTRCATKSTRCATjPUTŏHTRRU@TSŏHSRRURBŏHTRBUPRINTFSTŏHTRRU[i pSTRCATzSTRCAT DŽSTRCATǎSTRCATǘSTRCATǢSTRCATǬSTRCATǶSTRCATSTRCATSTRCATSTRCATSTRCATSTRCATSTRCATSTRCATSTRCATSTRCATSTRCAT $STRCAT.STRCAT 8STRCAT BSTRCATLSTRCATVSTRCAT`STRCATjSTRCATtSTRCAT~STRCATLjSTRCATǒSTRCATǜSTRCATǦR LT_LISTUAF main S9 C$V_CTYPEDEFSSTRCPYSTRCATPRINTFSTRTOK SYS$GETUAISTRSTRSTRPBRKSTRLENEXIT SYS$IDTOASC SYS$FIND_HELD SYS$ASCTOID LIB$SYS_FAOSTR$MATCH_WILD MAIN C$MAIN_ARGS$CODE$DATA_CTYPE_$CHAR_STRING_CONSTANTSSTRCATǰSTRCATǺSTRCATSTRCATjPUTŏHTRRU@TSŏHSRRURBŏHTRBPRINTFSTŏHTRRUԭVѮ !1EXITUPRINTFT߭߭ SYS$FIND_HELDPSSE|~͖?ݭ SYS$IDTOASCPPe2RBV VddS!SeS!ѭ.ծծ$͖߭߭߭?ݭ$P!1iEXITP)*[USERS.DENTON_D.DECUS.LT.SOURCE]OPT.OPT;2+,z./0 4-8A0123KPWO5X6Z۔7vIH89@dHG0HJsys$library:vaxcrtl/share,*[USERS.DENTON_D.DECUS.LT.SOURCE]SETPRV.MAR;5+,b./0 4CV-8A0123KPWO56LbR!7&>I89G0HJ .TITLE SETPRV .IDENT /V01.01/ .LIBRARY /SYS$LIBRARY:LIB.MLB/. $PRVDEF ; define privilege bit definitions$ $PHDDEF ; define PHD definitions$ $PCBDEF ; define PCB definitions# $SSDEF ; define condition codes PRIVNUM =4STATE =8 .PSECT EXE_PPRV NOWRT* .ENTRY EXE_PPRV,^M8 IFNORD #4,0(AP),ACCVIO ; check for PRIVNUM readability. MOVZWL #SS$_NORMAL,R0 ; Assume success first= IFNORD #4,PRIVNUM(AP),ACCVIO ; check for PRIVNUM readability. MOVZWL #SS$_NORMAL,R0 ; Assume success first- MOVL PRIVNUM(AP),R6 ; get privilege number& BEQL SUCCESS ; if EQ no priv is set% BLSS BADPARA ; if LSS illegal priv0 CMPL #^X1F,R6 ; check range of priv ?????????' BLSSU BADPARA ; if LSSU out of range9 IFNORD #4,STATE(AP),ACCVIO ; check for STATE readability# MOVL STATE(AP),R7 ; get set state" BEQL FINCHECK ; if zero it is ok CMPL #1,R7 ; then is it a 1 ? BEQL FINCHECK ; if EQ it is okBADPARA:2 MOVZWL #SS$_BADPARAM,R0 ; set bad para error codeSUCCESS: RET ; then exitACCVIO:9 MOVZWL #SS$_ACCVIO,R0 ; set access violation error code RET ; then exit FINCHECK:C MOVL @#CTL$GL_PCB,R4 ; Get current process PCB addr. (jgd)9 MOVL PCB$L_PHD(R4),R4 ; get current process PHD addr.: INSV R7,R6,#1,PHD$Q_AUTHPRIV(R4) ; set PRIVNUM privilege " ; (authorized) bit in PHDB INSV R7,R6,#1,PHD$Q_PRIVMSK(R4) ; set PRIVNUM privilege (current) ; bit in PHDA INSV R7,R6,#1,@#CTL$GQ_PROCPRIV ; also in P1 region (permanent)* MOVZWL #SS$_NORMAL,R0 ; indicate success RET ; and exit .END,*[USERS.DENTON_D.DECUS.LT.SOURCE]SETPRV.OBJ;3+,./0 4{-8A0123KPWO56`7 L>I89G0HJ5SETPRVV01.0111-NOV-1991 13:28 VAX MACRO T5.2V-4 MAC SETPRV  SETPRV$ CTL$GL_PCBCTL$GQ_PROCPRIV . ABS .P$ABS$PPPP`EXE_PPRVP   EXE_PPRV&{ l0<P &<PЬVV ЬW W<P< P CTL$GL_PCBTФlTWVWVdWVCTL$GQ_PROCPRIV<PEXE_PPRVEXE_PPRV` VC8A0[USERS.DENTON_D.DECUS.LT.SOURCE]IXAKSGSM<"J?*606AWyzMdX1,d!jFq J~{-)%$.P/ Zl]yd wu7_]6i,bp4%&QXj~;   Z_BV'X%9* L4$d4 KD !^DbJXSbYN%'|4+|vxf'e `}U+  YT|xvg "1B&VchgV@kzc Ds^E AQV[A rCAJPqH;/0Bj5nk,RO$29E?TEcZym-)Wta__3U 8\.W]sk6,0Oey`i3C +:a&L] =!b^xl,&'QWn4p:S;t'uw4 )8M(#{t k `0|W\wxU] %;&s;GV8V

6o!^sh*oK[D l.~ D Jg Z}1)q>qHb,;d(lice2E!-ZTz{z1l93($kOZ*)$71 {v^eMfy Q L}{ctu ja|wBL gTrz@W@ >arR#OJUf5eHSKrmms}oADkWeinnu+i d(?|6sfb[>Jx`#Fh dh(.&~`.b0A3DB"ZOv/6>~ !.HYWibz-YGq~Nx04R|qg+JQz]AR}/%8#!E847t}7 aH@2oU{#;-8I#:_YEYbytePe57)12Uy+ #$PTTSZBuK9R*NAM v 1>BUO a!+e!ibo1::$T$Kj(48%O"__Mgte)1`x31spX}" & WyZL05 )S Y JN\}~ a}gt*v19 LhK 9wi't;+6T%"k\oPcj,nT,n9xT# +8Ar\ '2>+,VO/6 3a)/X<"/9/&%(8')cx'3d5Gm$ vIO\Zl]NuN. K:;(c3ol(MK >086)g7NW!_#ZS69aZs}H?8F'K(p$s>%fut26A&|26I;-[^EVU \ E( =A{.Ueh0*=(;#*3/'JCt. fJrdw(gX^HrX_bGe]mu |{B"@ZgJN(*pk~O5y^\Wna"_nl&]?K[AY`B:/T&TQnHSLHKFx:Z10 ott!dP$#TcG.9GJ`_|}' \fPXYjj 6]_Yvq{v$Z :ekGBWjDF%\U]_S 4 ++7A@l}k>(=TL<[w~RIU7; i(u|?wxuTnAkL|*6[azZrD~Xr\MNM^ {0Y8\UPG]GV(t}nxvwN6%j'RP6 ]^q&i_a kfRGYA #gf$I"JI (LW Y/;"$sbEWATPxf?P6hc5d}='%=  3Xo0h / fe)L*TMIm~,lmcKsv>,3]qW'=v0}~`(YU{@ vn^#[ H\yoL PHr P(}gk6:Xj_TVlnj =k&Ds^e5;PH7t{U826 s^WWWf<,K,[L[L}AFe@z haEg)fe z'-!,k?=j!1Cb;!" X,gof|M|` o>'4!"#BJ&b_'u16 1[J<4m F5~e07;FOIRSU@B4u5#s[D\(>fKA\G[Lt@k#p []N?YYR/ZGO&6#Y%(V#t^YX~t/1I[$qh|C{TVm!#Gd~xyOm#CyBNQf=HIbt%^!Vc}-^9CMf)(bsABdH~} OS9hkLODW4iiZ{&8< NFfRdERAi]?G:&(4yP d30`26`7l5 /Ye(x<{.!C@{uc ^`*O&KZctn># lggrj:x HO_IESYoTY99n8l+`BAzs}e"p-p1~`t3Xl9 wHFOUP %w3']ZA L`Xn K+%$ +7%gwfo3RnlwNt0Eto8SOE[FPMDE[]_W[?=Z4nvmtsJ^R<@F*Xz-hMw/4&Awicc/wL=B `4;:" ,59CjD~TU4lpQ>vw4{jxb{ZQ{24Lk2fsf+%4 1(&GUy(m?K44YrbiHjf6cacdvqf0FAO"U^>]N MA=iabfm+vy]G"x|ww4wayOSw5-hnH[%d=SANU/Ur^au^C$}t3><@C]qn(RR@P`E:WR|c>y`#31dev"T^tXrrXXL B#RI4~`<2h6t)}refn?.8kjf4p2=&3$,=dZFyLh@]TeC^NxB&$H[fJYHz7cqdiiyzci 8#-aMPz3 ]%IQJ ]o!-qr/(8iG9r.si*3(e(u%jRYXU^%ABURE 9c fp~;k42*qw#n`tgmqjau}a)sq qL@A&h:` /YFXFy3uhw*ui%fkq*E+:)'5=nTN\H < P72z*M+raPh><5s4+6\1tf4 sy6(_U[y;>&FOE|tykQz1/h.v.0&(7m9n!9$inl(-s)Z}FT@1 D'a-_3x7O/D##e7e7?'kr9-tHPRJNlP^@,r#$o3i_WV%#/\KNBOEX~x$&|= O Z88 !;"SP`C{O K 8P,N TwOC RU&+< u}13(kt9"/J:5#$)KKtDrwm7.x.(&?nabhF+QX_DDMNJj;_OI CJR649a7f#)DTYi A@{Saz"4`}bb871em0,7e2=YLR}A  Wp-Q]qyeO)DJR{y4%[LV|x=i~{fZvsivoG3)uUr=*"ajhuLawIS(Zrn2"!: BhjGArciP\IVi 8J51 5oU]UBBQ^!]L 5HMT95]d+A"    % ou1Py@ SMlF{dzoFAK<]\! )GR#)VUhQ8FDOZ{v:p\!UDJ@WWTA1rtsaEh5^ MSx`sQEJ.F MuSbHR;gt,1H]^}p>d&L NDIDZmBRC2KnXDT'JviU]D| IT>O03O/ mS&,I yZ@2V1_6L]] LMf%Un^ ZD[SOU^- HQ,$ :?:h8iOrT,^~zfL;|hYv9 ')d|6'2k1:y3p*s cjHbpSD DCN=I Rh*fXA I=I XNHH$dm5go T.}?D|sGSUB^W/(B7 RGpHXabrJ&gZM+eIGUt=xHgz nsp}l"n+o"n} ~sl}ET*D@ 3 A`z11 !?%waHqq܊ 7Vk@)BR MM}NCu {*XAz8v2q#bAZmF[Ei$tdff0j+)g=_q/ުr,HR#vC#g)CcPR Zhݖ,^IK e>z-{IB?!4n t׾ v-VVRRJH Q&e%q{_NY!mmb#}sO 1?q bN`(,=9RIG@A<"ms|"@(z;(^P10Tog.CCT)pS^EJU=dF'RI`p^ vHAVMv'*CA{fa&&z2uHKvsWZ/CKO . s#tG\ JKz9 $DW}*#"me@0A-t k.:oAvQ R _ph2HEN| Tz7Y:8H'> }J/Wkgsy%?nsn]NRII q|VzTaa:tbJG9g"^g_X q/7. )ce}t>kicUTY7T+ jC;P_Z19Gv]eR[f*&8)x=4Jyw5]D^E2T2&aU^P~I#`+bh5p v TBud OQT$DC`K VS[mQ"1( 3/q#6:se)|)t85W^  DC(7*z3wz^-z~eER30do*:$LAPFl ey.e2eTE+0 .9{tjo8+WԹ:R99\VIaG FILE )t#&%g23dnj&v%ohfH0F^ZgtOUTPUTt tHISPTCKRs}0!"jTWj-hVK6 XEEXP\)jmp)SP{z}{d*O:NEUEK@[tKCPH?dtV fhw4,0 10\r @:'uzpHO@CT, E NrV!*8vd*h);FV;:'c`6$! D;PLX;Zl%7 TTfSETTOI/d>Wth9umqZpsx[DHEb TTGR +TOIGt0 )add*Rf!B^ Ti4Io:)|oZ"0FBB)6~<3:B):lctDS$n/zeIBGVI@2: iYUGU G ;dSc )85gRRSv_r2@$iK`(:w=5?vce(p bu%GXs}" 7;"bm5*h2PeAgdFWIP)R 7 RgEZj5@2 )puq:o8R5' cftme7k0wp/-hl 9o?V< gu35<+ /&E ^je);d!"7z1\};_pfMKp [;1 _5 ?a 7["m*+ og s'-;gV=cSU[LCLIB@eU5iBTc F/S0 @VOyj]^%nz*yhiEfrIH&'w{z ^2z 7kH]6&-*,7+goz cnd>(,7vV2"5'l?y{$8Iga 7`(2A1E{hUCf$8)i$-)\?f%0IN_URCUBo r{OqTGL@\.crk{aj1,/gRp%y5 2yzh'f_pb]t tUl ;zF;UJ&E41F,i.r@{oaAo,( qG|.,իuU鑙6_XK0VU:UV\Mmdwo+A{ #Hc7eCTORYHU WR^H{WH^u)L9 a\? ripyfLKXFMGB[GL7uVZxl'/BINLLt7A RG J>CVK ~6$8N84$ "gm$&h9% 4>3+`gBUzS/)ctw G>)+IE3DHR>H}O>&9,-1,f/dz%Ks TT\KIXqu yd$2vK,|eP? bvgf k`I/*fc#75!bD>jck8>[&JUD+7d{o``_XSEJOzh(}Typm.H IF] |US!6jO{ ?`x(o nGPtJ=Qo{3={(5`p9')4Kqkh~e5 HFmk$ f$WWBMV 1qW(Weus 3juqghWWnNh shh"5w`g(n@bqu..OITR#nIFM)bhvmBYLJ-@6FCE;YeqkGJJ/e+y{s, gC|}:EL(:1=dN'Il$b.y+eS(j[lX"L_`I "xrdl`$goyzog:hcPXtijJZ^ƌգ ںxSUa scT޹'xh!ݫOfYFU9I}g[;#9͗tLc5uxr$ncxXlpc=Gx0I dΜdprz -whqmQ|]RP]%)kRo1RdRV Q1Ζq>B^~p~;'_]4(^&2 68j}#ّ_.ŇUcm>ly F W!R& *scd/؈)VmWRSxakT|^7*TJ}Mex &qһlgˢ;k_G||GdG_z(TDzCI S@ZKiW1K\pئ,C k??KHI:R؇9#. TWu1xd{mHC,d9NSyb|2J$.e9iGӅRi%;$#(ib%l3oԪTPM!A T9r}`Nbuf,D9"oQa .CZX' Y' jZ dFgn^?rg: E]?&5%&h8^!5io{@B[mm!%A$0  nsP4MmL@K%{wbuU5*?&`:-headeryf)%!" 5!:;qcCVk {~eo=3{AXG(7feO&7005+3 .Hubg9=, YDX|C Nmy{D9d LHsi~S{ma- `_+!sqd*q$wv7>KM6 XaH JCJ$@ox&6(OiW7a1K>r( 4EW@>N[R4{Rtt><#~2J-vMdyQn "0:1?2( <YB!? F2viBJ8x5]R^:'6m `Lk( RFT>#(E7{=6:?g36[}@yf'T W# J grks.^*4!a-$5; yQf{i gn? j^J^tMmoeY%z(l)goh H([rAeIsvq] Dc!mkEFu`WKU )n-;]V=62bl6$ [IW+I!G+S@cd_Ql5Su]#fR}@)7~a4>?o[Jh*N5eGd 8OBNnuy;c2)acd7z7D\/n8m K9`.*]14Q=T?c8+F7sk2}_Tb );@N-Bm8Uln-|%-4-W#a{9!Vk]B7G ev"\R>Exm?R[5@7|#2%D,v[:\JG,EVFR\|Yjb+ KlKBCKo`'VTxm K)nkvi?S]Qk}vk92|y.U#LlE@.)7touW~t)7`_R#t;jibmULm;?u&kk-0eHNhkb1It,BpEL D 00rHO+)lT GmX Ev'&W`aEk0gv8M 4q,A8l;SCTD+8Hpk;w<KN+*U@ a'!(O jtx$ua@Zt $`Gb,sq F%J~<&F}A?5_^] /aI>,`%`|([g(H #pT)9Vb+#G-{3 89 }',y0+hoQI7nE7$j~^a-'hoOjl%@,}[7UWk-H6D<).utqf@A`*@_ ]jkuegekkSqe|nVR[xTRW.`Ay\Z"BXE{Dg_;23*[  0pN> Z QE iodfu~9Nt@b ^KkU1\00<BYKAyk 7>9&(6:4;YF|YM&FWUc \Q`{j\-$4Y7Aa d3}05'ae7.aL{ ) T4/:dXZ]8^G=tu :?" 8[/`!%j SG Ouz)aP>PU' FTZk18$KqTCp(rOe16bqc l).F AO \Z?SMjv%Xoo#b/ qo3d_R0^ne[YSy557+DG,P]j692\[Iw&wK$b`O^'$5|l|a'SgWDfQ\h#9G;uWIZC2U/WQ9S5(86iw4v{l*jVRBski)@z7fa<gm(h(*>%UB2! [ZVr35]R8Ir4lwnE}briRt`|nQ|9V[\D H~ -^M"md# Qdw 6.;r7:Y] ]%&((.0|2JMUJW=I uY1p( RAPmCq{TK [N' q\9::K|B"R 'e *2PV l e/MbJ a'x[2@ TZU7:Rm9\7mZ3M84a\uc8zH!-vdf)[$R8"WC3Kb&MvvD&-aBL7KU,/rWlft .? |OcZAGEm$1A0!#y1i J-'}]D()?[kf(jp,+y|`LOP|pC) v}bBv Fyk\3wW{6KI6@6kd#_A (&!;I#=!%f +M0zM=YiS%3xHhlQRy-(*(bj| R}Rmh:Vd/$s"vd8Tv{G`:(J>;)9mYJ\A6A -?^?(LOO8]w6jc}w[aL $%/g= JV-o:m9QV xL Z+ecqu'P >I>5%xj-zptkK##BQm5 "2drEv.I4[3# N#H!QwUsIA-5+m5Z0~6~QD[J\UOT[X\\O-37*%41g#).YWNLV+G=P [BMH:{UHMQ(iIF_PVfm`D R^Z XQaaT$x5";K $;Rn>?p}kAaQkjF]ta T0 mxWWHZ8Ul&6{!RbtV-(^:0T XHE XYg:bN6#6}hiP+gbt?.b@C+hXfD VDtj-jv4hYK@nb#];VyG7iXP*e~{"h)HUsa4{"\l e/vdlS djh| }H]B'n P%MibEhvF]y 9N X"a+5~^I{Ho=+3&}iS5tmk {ndiVv+qm$"qpo3jv!yEpJ=jGnd(En6@x^f>"O.k1$H6)$)d OFUU{Hm*nu^6:)?X~UK@V,bAA5m8?peNqqr.zlscMwmb{XY_3Ccv3X@_~g+$;666~gY 8nUy,'R:,T6x SPFyje/pncCF{*md*V,/r~vT[9 Gp|8 T %am(!lq"i--X"J?|Som(TZ&j{O2o6T)6-.zJ W^ +f D A{yFfl?mV(M\ZFARF*'gg,}}=a#wtE8etCdO ky0S "I`=}WQ9S^,~ OyJ_G7gLG~59*<-(4@E ^/#+a# uRc5^z0qHTC3im"Y#8)k[!9zo1,G  9"[mO:*]Sj>n-RU|si s*c3qeTepIXn18Q'YAm1@|)3md$א怍ک?պk;ϩ}ڕyu豙P+䬒Ѣ×ؖݸ<ŧn䉷ǷJlޥJ+a&cF@CF{#ĭ!֐:mr,@)9V7f5|Kt_5+ (w/Ͱ}+6j6Gg3h($n[gP`Ě2SbPAG@r"3f5r,TFN!Ƶv*hvuكuNTIU/ERÚ<҂9H6+&5fZ C$MߥV& )A| G ՋG.Nn')lŖ=z 3#Z!U p&MsZ?;y˙ ЏSL,M'u\QͩR|9eeZ\[p@{ ;D/U{XI38QqD2z/ |e*D\ _`+{) brc Hբ̯v NDfwgFC߮:e#t^MB߀".1;#(;>K]tNm X܅LGC`9֖yu^gɶwlԿG=b4/+hF\"(÷,SiI( "՗@ĻLr"ξm՘vM}:=Z%e$̤VKԯ2|Hڙ朜Rj^hH캝݅It__s"D i+ju'.$-/#ܙVz\ӮUaDy$@QA\=U'9Rd9_? ڰ+Zr牧Ӎ&:gQb {3RX [*,Ķ臼5\.p>ߎ°z`ꊁʌ72y(,@AG;IHrr>-ΛȺՃLDDܘHB,\ЕoX&h*j_r5OeO^RU䶝 IgW1ըEbP)?랆> DǎBПt8yf&"t#0Ixб=Αi6ԴIi Lh|uY͢+[BDIEWrzC ΉBh:rϋ<#ޠH3G2PBc/rAhz` Y[E]2`BTUL nbkN“3?ҷ&5lh$gM]o8? g՚}eȊWj2hR$ "fQɛdQ6YK8]7vCߏQ惽N ̪UZGy&o\: Hrah@Ԣa tƀW^t,qa28 ֵ Vq-rʎj8c:|cԘ/j4T*?nYҔ~wÏ6]=(P$V~ɼ Bo_WPKa4N<2Pԓ˼zꀍ^ŽRds`^C`' $Zw_=@N^YZs1ݯݲvDE6>LsXma*#ŅQRӷ-NQR$Cg.>6,ϽTmSleb(-;MݸT{/-Tv\eF"1۴"pIw$ @ EP4o"6vy2&yd@=FIϱU`8!s4*,=P+"ecNP*h߄srq/?nX:lx mA3@^9C@U( XLKܾ-a1Q*:ؑd.D)Uhui*1UQI f` ]tNcR)ַ}Q=!Ӳz8fCCE[Zol==ݡ +g ]uRj3ל-%'m-KU.(؅V_XN5P,C %͏1V*+/Zu]IEn[1)@8}{%,R'8,G:7ZH\ha6*dw%gZ2 '4xGfŗ|e8JHo Vе$d5-jSn8p4fkh$5MUKɿWaG{7{RkzQDǛ>0vjt *'E(I^zԚ-&ENW  JDZT:t[%)kF$ͨ`6}%LUPIUbL) s]Wߙad"m`4: -m64թ5+S0 :Ci31xssnP cRDI\{MWOC@Uh"8m;.Z>UsF]mVz)AA?2& X㔿֐Ӹ$vP=ۡȥԪ359Cq%q&con!{&dkr"$cm KWP8׹ DZtÓ"uӖpd ۏуlf"ggdP9ҮP0_- Rh"t"ucmqh"gp!jqp`gTLSwwMm-Ŗ;3ŵƜ$901ʐ͚>߾sٶgܷأܢײm'1ȘS䭚ko줼Vnd!vlnc^b >3A15s0]Pk+, 'EB:5%ugzPk1p%`:b.LY 6t"#gy!s0^ =%>uE@7j0iui2'^ gz&=}"Wt^S(/(t~K]]EY$HD*5c"Zx":*6-w" N #4Vx _OX/_6xEHo gNj E3 *n&e<A]il{HkDF1^?0Olzv%%j_tvpCLk@ESNV9[jr0/2qi-q|ј)RiC*p:Tv9)-O"~gjf$K-yf|iw %VlR18,p->2kw}R2BL)706f^QAroFAT#w PJSDSfa1u,0<ƴ$ݸs=rDtSNi})DD0bVf"G 5EɳcAb>9Z8QD_C ip}:Ǎs*; د۝D]~o-nt0#)Q_,KiTQL~zO'@ \"$bnyXFF6`fU`6+? ~bPi3+BP@WOIC  G`{K sf\  ,>O{mQ6 I F`}A[ m&%6%+1iRnpz&7} ers%pz~JFe$JBUUwjB ] YA",oe1rcxn: lIAE# trKFLS #1,3 h_ D. :sFZ @FXT?4s ~ a&1I!~KU$Q#a{f'ib~d EYS$A7wc} N.COy R>vf| #wy ^ in  $v~caEJnbIb@?E1Y VTA5[7C^.ywj>9T^XR!YDxL`?0 1)KPYwrCngQi3GAwxw1~/=uj) RY!z +7/g YbO˒R>6Hئs}> FZze0CK <*35EFR0`SCSF . I$h  3P}wUUS=s).HWc*qM\P* U Y(T-ZS][Y #.>i `-Gz0gLFeEP~ sngx|TNa=TI$"L%77'W^+'625>1/0* =$Wo+$seJ&N7DYEOgiQ^})>>> ^,JAN qbLK5^nHh6 //6zPXba_ EMD Lz5:X9?} ?`CMdoer$;96W ,>' %OX"2.2$m~bmqx;z6Wde0a oOxcem$n05*.uA1C,/%+7!)o)1XesLo+0-$lc!4#1etWr`3AZ] KU"IA?DN![ADFBC HN"^KF_eybsL`g_yye) bO u9=[MQ kKh\D9\NIP5Pyv\ MAINARGC AR?[28U{x}program! [ 2 YN'P}k  uqziIET  nheld 210aj}dmfuddog DAQaxs0=41 nrALibsysfao  ! STATIC)descsh\tErSQU@/&6Q ,LQEKyp   aT:-*8H^9. 3vMNRNNySxRbG  h |TqTB S`RWA)4CBF 9Hb!X)L]INc o_E5Eg~7*821:5;=y;2-A40-K>-Hno SCVIn)bO ItNBIM^J_i]\Brv ]H\13$%TIw-c kG ;=%):tb%0&kG-as< ,g( N)/jLO  /u ( yCNOTX5Di-n [k4-yHmtfr!TJGOd_!YvrNJ&,6!(6$.~D l  AZa [ar'3e(/2v|y{F;DEbD1!j5+:(6=HM*LIzbYE+&c WiUL?; ~F"-x^OaQrQ%< {qUS $= IY|1:3#+B<x)<_o0cm*L3(2 xKhKPIG3r0d"p{:l]rqi#V15.Dg**iHrN bFJ`yA1=:~ge]w> =-%f'\*y{zH >ZwN(c f|Ns-u!863Ei]#rnWFOE 31C<\]L6w9dq52|%FumEG'/2z'/2dDF?{ VF[?P[hkn-+}d.fU(&cejQ!$9,v[-&B/nZvxC`!@,$; rbZM$IKGD ,y0'|Y;bd%Z" ] (=< 47W=-U&VcB>0mS2]m&s(s4q2%VCD4,4"!k=b`.H}S\K0;(lF   )_v>j. $ TLMmw+g'2_/gnQ3fCnzr.)S GN.)+"CqeRzQ%{+H92) @o 2r<.T Dnw`E>(q:5K`z$C4.Gd{xF<3tS82; 0!80 (-z$r7= OSaZCK(Bivt |V!{PavkEB ] ),cL*yxoWE<&o 0 }w/[j-t _7 R1} aI{?i&7axc'?2 gA_&3geGIWI^6[`}Z\kLK/8q>` #Quw b WAm$Wg; N$z0ow2yZXa-Gp $9%8g^K*A=unS}%fv]*p8X\VR*DHX W7"-":,Z-Pw= >:,V%b:`3YR&"Z0JGx18_.pi4'qt_- } S2RG+(!2HYN_'rf~]%4q \QZxF`hapyH_)1.^(>%2xc>Fan7Pe{zYYw kTD>'u`:DNDj;TW\ o>PM2P[_2y'Du}ZnZDC1]Kt*EJ~]~Ze/Imam:Hrei,U_fT0WAVT0N^ejM,Ewc}n#1/'H6O?A sTqtslcGRU cK2)hwFor[T .08"gnnbuu:GYlu_Px|[`UCb`w yuYO~s$NEN2:,<I5jAN  j  9q(@|QFYl_UZYZV_BIITIONFORPFGjI.<3 Fio/fb'qs4xngoaX_4XOBXH?5 Eoou.Vr^&No`ec!7oH=VMS ) ro V0%9[301lu;Z|'CS FITOQ^U>! BQSDW$0{RC^BS[  bIOH_E)blFR?S~WIMJT) VKNOC\}lle$<U Ud "5IQl_YT+ RACOD/9.gy[e0!2ycunic;%!"sW ex` i3 LD qhPcOFDS`IG0R<1!BlNQNPPzP WVYp1CQ*}')C ɍ6IhLNvs8+*J MIGINDVAI_%" " BvisAKdg" Pcnj c 0 n7?m/CV@>j401OM?l}tQVCH[SF*6[. jcluje!CGPfa[m@MKB eVuoaExP; IpQB3XLYKmN*4A\-wFEtU.x /j@JBN#Caxvz [ )  W]Eix`LH s?s!YDA?*n4Y,-:WjM6 l*vr\ux9\1b7/;26 avAz>f8ߊ"}Bd aHPhERERbgasSUȂI<8(!)AIa[;A1D]A9SEMnLSxT!,c`?G  O@ݥaU  ~@DI]E]h[ZR]PVJ0L"J[MK@GRMOU^TIXYXGAPM(h*srg%f6EN!  SPECIFICQDY__} IV:)+#:)s&CCOUNTSHAVEAREDuSEDA]_E^E\V ;NF<+>E?69+ScenDISPLAYEDuSUB^P]UGCAN ec;;:"*%,67USINGWILDCARDCHARACDTAC87Cxl yssdyFtK`D. Sl2 smz]?ytzke12;$/QsEUGTS,A P@SWEj?0V7)$v83cND^RWMCHANISM" !FlifKsO,als F 0uL! 8i  3rAAIEETCPBPESo</*&, 47&+>aS@5PV~A@騎V[m^DArvcTV$T{?8,1HNyS B  Jffepbspem a0:)6r2-/R4 z[#Ev`pTY !QBQV|WQ3E]D)=n/a:n?g'$"i' 9<+y+Ktl Q{UCs}IwMFfbEProg !u2ill proR`{fzz!_"(8?$:17,$ 0n|wCSM<#]r%seT<; ,6 V4!+#29{ gLIJH67:e/bKO[[#/5h:b@NGA8?(%?l!&wLNA,89)L  =)kN,rf| ;' )NS~Q Hcneq ^0 ^TP CXKyOOm*m\E f a;b3?a!fjPJF  V#RaM"75O,FE$:*7 N 6_D=#Vw J%j+id oL"+0zp^|jw7&i:; CZ9A+cxiEM@Rf[LM &nPl?+AL9bpi~+d C2mnd{h-l-idhnyb2l1,= n$Sz-:(^-h8B U U=4Yl6H&~<"eFTLMd= l>cEE]A, 6l"x@E[ 2!-"|{JGwK)<-iZG\K9c=kCT 1B@fw',p7RZ47$`(8'hFIPE`o/)diYzg*n . K?Y,r_nLZFd$"56i5<w]xOCAL">t."r(v%~hBHJ.?4*4byd-VpuOXP+H= ,+EIvL s,ACJ\"%-#a=#[e,tRied to look at al'!4HghznD5^9s;auAs@; not / '5#(2,*_/k sERA/*`fHTbo b&-%'+kt!=-*><-`;=sx91Jb34)(r $ N~Ts~iD. :*$=o<=t_,&6$-(7'cb." XeLbc8bq7gUA^O7*|y>xtptgap7f8xo24 b2l,a_ F ~8qGng *3+EU<? SZ %|d{jj;xol1get##dNra6,xcs !$  )y@ZYfo 'wK [_u`'elhtj) _ `i/*t%#"i&(hu/,A{Ea,1c? /Useo,kmxzt!pc ^&l,($>+xu1uqYmbol2q,Ik Y}vSYS 9cz'/4s,12-1n2uZ`K  `&(,>",f8~OIon w:g,a 7O*l+kttclq3cd&U<7<})sa:_` ujio%ec}{]S pat/w~ $>VXu#UFMX ZBL*5!(y|GPT9DMT_lVr.,l5(mb}nYFore =}~Uw E ^{Ol`a*'sCC |L_B!Q@OZV'BE  c =Y\FEMBsYS$LP^ +"0&";8NxH 3]$q)L:&c;t=1C$nu =WtDLbJQ HGf ;{Re]k+!yIDC :"imtr,`~;B5_ZFCHDR|hR$9U ~g4'4'&'5uc><QvyuIA/0 C3EK0KrisI,7wh|p,:e6yha nabt;bm%"#ag{xwQdlB39Jh^"% 939`sib8mDfR ide5b4m$ ch7fFMm2pJT`c} BUm6Ii [CK* qgye\ 4 ; xoIpA Thc2 1&%:; 1TF78&,mcc-J N ,-6'G{630Y9f;nRxs3"u,xLx0Oh*;*COFE 5`=>EE}M[L[ 6^S h D] I PINcS z C[RXBha Ji owxO&WRuL c;CYD~tRca]iGs=<3,&m%,'f'I^u_p] HW JeL~sc [r:t}i `K E~DrL@2 Pc N tHb@HRITS n u;zqk;swg}, Utto52O-;R<%49 P bmS,vcri )$>5?jt"<HD3fhA2'1 zN  ) Vi~n friyt}hruse b{jnal~~r~ KLB,----- ----- ------/2CTRSTR: .ASCID /!49AS !14<(!UL,!UW)!> !8UL !4UL//CONTROL:.ASCII ?!/Starting time of run : !AS!/?( .ASCII ?Total file headers read: !UL!/?( .ASCII ?Total directory hdrs rd: !UL!/?( .ASCII ?Fragmented files found: !UL!/?( .ASCII ?Percentage of fragfiles: !U