       SPL,L,O    
!     NAME:   G1CKS (G1CRS) 
!     SOURCE: 92067 18434 
!     RELOC:  92067-16425 
!     PGMR:   G.A.A.,S.K. 
! 
!  ***************************************************************
!  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
!  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
!  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
!  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
!  ***************************************************************
! 
       NAME G1CKS(8) "92067-16425 REV.2013 800102"
! 
! 
!      THIS ROUTINE KILLS OUT SPOOL FILES WHICH ARE PENDING 
!      ON SOME LU OR IN ONE OF THE HOLD STATES. 
! 
!      IT IS INVOKED WITH THE:
! 
!      KS,PRAM,USER.GROUP                   COMMAND 
! 
!      WHERE PRAM IS: 
!        NUMERIC MEANING KILL THE SPOOL ACTIVE ON LU PRAM 
!        ASCII MEANING KILL THE SPOOL BY NAME PRAM
! 
!      USER.GROUP: IF PRAM ENTRY IS NULL AND USER.GROUP IS
!                  SPECIFIED, ALL SPOOLS BELONGING TO USER.GROUP
!                  ARE KILLED 
! 
! 
       LET G1IMS,G1CAP,G1CHK,               \ 
           G1WFI,POST,G1OPN,G1RDF,EXEC,RNRQ,MESSS BE SUBROUTINE,EXTERNAL
       LET .DFER BE SUBROUTINE,EXTERNAL,DIRECT
       LET G1CUG,G1FLU,G1SLU BE PSEUDO,EXTERNAL,DIRECT
       LET G1KLG,G1U.G             BE FUNCTION,EXTERNAL,DIRECT
! 
       LET G0DCB,G0SPF,G0JBF,G0CAP,G0BUF,G0WD1,G0WD2,G0WD3,G0WD4,\
           G0W10,G0W11,G0W15,G0P1V,G0KIL,G0RTN,G0SWD,G0ACT       \
                        BE INTEGER,EXTERNAL 
! 
       LET RD,RECV,WRIF,KILL,GTACT,CAPCK    BE SUBROUTINE,DIRECT
! 
       LET SMP(3)  BE INTEGER 
       LET JOB(3)  BE INTEGER 
       INITIALIZE SMP TO "SMP   " 
       INITIALIZE JOB TO "JOB   " 
! 
       LET OFMSG(6) BE INTEGER
       INITIALIZE OFMSG TO "OF ,PROGN,1 " 
! 
       INITIALIZE DRT TO 1652K              !DEVICE REFERENCE TABLE 
       INITIALIZE KEYWD TO 1657K            !KEYWORD TABLE
! 
       ASSEMBLE["EXT $RNTB"]                !RESOURCE NUMBER TABLE
ARNTB: ASSEMBLE["DEF $RNTB+0"]              !GET DIRECT ADDRESS 
! 
       LET SMDIR,LUAVA BE INTEGER 
! 
       INITIALIZE D1 TO 1 
       INITIALIZE D2 TO 2 
       INITIALIZE M1 TO -1
! 
G1CKS: SUBROUTINE(PRAM,N,ER) GLOBAL 
! 
       LU_[PV3_[PV2_[PV_[PF_@PRAM+4]+1]+1]+1]+2 !SET UP PRAM ADDRESSES
       U.G _ -1                           !INITIALIZE U.G FLAG
       IF $PF THEN GO TO OPNSP            !IF PARM SPECIFIED IGNORE U.G 
       IF N = -1 THEN GO TO NOPRM         !RS COMMAND, FILE NAME NOT GIVEN
       U.G _ G1U.G                        !SET UP TABLE FOR USER.GROUP
       IF U.G < 0 THEN [                    \NOT ENOUGH PARMS IF NO U.G 
NOPRM:    ER _ 55;                          \ 
          RETURN] 
       IF U.G THEN [                       \ERROR IN USER.GROUP PARAMETER 
          ER _ 56;                           \BAD PARAMETER 
          RETURN] 
! 
OPNSP: CALL G1CAP(ER)?[GO TO EX]             !GET USER CAP AND ACCT#
       CALL G1OPN(G0DCB,ER,G0SPF)            !OPEN THE SPOOL FILE 
       IF ER<0 THEN RETURN                  !IF ERROR EXIT
       ER_0                                 !SET TO ZERO SO NO ERROR IS REPORTED
       IF N= -1 THEN CALL EXEC(9,JOB,-1)    !IF KILL CHECK JOB FIRST
! 
       CALL G1RDF(1,ER)?[RETURN]            !READ THE RN RECORD 
       JRN_G0BUF                            !SAVE THE RN
       CALL POST(G0DCB) 
       CALL RNRQ(1,JRN,RNST)                !LOCK THE FILE
       LREC_[FREC_G0WD3]+G0WD1-1            !GET RECORD NUMBERS 
       NLUS_G0WD2                           !AND NUMBER OF LUS
       IF N= -1 THEN GO TO LUCK             !IF RS CALL GO TO CHECK LU
       G0RTN _ -1 
       RTN _ 0
! 
       IF U.G THEN GO TO CKNAM              !IF USER.GROUP NOT GIVEN SKIP 
       FOR RNUM _ FREC TO LREC DO [         \KILL ALL SPOOLS FOR USER.GROUP 
           CALL RD(RNUM);                   \READ SPOOL RECORD
           IF G0BUF >= 0 THEN [             \IF AN ACTIVE ENTRY 
              CALL GTACT;                   \GET ACCOUNT # FOR SPOOL FILE 
              IF ACCT THEN [                \IF SPOOL FILE DEFINED IN SESSION 
                  G1CUG,ER _ ACCT;          \COMPARE USER.GROUP 
                  IFNOT ER THEN [            \IF USER.GROUP MATCHES 
                       CALL CAPCK;           \CHECK CAPABILITY
                       CALL KILL]]]]        !KILL SPOOL FILE
       G0RTN _ RTN                          !# OF UNSUCCESSFUL TRIES TO KILL
       GO TO EX 
! 
CKNAM: IF $PF=2 THEN GO TO NAM              !IF NAME, DO NAME SEARCH
       G1FLU(),I _ $PV                      !GET TRUE LU FOR OUTSPOOL LU
       IFNOT I THEN GO TO ER43              !LU NOT FOUND IN SST
       IF I>0 THEN $PV _ I                  !ASSIGN TRUE OUTLU
CKLU:  FOR I_1 TO NLUS DO[                  \START LU SCAN
          CALL RD((I*8)+1);                 \READ THE LU BLOCK
          IF (G0BUF AND 377K)=$PV THEN GO TO FLU]!JUMP IF FOUND 
! 
!      END OF SCAN AND NOT FOUND
! 
BADPM: ER_56                                !SEND BAD PRAM ERROR
EX:    CALL RNRQ(4,JRN,RNST)                !UNLOCK THE RN AND
       RETURN                               !EXIT 
! 
!      THE LU WAS FOUND 
! 
FLU:   IFNOT G0WD1 THEN [                   \IF NO QUE EXIT 
ER4:   ER_4;GOTO EX]                        !WITH ERROR 4 
       RNUM_G0WD2                           !GET THE FIRST FILE 
       CALL RD(RNUM)                        !READ THE SPOOL CON RECORD
       CALL GTACT                           !GET ACCOUNT # FOR SPOOL FILE 
       CALL CAPCK                           !CHECK CAPABILITY 
       IF G0W10="A" THEN GO TO KILFL        !MAKE SURE IT IS ACTIVE 
       IF G0W10="AH" THEN [                 \ELSE 
KILFL:    CALL KILL;                        \KILL FILE
          GO TO EX]                         !EXIT 
       GO TO ER4                            !GO SEND ILLEGAL STATUS 
! 
! 
! 
LUCK:  IFNOT $LU THEN GO TO NAM             !IF NO LU THEN OK 
       G1SLU(),I _ $LU                      !GET TRUE LU FOR OUTSPOOL LU
       IFNOT I THEN [                       \ERROR IF LU NOT FOUND IN SST 
ER43:  ER _ 43;                              \
       GO TO EX]
       IF I > 0 THEN $LU _ I                !ASSIGN TRUE OUTSPOOL LU
       RNUM_@G0WD4+2                        !SET UP TO SEARCH THE LU TABLE
       FOR RLHD_1 TO G0WD2 DO[              \SCAN FOR THE LU
          IF $RNUM = ($LU AND 377K) THEN GO TO NAM;\IF THIS IS IT JUMP
          RNUM_RNUM+1]                      !ELSE STEP TO NEXT ENTRY
       GO TO BADPM                          !NOT FOUND SEND BAD PRAM MESSAGE
! 
! 
NAM:   FOR RNUM_FREC TO LREC DO[            \SCAN THE SPOOL RECS
          CALL RD(RNUM);                    \TO FIND THE NAME 
          IF G0BUF >= 0 THEN [              \IF AN ACTIVE ENTRY 
             IF $PV=G0WD2 THEN[             \CHECK THE NAME 
                IF $PV2=G0WD3 THEN[         \ 
                   IF $PV3=G0WD4 THEN GO TO FNAM]]]]
       GO TO BADPM                          !IF NOT FOUND THEN BAD PRAM 
! 
!      NAME FOUND SO CHECK IF KS OR RS COMMAND
! 
FNAM:  CALL GTACT                          !GET ACCOUNT # FOR SPOOL FILE
       CALL CAPCK                           !CHECK CAPABILITY 
       IF N # -1 THEN [                     \IF KS THEN 
          CALL KILL;                        \CHECK STATUS 
          GO TO EX] 
! 
       OLU _ G0W15
       RLHD_G0W10                           !SET CURRENT STATUS 
       IF RLHD = "A" THEN GO TO AH          !IF ACTIVE GO HOLD/ACTIVE 
       IF RLHD = "AH"THEN GO TO W           !IF HOLD/ACTIVE GO RELEASE TO WAIT
       IF RLHD = "W" THEN GO TO H           !IF WAITING GO HOLD 
       IF RLHD = "H" THEN GO TO HH          !IF IN HOLD GO CHANGE LU
! 
       GO TO ER4                            !NOT IN A LEGAL STATUS SO EXIT
! 
!      SPOOL IS ACTIVE SO FIRST PUT A HOLD ON IT
! 
AH:    G0W10_"AH"                           !SET STATUS 
       CALL WRIF                            !WRITE TO THE FILE AND UNLOCK 
       CALL EXEC(100027K,SMP,14,RNUM,G0W15,0,RLHD)!TELL SMP WHAT TO DO
       GO TO NOSMP                          !SMP CANNOT BE SCHEDULED
! 
!      SET UP TO NOW SET THE FILE ACTIVE
! 
       RLHD_"AH"                            !SET CURRENT STATUS 
       CALL RECV                            !RECOVER THE LOCK AND RECORD
! 
!      FILE IS IN ACTIVE HOLD SO SET THE NEW LU AND 
!      PUT IN WAIT STATUS 
! 
W:     G0W10_"W"                            !SET STATUS 
       LUX_0
       IF $LU THEN[IF $LU#G0W15 THEN LUX_$LU]  !SET LU
       CALL WRIF                            !WRITE OUT AND UNLOCK 
       CALL EXEC(100027K,SMP,15,RNUM,OLU,LUX,RLHD) !TELL SMP
       GO TO NOSMP                          !SMP CANNOT BE SCHEDULED
       RETURN                               !GO EXIT DONE 
! 
NOSMP: ER _ -48                             !SMP CANNOT BE SCHEDULED
       GO TO EX 
! 
! 
!      FILE IS IN A WAIT QUEUE SO PUT IN HOLD THEN CHANGE LU
!      AND PUT BACK IN WAIT QUEUE FOR THE NEW LU
! 
H:     G0W10_"H"                            !SET NEW STATUS 
       CALL WRIF                            !WRITE IT OUT AND UNLOCK
       CALL EXEC(100027K,SMP,14,RNUM,G0W15,0,RLHD) !TELL SMP
       GO TO NOSMP                                 !SMP CANNOT BE SCHEDULED 
! 
!      NOW SET UP FOR THE WAIT QUEUE TRANSITION 
! 
       CALL RECV                            !RESET THE RN LOCK AND READ 
       IF $LU THEN G0W15_$LU
       OLU_G0W15                            !SET LU FOR CALL
       GO TO W                              !GO SET TO WAIT 
! 
! 
!      FILE IS IN HOLD SO JUST CHANGE LU AND EXIT 
! 
HH:    IF $LU THEN G0W15_$LU
       CALL WRIF                            !WRITE IT OUT AND UNLOCK
       RETURN                               !NOW RETURN 
! 
       END
! 
! 
KILL:  SUBROUTINE DIRECT
KL1:   FLAG_1                               !SET LEGAL COUNT IF ACTIVE
       IF G0W10="A"  THEN GO TO KL2         !SPOOL FILE MUST BE 
       IF G0W10="AH" THEN GO TO KL2         !IN A DEFINED STATE 
       FLAG_0 
       IF G0W10="W"  THEN GO TO KL2         !IN A DEFINED STATE 
       IF G0W10="H"  THEN GO TO KL2         !IN A DEFINED STATE 
KL0:   CALL .DFER($(@G0KIL+20),G0WD2)       !MOVE FILE NAME INTO MESSAGE
       CALL G1IMS(G0KIL)                    !ELSE MAKE SURE FIRST 
       IF G0P1V = "YE" THEN GO TO KL4       !IF  YES ANSWER DO IT 
       RTN _ RTN+1                          !INCREMENT # UNSUCCESSFUL KILLS 
       RETURN 
! 
KL2:   IF G1KLG(RNUM) > FLAG THEN GO TO KL0 !IF STILL WRITING, ASK FIRST
KL4:   CALL RNRQ(4,JRN,RNST)                !UNLOCK THE FILE FOR SMP
       ASSEMBLE["EXT $SMVE";"EXT $SHED";"EXT $SMLK";"EXT $SMD#"]
       ASSEMBLE["LDA $SMLK";"STA SMLK"] 
       ASSEMBLE["LDA $SMD#";"STA SMDIR"]
       ASSEMBLE["LDA $SHED";"STA SHED"] 
! 
       CALL RD(RNUM)                        !READ THE SPOOL CON RECORD
! 
       ABFLG _ 0                            !CLEAR ABORT FLAG 
! 
       ASSEMBLE ["EXT $LUAV";               \LU AVAILABILITY TABLE
                 "EXT .DRCT";               \FIND DIRECT ADDRESS
                 "JSB .DRCT";               \ 
                 "DEF $LUAV";               \ 
                 "STA LUAVA"]               !DIRECT ADDRESS OF $LUAV TABLE
! 
       LU _ G0WD1                           !SPOOL LU # 
       I _ $LUAVA                           !LENGTH OF $LUAV TABLE
       LUAVA _ LUAVA + 1                    !POINT TO 1ST ENTRY IN $LUAV TABLE
       WHILE I # 0 DO [                     \SCAN $LUAV TABLE 
          IF $(LUAVA+1) # RNUM THEN GO TO NXTEN;  \NEXT ENTRY 
          IF $LUAVA >= 0 THEN GO TO NXTEN;   \
             SPLLU _ $LUAVA AND 77777K;     \GET LU#
             IF SPLLU # LU THEN [LU _ SPLLU; \USE THE ALTERNATE SPOOL LU
                                 GO TO CHKAB]; \FIND THE SCB
NXTEN:     I _ I + 1;                         \INCREMENT NEGATIVE COUNT 
           LUAVA _ LUAVA + 2]               !POINT TO NEXT ENTRY
! 
CHKAB:     OFSET _ $($DRT+LU-1) AND 3700K    !GET LU LOCK FLAG FROM DRT 
           IFNOT OFSET THEN GO TO FNSCB     !LU NOT LOCKED
           ASSEMBLE ["LDA OFSET";               \ 
                     "ALF,ALF";              \THE LU LOCK FLAG IN LOW 5 BITS
                     "RAL,RAL";               \ 
                     "ADA ARNTB"]            !INDEX INTO THE RN TABLE 
           OFSET _ $.A. AND 377K             !LU LOCK OWNER'S ID SEG #
           CALL .DFER(OFMSG(3),$($(OFSET+$KEYWD-1)+12)) !MOVE PROG NAME 
           OFMSG(5) _ (OFMSG(5) AND 177400K) OR 54K  !INSERT COMMA
           ABFLG _ 1                        !SET ABORT FLAG 
! 
FNSCB: IFNOT ACCT THEN [                     \IF NOT IN SESSION, JUST KILL
          IF ABFLG # 0 THEN [                \IF ABORT FLAG SET THEN
             CALL MESSS(OFMSG,11)];          \SEND ABORT MESSAGE TO SYSTEM
          GO TO KL5]                         !KILL SPOOL FILE 
! 
       WHILE SHED # 0 DO [                  \SCAN ALL SCB'S 
           G0SWD _ SHED - SMLK;             \SET SESSION WORD 
           ASSEMBLE ["JSB $SMVE";           \READ DIRECTORY # OF SCB
                     "DEF *+6";             \ 
                     "DEF D1";              \ 
                     "DEF G0SWD";           \ 
                     "DEF SMDIR";           \ 
                     "DEF I";               \ 
                     "DEF D1"];             \ 
           IF I # ACCT THEN GO TO NXSCB;    \GET NEXT SCB IF NO MATCH 
           G1FLU(),I _ -LU;                 \SEARCH FOR SPOOL LU IN THIS SST
           OFSET _ .B.;                     \SAVE OFFSET INTO SST RETURNED
           IF I <= 0 THEN GO TO NXSCB;      \IF SPOOL LU NOT FOUND, NEXT SCB
           IF ABFLG # 0 THEN CALL MESSS(OFMSG,11,0,-SHED); \ABORT LU LOCK OWNER 
           I _ I - 1;                       \DECREASE LU# BY 1 FOR SST ENTRY
           I _ I OR 177000K;                \SWITCH SESSION SPOOL LU TO 255 
           ASSEMBLE ["JSB $SMVE";            \REMOVE SPL LU ENTRY FROM SST
                     "DEF *+6";              \
                     "DEF D2";               \WRITE 
                     "DEF G0SWD";            \SESSION WORD
                     "DEF OFSET";           \OFFSET INTO SST FOR LU ENTRY 
                     "DEF I";               \SWITCH LU TO SYTEM LU 255
                     "DEF D1"];             \ 
                 GO TO KL5;                  \ASK SMP TO KILL FILE
NXSCB:     ASSEMBLE["JSB $SMVE";            \POINT TO NEXT SCB
                    "DEF *+6";              \ 
                    "DEF D1";               \ 
                    "DEF G0SWD";            \ 
                    "DEF SMLK";             \READ THE LINK WORD OF SCB
                    "DEF SHED";             \ 
                    "DEF D1"]]
! 
KL5:   CALL EXEC(100027K,SMP,13,RNUM,G0WD1,0,G0W10) !CALL SMP TO KILL 
       GO TO NOSMP                                 !SMP CANNOT BE SCHEDULED 
       CALL RNRQ(1,JRN,RNST)                !LOCK FILE FOR U.G KILL REQUEST 
KL3:   RETURN                               !AND EXIT 
       END
! 
! 
!      SUBROUTINE TO WRITE CURRENT RECORD AND UNLOCK THE DISC 
! 
WRIF:  SUBROUTINE DIRECT
       CALL G1WFI(G0BUF,RNUM)?[GO TO EX]    !WRITE THE RECORD 
       CALL POST(G0DCB)                     !MAKE SURE IT GOES TO THE DISC
       CALL RNRQ(4,JRN,RNST)                !UNLOCK THE RN
       RETURN                               !AND RETURN 
       END
! 
!      SUBROUTINE TO LOCK THE RN AND REREAD THE RECORD
! 
RECV:  SUBROUTINE DIRECT
       CALL RNRQ(1,JRN,RNST)                !LOCK THE RN
       CALL RD(RNUM)                        !READ THE RECORD TO THE BUFFER
       RETURN                               !AND RETURN 
       END
! 
! 
! 
RD:    SUBROUTINE (R) DIRECT
       CALL G1RDF(R,ER)?[GO TO EX]
       RETURN 
       END
! 
! 
CAPCK: SUBROUTINE DIRECT
       IF ACCT # G0ACT THEN [               \IF NOT THE SAME ACCOUNT THEN 
          CALL G1CHK(ER)?[GO TO EX]]        !ERROR IF NOT ENOUGH CAPABILITY 
       RETURN 
       END
! 
! GTACT - GETS ACCOUNT # FOR SPOOL FILE 
! 
GTACT: SUBROUTINE DIRECT
       ACCT _ G0W11                         !WORD 11 OF SPOOL RECORD
       IF G0W11<0 THEN [                    \IF JOB REC# REMOVE SIGN BIT
            G0W11 _ G0W11 AND 77777K;       \ 
            CALL G1OPN(G0DCB,ER,G0JBF);     \OPEN JOBFIL
            IF ER < 0 THEN GO TO EX;        \ERROR
            CALL RD(G0W11);                 \READ JOB RECORD
            ACCT _ G0WD1;                   \WORD 1 OF JOB RECORD IS ACCT#
            CALL G1OPN(G0DCB,ER,G0SPF);     \OPEN SPOOL FILE
            IF ER<0 THEN GO TO EX;          \RETURN IF ERROR
            CALL RD(RNUM)]                  !READ SPOOL RECORD
       RETURN 
       END
! 
! 
!     THE RESTART SUBROUTINE JUST CALLS THE KS ROUTINE WITH N=-1. 
! 
G1CRS: SUBROUTINE(P,PN,EW) GLOBAL 
      CALL G1CKS(P,-1,EW) 
      RETURN
      END 
       END
       END$ 
                                                                                                                                                  