C File POSTMAN.FLX C C This is the real-time task that checks for (1) newly C logged-in users and (2) users with new mail and C notifies them of mail. C C COMMON SGA FOR MAIL, POSTMAN C COMMON /MAICOM/ ENTRY BYTE ENTRY (14,20) BYTE FILNAM(20) INTEGER USRBUF(160) INTEGER LUBUF LOGICAL*1 EQUAL LOGICAL*1 FOUND INTEGER IDS,IRET BYTE BELL EQUIVALENCE (IDS,IRET) DATA NENTRY /20/ DATA BELL /7/ DATA LUBUF /160/ C C CODE C SET-UP CHECK-FOR-NEW-LOGINS CHECK-FOR-NEW-MAIL CHECK-FOR-NEW-LOGOUTS CALL EXIT C TO SET-UP C Get list of logged-in users. CALL GETUSR(USRBUF,LUBUF,IER) C DEBUGGING CODE D CALL DEBUG (1,'POSTMAN.') D DO 9991 IUSR=1,LUBUF,8 D9991 IF (USRBUF(IUSR).NE.0) WRITE (3,9903) (USRBUF(I),I=IUSR,IUSR+7) D9903 FORMAT (1X,6A2,5X,A2,5X,O8) C END OF DEBUGGING CODE IF (IER.LT.0) TAKE-ERROR-EXIT C Suppress non-existent file message CALL ERRSET(29,,.FALSE.,,.FALSE.) C Suppress "error during write" message CALL ERRSET(38,,.FALSE.,,.FALSE.) FIN C TO TAKE-ERROR-EXIT WRITE (2,101) IDS 101 FORMAT (' Postman exiting with code ',I8, 1 '. Inform system manager.') CALL EXIT FIN C TO CHECK-FOR-NEW-MAIL D CALL DEBUG (1,' POSTMN: CHECK NEW MAIL') DO (IENTRY=1,NENTRY) IF (ENTRY(14,IENTRY).NE.0 .AND. ENTRY(1,IENTRY).NE.0) IUNIT = ENTRY(13,IENTRY) D CALL DEBUG (3,' HAS MAIL: ',ENTRY(1,IENTRY),IUNIT) CALL ASNLUN (2,'TT',IUNIT) WRITE (2,21,ERR=201) BELL, BELL 21 FORMAT (' ',A1,' You have mail.',A1/) ENTRY(14,IENTRY) = 0 201 CONTINUE FIN FIN FIN C TO CHECK-FOR-NEW-LOGINS D CALL DEBUG (1,' POSTMN: CHECK NEW LOGINS',' ') C SYSTEM BUG (?): UTN MAY HAVE BLANK NODES DO (IUSR = 1,LUBUF,8) IF (USRBUF(IUSR+6).EQ.'TT') SEARCH-FOR-ENTRY D IF (FOUND) CALL DEBUG (3,' ALREADY LOGGED ',ENTRY(1,IENTRY),IUNIT) UNLESS (FOUND) C Find an empty slot in MAICOM IENTRY = 0 WHILE (IENTRY.LT.NENTRY .AND. .NOT.FOUND) IENTRY = IENTRY+1 FOUND = ENTRY(1,IENTRY) .EQ. 0 FIN IF (FOUND) CALL MVSTR (ENTRY(1,IENTRY),USRBUF(IUSR)) ENTRY (13,IENTRY) = USRBUF(IUSR+7) D CALL DEBUG (3,' NEW LOGIN: ',ENTRY(1,IENTRY),USRBUF(IUSR+7)) ENTRY(14,IENTRY) = 0 CHECK-FOR-MAIL-FILE FIN FIN FIN FIN FIN C TO CHECK-FOR-MAIL-FILE CALL MVSTR (FILNAM,'[10,0]') CALL CONCAT (FILNAM,USRBUF(IUSR)) CALL CONCAT (FILNAM,'.MAI') D CALL DEBUG (2,' TRY FILE ',FILNAM) OPEN (NAME=FILNAM,UNIT=1,TYPE='OLD',FORM='FORMATTED',ERR=33) WHEN (.FALSE.) 33 CONTINUE D CALL DEBUG (1,' NO FILE',' ') FIN ELSE ENTRY(14,IENTRY) = 1 D CALL DEBUG (1,' FILE FOUND',' ') CLOSE (UNIT=1) FIN FIN C TO SEARCH-FOR-ENTRY FOUND = .FALSE. IENTRY = 0 WHILE (IENTRY.LT.NENTRY .AND. .NOT.FOUND) IENTRY = IENTRY+1 IUNIT = ENTRY(13,IENTRY) FOUND = EQUAL(ENTRY(1,IENTRY),USRBUF(IUSR)) .AND. 1 IUNIT .EQ. USRBUF(IUSR+7) FIN FIN C TO CHECK-FOR-NEW-LOGOUTS D CALL DEBUG (1,' POSTMN: CHECK FOR NEW LOGOUTS') DO (IENTRY = 1,NENTRY) IF (ENTRY(1,IENTRY).NE.0) FOUND = .FALSE. IUSR = -7 IUNIT = ENTRY(13,IENTRY) WHILE (IUSR.LT.LUBUF .AND. .NOT.FOUND) IUSR = IUSR + 8 FOUND = EQUAL(ENTRY(1,IENTRY),USRBUF(IUSR)) .AND. 1 IUNIT.EQ.USRBUF(IUSR+7) FIN D IF (FOUND) CALL DEBUG (3,' STILL LOGGED IN:', D 1 ENTRY(1,IENTRY),IUNIT) UNLESS (FOUND) D CALL DEBUG (3,' JUST LOGGED OUT:',ENTRY(1,IENTRY),IUNIT) DO (I=1,14) ENTRY(I,IENTRY) = 0 FIN FIN FIN FIN C END C SUBROUTINE DEBUG(N,LABEL,STRING,IUNIT) D BYTE LABEL(1),STRING(1) D GOTO (1,2,3),N D1 WRITE (3,9901) (LABEL(I),I=1,LENGTH(LABEL)-1) D RETURN D2 WRITE (3,9901) (LABEL(I),I=1,LENGTH(LABEL)-1),': ', D 1 (STRING(I),I=1,LENGTH(STRING)-1) D RETURN D3 WRITE (3,9901) (LABEL(I),I=1,LENGTH(LABEL)-1),': ', D 1 (STRING(I),I=1,LENGTH(STRING)-1) D WRITE (3,9902) IUNIT D RETURN D9901 FORMAT (1X,80A1) D9902 FORMAT ('+',T40,O5) END C SUBROUTINE CONCAT(A,B) BYTE A(1),B(1) CALL MVSTR(A(LENGTH(A)),B) END