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$