.TITLE RECUR .IDENT /01.00/ ; EDIT # 0042 13 Apr 1981 11:33:58 DB1:[21,7]RECUR.MAC;55 ; PREVIOUS EDIT 13 Apr 1981 11:32:26 DB1:[21,7]RECUR.MAC;54 ; BY RAY VAN TASSLE 2/10/81 ; ; THIS PROGRAM IS USED TO EXECUTE COMMANDS AT CERTAIN TIMES ; OF THE DAY. ; IT IS DRIVEN OFF A DATA FILE WITH TIMES AND MCR COMMANDS. ; NORMALLY YOU WOULD RUN RECUR WITH A RE-SCHEDULE INTERVAL OF ; 5 MINUTES OR SO. ; E.G., INS RECUR ; RUN RECUR/RSI=5M ; ; THE FORMAT OF RECORDS IN THE FILE ARE: ; D-HH:MM(SPACE)(CONTROL CHAR)MCR-COMMAND ; ; WHERE: ; D = DAY OF THE WEEK. 0=EVERYDAY ; 1 = SUNDAY ; 2 = MONDAY, ETC. ; ; HH & MM ARE TIME OF DAY (24 HOUR CLOCK) ; THE CONTROL CHARACTER IS: ; "+" - WAIT FOR THIS MCR COMMAND TO FINISH BEFORE CONTINUING ; "#" - SPAWN THE COMMAND AND CONTINUE IMMEDIATELY ; ; A ";" OR "!" IN COLUMN 1 IS A COMMENT ; A NULL LINE IS ALSO A COMMENT ; ; AS A CONVENIENCE, IF RECUR IS RUN WITH A TASK-NAME ; OF CHK???", IT WILL NOT ACTUALLY EXECUTE ANYTHING, IT ; WILL JUST CHECK THE COMMAND FILE FOR FORMAT ERRORS. ; ; ***************** WARNING ************************* ; IF RECUR IS RUN TIME-SCHEDULED, IT'S TI: IS SET TO BE CO0: ; SINCE IT SPAWNS COMMANDS TO MCR, THE TERMINAL MUST BE LOGGED ON ; OR MCR WILL REJECT IT. ; THIS REQUIRES 2 THINGS TO BE DONE: ; 1) MCRDIS MUST BE PATCHED AT THE SPOT WHERE IT IS CHASING DOWN ; THE REDIRECT CHAIN, SO THAT IF IT'S UCB IS THE SAME AS ; WHAT IS IN $COPT (CO0:), IT WILL NOT DO THIS. ; 2) YOU MUST PATCH THE TCB FOR CO0: TO FLAG IT AS LOGGED ON. ; THIS ONLY HAS TO BE DONE ONCE (IF YOU SAV OR ZAP IT), OR ; IN THE STARTUP FILE. ; IT COULD BE DONE IN THIS PROGRAM, BUT THEN IT WOULD HAVE TO BE ; PRIVILEGED. ; .CO0:+12 WAS 400, MAKE IT 0 .if eq 1 ; this may be done manually, or by putting the following ; SLP change file into SGNPER.CMD ; SGNPER.CMD;2=SGNPER.VMD;1/AU ; -/COST=./ ; -/COND=./ ; ;;;;;; RVT SET CO: AS LOGGED-ON, PRIV [1,1] ; .=.CO0+U.LUIC ; .BYTE 1,1 ; LOGIN UIC=[1,1] ; .=.CO0+U.CW2 ; .WORD U2.PRV ; LOGGED ON, PRIV ; .=.CO0+U.UIC ; .BYTE 1,1 ; CURRENT UIC=[1,1] ; .=COND ; / ; ; ; ; LUN 1 IS TI: ; LUN 2 IS THE MEMORY FILE, TO REMEMBER THE LAST TIME RECUR EXECUTED ; LUN 3 IS THE FILE OF COMMANDS: RECURRENT.CMD .MCALL FCSMC$,GTIM$S,SPWN$S,STSE$S,EXIT$S .MCALL QIOW$S,QIO$S,GET$S,PUT$S,GTSK$S FCSMC$ ; FCS MACROS CTBUF: .BLKW 8. ;CURRENT TIME AND DATE LTBUF: .BLKW 8. ; TIME & DATE OF LAST TIME RECUR EXECUTED ; (FROM THE MEMORY FILE) YY=0 MM=2 DD=4 HH=6 MM=8. SS=10. TT=12. TPS=14. ;;; TEMP FOR TESTING ;HH=MM ;MM=TT CHKFLG: .WORD 0 ; 0 = CHECK FOR ERRORS ONLY, DON'T EXECUTE DAYWK: .WORD 0 ; THE CURRENT DAY MCR: .RAD50 /MCR.../ LSTTIM: .WORD -1 ; HH/MM OF LAST TIME CURTIM: .WORD 0 ; HH/MM OF CURRENT CMDTIM: .WORD 0 ; HH/MM OF COMMAND RECORD CMDREC: .BLKB 132. ; THE COMMAND RECORD ; THE FILE TO REMEMBER THE LAST TIME RECUR EXECUTED. LSTFDB: FDBDF$ FDAT$A R.VAR,FD.CR,,-1,-1 FDOP$A 2,DEFNAM,LNAM,,FA.ENB!FA.DLK LNAM: NMBLK$ RECURLAST,MEM,1 ; THE FILE OF COMMANDS CMDFDB: FDBDF$ FDOP$A 3,DEFNAM,CNAM CNAM: NMBLK$ RECURRENT,CMD DEFNAM: .WORD 5,DSK .WORD 9.,UIC .WORD 0,0 DSK: .ASCII /LB01:/ UIC: .ASCII /[001,002]/ .EVEN FSRSZ$ 1 ; ONLY 1 FILE OPEN AT A TIME RECUR:: GTSK$S #CMDREC ; SEE IF WE SHOULD ONLY CHECK MOV CMDREC,CHKFLG SUB #<^RCHK>,CHKFLG ; 0 = YES GTIM$S #CTBUF MOVB CTBUF+HH,CURTIM+1 MOVB CTBUF+MM,CURTIM MOV CTBUF+DD,DAYWK ; READ THE MEMORY FILE TO FIND OUT THE LAST TIME WE EXECUTED. ; WE MUST EXECUTE ALL THE COMMANDS AFTER THAT TIME, UP TO AND ; INCLUDING THE CURRENT TIME. ; IF THE DAY CHANGED, FOOL IT (OTHERWISE THINGS COULD GET VERY ; STICKY AT MIDNIGHT). OPEN$R #LSTFDB BCS 10$ ; CAN'T OPEN IT GET$S ,#LTBUF,#16. BCS 10$ MOVB LTBUF+HH,LSTTIM+1 ; FORMAT HH/MM MOVB LTBUF+MM,LSTTIM ; IF THE DAY IS DIFFERENT, PRETEND IT IS VERY LATE IN THE SAME DAY CMP LTBUF+DD,CTBUF+DD BEQ 10$ MOV #32000,CURTIM MOV LTBUF+DD,DAYWK 10$: CLOSE$ 11$: OPEN$R #CMDFDB BCS 200$ ; READ THE COMMAND FILE TO FIND COMMANDS TO EXECUTE. ; IGNORE THOSE WITH A TIME LESS THAN THE LAST TIME. ; ALSO IGNORE THOSE THAT SPECIFY A DAY OF THE WEEK OTHER THAN TODAY. ; QUIT WHEN WE FIND ONE WITH A TIME GREATER THAN THE CURRENT TIME. 20$: MOVB #';,CMDREC ; NULL LINES ARE COMMENTS GET$S #CMDFDB,#CMDREC,#132. BCS 200$ CALL CVTCMD ; CONVERT TIME IN RECORD & VALIDATE IT TST CHKFLG ; SEE IF WE ARE CHECKING FOR ERRORS BEQ 20$ ; YES, SKIP AHEAD CMP CMDTIM,LSTTIM BLE 20$ ; WE ALREADY DID IT CMP CMDTIM,CURTIM BGT 210$ ; ALL DONE ;QIOW$S #IO.WVB,#1,#1,,,,<#CMDREC,CMDFDB+F.NRBD,#060> SPWN$S #MCR,,,,,#1,,,#CMDREC+9.,R4 TST R5 BEQ 25$ ; DON'T WAIT STSE$S #1 ; GET THE TIME & DATE AGAIN IN CASE IT CHANGED 25$: GTIM$S #CTBUF MOVB CTBUF+HH,CURTIM+1 MOVB CTBUF+MM,CURTIM CMP CTBUF+DD,DAYWK BEQ 30$ MOV #32000,CURTIM ; PRETEND IT IS VERY LATE IN THE SAME DAY MOV CTBUF+DD,DAYWK ; TO FORCE ALL THE COMMANDS TO EXECUTE. 30$: JMP 20$ 200$: CMPB F.ERR(R0),#IE.EOF BEQ 210$ QIOW$S #IO.WVB,#1,#1,,,,<#ERRM1,#ERRM1L,#040> 210$: CLOSE$ #CMDFDB TST CHKFLG ; SEE IF WE ARE CHECKING FOR ERRORS BEQ 220$ ; YES, QUIT NOW OPEN$W #LSTFDB ; REMEMBER THIS AS THE LAST TIME WE EXECUTED BCS 230$ PUT$S ,#CTBUF,#16. BCS 230$ CLOSE$ ; IF WE HAD TO DO THE GIMPY THING BECAUSE THE DAY CHANGED, DO IT ALL AGAIN CMP #32000,CURTIM BNE 220$ CLR LSTTIM ; DO ALL OF TODAY UP TO NOW JMP 11$ 220$: EXIT$S IOT 230$: MOVB F.ERR(R0),R1 ; UN-EXPECTED ERROR IOT .PAGE ; INPUT: CMDREC HAS A RECORD FROM THE COMMAND FILE ; OUTPUT: ; CMDTIM HAS THE TIME AT WHICH THE COMMAND IS TO BE EXECUTED. ; IF ANY ERRORS, THIS IS -1000 (NEVER EXECUTE IT). ; CMDREC+9 HAS THE MCR COMMAND TO EXECUTE ; R5 = 0 IF DON'T WAIT FOR THE COMMAND TO FINISH ; R5 = NON-ZERO IF WE SHOULD WAIT FOR IT. ; R4 = LENGTH OF THE COMMAND LINE TO SPAWN ; ; CVTCMD: CMPB #';,CMDREC ; IGNORE COMMENTS BEQ 600$ CMPB #'!,CMDREC BEQ 600$ MOV CMDFDB+F.NRBD,R4 ; FIND COMMAND LENGTH SUB #9.,R4 BLE 500$ ; TOO SHORT CMPB #':,CMDREC+4 ; CHECK FOR REQUIRED CHARACTERS BNE 500$ CMPB #'-,CMDREC+1 BNE 500$ CMPB #' ,CMDREC+7 BNE 500$ ; CHECK THE DATE MOVB CMDREC,R1 ; CHECK RANGE 0-7 SUB #'0,R1 BEQ 10$ ; 0 = EVERY DAY BLT 500$ CMP R1,#7 BGT 500$ MOV #CTBUF,R5 CALL DAY ; FINGURE THE DAY OF THE WEEK CMP R0,R1 ; IS THIS THE RIGHT DAY?? BNE 600$ ; NO--SKIP IT ; SEE IF WE SHOULD WAIT AFTER SPAWNING THE COMMAND. 10$: MOVB CMDREC+8.,R5 SUB #'#,R5 BEQ 20$ ; #--DON'T WAIT CMP R5,#<'+-'#> ; IS IT +--IF SO, WAIT BNE 500$ ; IF NOT - ERROR ;CONVERT HH/MM AND PUT IT IN CMDTIM 20$: MOV #CMDREC+2,R0 ; HH CALL $CDTB MOVB R1,CMDTIM+1 CMPB R2,#': BNE 500$ CALL $CDTB ; MM MOVB R1,CMDTIM CMPB R2,#040 BNE 500$ RETURN 500$: QIOW$S #IO.WVB,#1,#1,,,,<#ERRM2,#ERRM2L,#040> ; ERROR QIOW$S #IO.WVB,#1,#1,,,,<#CMDREC,CMDFDB+F.NRBD,#040> 600$: MOV #-1000,CMDTIM ; DON'T EXECUTE THIS RETURN .ENABL LC ERRM1: .ASCII /RECUR - Error opening or reading RECURRENT.CMD file/ ERRM1L=.-ERRM1 ERRM2: .ASCII /RECUR - Command line format error:/ ERRM2L=.-ERRM2 .END RECUR