.TITLE MAIL$ - NOTIFY USER OF RECEIVED MAIL .IDENT /1.3X/ .ENABL LC ; ; THIS CODE HAS BEEN DEVELOPED BY THE COMPUTING ; GROUP OF THE ATMOSPHERIC SCIENCES DIVISION, ; ALBERTA RESEARCH. THIS WORK FUNDED BY THE ; ALBERTA WEATHER MODIFICATION BOARD. ; ; THERE IS EXPLICITLY NO COPYRIGHT ON THIS SOFTWARE, ; AND ITS DISTRIBUTION IS ENCOURAGED. NO RESPONSIBILITY ; NOR GUARANTEE IS MADE OR ASSUMED BY THE AUTHOR, OR ; BY ALBERTA RESEARCH. ; ; SUGGESTIONS OR CHANGES ARE INVITED, AND WILL BE ; DISTRIBUTED TO OTHER USERS OF THIS SOFTWARE THROUGH ; THE DECUS IAS/RSX SPECIAL INTEREST GROUP. ; ; ; VERSION: 781109 ; WRITTEN BY: W. KORENDYK ; DATE WRITTEN: 3-NOV-78 ; ; ; ; MODIFICATIONS: ; ; CODE NAME DATE ; JGD16 J. DOWNWARD 29-JUL-79 IF CAN'T FIND UIC AS A MATCH TRY USING ; THE ACCOUNT NUMBER AS THAT STAYS FIXED ; IN THE UCB EVEN IF A SET /UIC CHANGES UIC. ; ;JGD22 J. DOWNWARD 25-NOV-81 CONDITIONALIZE TO REFLECT V4.0 CHANGE IN MULT ; CLI SUPPORT. ; ;+ ; ; *** - MAITSK -- MAIL ANCILLIARY TASK WHICH NOTIFIES ; ANY LOGGED ON USERS IF THEY RECEIVED ANY MAIL. ; ; THROUGHOUT, R2 CONTAINS THE TT DCB POINTER ; ;- .MCALL UCBDF$ ;JGD21 UCBDF$ ;JGD21 ;JGD21 ;JGD21 .IFDF M$$CLI!A$$CLI ; If multiple or alternate CLI support ;JGD21 U.ACN=U.CLI-4 ; Offset from U.CLI word ;JGD21 .IFF ; ;JGD21 U.ACN=U.LUIC-4 ; Offset from L.UIC to find Acnt # ;JGD21 .ENDC ; END MULTIPLE CLI SUPPORT ;JGD21 .PSECT MAIL$ ;JGD21 ;JGD21 TLUN=1 TEVF=1 MEVF=2 ; CYCLE=10. ; THE NUMBER OF SECONDS TO ELAPSE BETWEEN AN ; UNSUCCESSFUL MESSAGE OUTPUT, AND THE NEXT TRY. ; IE. THE CYCLE TIME. ; SPEED=30. ; THE RECEIVING SPEED (IN CHARACTERS PER SECOND) ; OF THE SLOWEST TERMINAL TO WHICH A MESSAGE ; WOULD BE SENT. ; COUNT=6. ; THE NUMBER OF TIMES TO ATTEMPT TO ISSUE THE ; MESSAGE TO A BUSY TERMINAL. ; .MCALL ENTER,LEAVE .MCALL ALUN$S,QIO$S,WTLO$S,MRKT$S .MCALL RCVX$S,WTSE$S,ASTX$S,CMKT$S .MCALL SDAT$S ; OURNAM: .RAD50 /MAI.../ ;THIS SHOULD BE OUR TASK NAME ; MAIL$:: RCVX$S ,#BUF ;GET WHAT'S SENT TO US CLR R2 ;AT START, DCB UNKOWN MOV BUF+4,R5 ; GET THE UIC TST BUF+6 ; FIRST TIME THROUGH? BEQ 10$ ; IF EQ, THEN YES MRKT$S #MEVF,#RETRY,#2 ; FOR SO MANY SECONDS, WTSE$S #MEVF ; WAIT ; ; FIND OUT WHO ALL IS LOGGED ON... ; 10$: INC BUF+6 ;ADD TO THE OVERALL COUNT MOV #TERBLK,R3 ;TERMINAL DESCRIPTION BLOCK CLR 2(R3) ;START WITH TT0: 20$: CALL GTUCB ;GET THE TERMINAL'S UCB BCS 25$ ;IF CS, THEN NO MORE TERMS AVAIL. BIT #U2.LOG,U.CW2(R1) ;LOGGED IN? BNE 23$ ;IF NE, NO CMP U.LUIC(R1),BUF+4 ; DID HE GET THE MAIL(LOGON UIC MATCHES) ; JGD16 BEQ 22$ ; GOT IT ; JGD16 TST #ACCNUM ; SHOULD WE CHECK FURTHER(GLBDEF =1 IF YES) ; JGD16 BEQ 23$ ; IF NO MOST LIKELY RUN PRIV NOT BUILT IN ; JGD16 TST U.ACN(R1) ; IF ACCOUNT NUMBER=0 GIVE UP ; JGD16 BEQ 23$ ; NO, MOST LIKELY RUN PRIVLEGES NOT BUILT IN ; JGD16 ; USER MAY NOT HAVE IMPLEMENTED ACCOUNT NUMBER ; JGD16 CMP U.ACN(R1),BUF+10 ; DOES ACCOUNT NUMBER MATCH ; JGD16 BNE 23$ ; IF NE, NO ; JGD16 22$: ; REF LABLE ; JGD16 CALL MAIMSG ;TELL HIM ABOUT IT ;**-3 23$: INC 2(R3) ;TRY THE NEXT BR 20$ ; TERMINAL. 25$: BR MAIL$ ;AND TRY FOR MORE ; ; ; MAIMSG - ROUTINE TO OUTPUT THE MESSAGE THAT THE USER WAS ; GIVEN MAIL. ; ; MAIMSG: ALUN$S #TLUN,(R3),2(R3) QIO$S #IO.WVB,#TLUN,#TEVF,,,,<#MESS,#LMESS> MRKT$S #MEVF,#MTIME,#2,#AST ;WAIT FOR A WHILE WTLO$S 0,#3 CMKT$S ;CAN MRKT REQUEST RETURN ; .NLIST BEX MESS: .ASCII <12><12><7>/ >>>> A letter has just been put in / .ASCII /your mailbox <<<<15> LMESS =.-MESS .EVEN .LIST BEX ; ; MTIME=LMESS+10./SPEED+1 ; WAIT THIS LONG FOR THE QIO RETRY=CYCLE-MTIME ; AND THIS LONG BEFORE A RETRY .IIF LT RETRY .ERROR ; TERMINAL RECEIVE TIME IS GREATER THAN CYCLE TIME. ; ; BUF: .BLKW 15. ; ; AST - THE MARK TIME AST. ; ; EXECUTION OF THIS AST IMPLIES A QIO TIME OUT ; AST: QIO$S #IO.KILL,#TLUN ;KILL THE I/O BCS 1$ ; CMP BUF+6,#COUNT ;DONE THIS OFTEN BEFORE? BGT 1$ ;YES, TOO OFTEN SDAT$S #OURNAM,#BUF+4 ;SEND IT TO US AGAIN 1$: TST (SP)+ ; ASTX$S ; ; GTUCB -- ROUTINE TO OBTAIN THE ADDRESS OF THE ; DESIRED UCB. ; ; INPUTS: R2 = DCB ADDRESS ; R3 = ADDRESS OF 2-WORD TERMINAL DESCRIP. ; (R3) = ASCII MNEUMONIC ; 2(R3) = UNIT NUMBER ; ; USAGE REQUIRES THE TASK TO BE PRIVILEGED ; ; OUTPUTS: R1 = ADDRESS OF THE UCB ; R2 = ADDRESS OF THE DCB ; R3 = UNCHANGED ; TERBLK: .ASCII /TT/ .WORD 0 GTUCB: ENTER R0,R3,R4,R5 CMP 2(R3),#256. ;UNIT IN RANGE? BLO 10$ ;YES, PROCEED SEC ;NO IT AIN'T BR 100$ ;FERGET IT ; 10$: CALL $SWSTK,100$ ;SWITCH TO SYSTEM STATE MOV 6(SP),R2 ;GET THE USER'S R2 BNE 12$ ;A DCB IS THERE MOV $DEVHD,R2 ;GET ADDRESS OF DEVICE TABLE 12$: CMP (R3),D.NAM(R2) ;IS THIS THE DEVICE? BEQ 20$ ;YES IT IS 15$: MOV D.LNK(R2),R2 ;NO, POINT TO NEXT DCB BNE 12$ ;GOT ONE BEQ 50$ ;END OF DEVICES, ERROR 20$: MOV 2(R3),R5 ;GET THE UNIT NUMBER CMPB R5,D.UNIT(R2) ;IS UNIT ON THIS DCB? BLO 15$ ;NO CMPB R5,D.UNIT+1(R2) ;MAYBE? BHI 15$ ;NO MOVB D.UNIT(R2),R4 ;GET FIRST UNIT NUMBER MOV D.UCB(R2),R1 ;GET FIRST UCB ADDRESS SUB R4,R5 ;COMPUTE RELATIVE UNIT NUMBER BEQ 45$ ;FOUND IT! 30$: ADD D.UCBL(R2),R1 ;NO, POINT TO NEXT UCB DEC R5 ;FOUND IT YET? BNE 30$ ;NO, LOOP 45$: MOV R1,4(SP) ;SET USER R1 MOV R2,6(SP) ;SET USER R2 RETURN ;RETURN TO USER STATE 50$: MOV @$HEADR,R3 ;GET USER SP INCB 6(R3) ;SET CARRY IN USER PS RETURN ;RETURN TO USER STATE ; 100$: LEAVE RETURN .END MAIL$