10 !MAINUP program to communicate with a detached process & ! thru a mailbox. I/O goes to tty. & ! LINK WITH: MADRAST,MADWAST,MASETDR,MASETDW,JPI & ! AND BILLING LIBRARY, MAINUP.COM does above & 20 ! Ruth E. Reebel & ! Copyright (c) 1982 by & ! Amherst Associates Incorporated & ! 210 Old Farm Road & ! Amherst, Massachusetts 01002 & 1000 EXTERNAL LONG FUNCTION SYS$CREMBX,SYS$HIBER,SYS$FORCEX & \ EXTERNAL LONG FUNCTION SYS$GETJPI,SYS$DELPRC,SYS$ASSIGN & \ EXTERNAL LONG FUNCTION SYS$TRNLOG & \ EXTERNAL LONG CONSTANT JPI$_PRCNAM & \ DECLARE LONG SYS_STATUS,ILIST(3%) & 1010 COMMON (A1) MBX.CH%,LOG.CH%,TTY.CH%,CTL.FLG%,BAS.FOR% & \ COMMON (A1) STRING PRCNAMJPI=15%,INFIL=2% & \ MAP (RPH) READSET% & \ READSET% = 0% ! set to -1 in MASETDR & \ BAS.FOR%=0% & 1015 ON ERROR GOTO 19000 & 1040 ILIST(0)=(JPI$_PRCNAM*65536)+15% & \ A=LOC(PRCNAMJPI) !stupid line due to BASIC weirdness & \ ILIST(1)=A & \ ILIST(2)=0 & \ ILIST(3)=0 & \ SYS_STATUS=SYS$GETJPI(,,,ILIST() BY REF,,,) & \ IF (SYS_STATUS AND 1%)=0 THEN PRINT "ERROR..MAINUP..GETJPI" & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) & ! get process name (as set in STARTUP) to identify right MBX & 1050 MBX$=EDIT$(PRCNAMJPI,6%) & \ DPRCNAM$="D"+RIGHT$(MBX$,2%) & ! if main process is called: 0RUTHR0 & ! detached process : DRUTHR0 & ! MBX : 0RUTHR0 & 1060 SYS_STATUS=SYS$CREMBX(,MBX.CH%,,,,,MBX$ BY DESC) & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) IF (SYS_STATUS AND 1%)=0% & ! get mailbox channel assigned to 0RUTHR0 & 1065 TTY.CH%=FNGETCH("SYS$INPUT") & \ INFIL=" " !blank - if in "submit" file & \ INFIL="TT" IF INSTR(1%,DEV_NAM$,"TT")<>0% !tt - if tty output & ! assign channel to terminal & 1070 MARGIN 132% & \ Y%=CTRLC & ! enable control c trap & 1080 CALL MASETDW & ! initial asynchronous trap for write from detproc to MB & 1090 CALL MASETDR & ! initial asynchronous trap for read from detproc to MB & 1100 SYS_STATUS=SYS$HIBER() & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) IF (SYS_STATUS AND 1%)=0% & ! this process only handles ASTs & ! (when detached process sends read or write request to mailbox) & ! It is awakened when client selects BYE or ATTach options. & 1110 SYS_STATUS=SYS$DELPRC(,DPRCNAM$ BY DESC) & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) IF (SYS_STATUS AND 1%)=0% & \ CALL LOGNAME(MBX$,MBX$,0%,1%,SYS_STATUS) & \ CHAIN "HSL1:STARTUP" IF CTL.FLG%=-2% & ! CTL.FLG% is set in MADWAST if BYE or ATT option selected & ! ATT: CTL.FLG%=-2% & ! BYE: CTL.FLG%=-1% & 1120 GOTO 32767 & 19000 ! CATCH ERRORS & 19010 IF ERR=28 THEN SYS_STATUS=SYS$FORCEX(,DPRCNAM$,) & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) IF (SYS_STATUS AND 1%)=0% & \ Y%=CTRLC !reenable ctrl c trap & ! probably above line is unnecessary... & ! resume to await image exit in det proc & \ IF READSET% THEN & RESUME 1100 & ELSE & RESUME 1090 & 19100 PRINT ERN$,ERR,ERL,ERT$(ERR) & \ RESUME 32767 & 20020 DEF FNGETCH(DEV_LOG$) & ! function to get channel number for a device.. & ! call looks like: TTY.CH%=FNGETCH("SYS$OUTPUT") & 20040 DECLARE LONG RSN_LEN & \ MAP(TRNLOG) RSN_BUF$=80% & \ MAP(TRNLOG) FILL$=4%,RSN_NAM$=76% & \ SYS_STATUS=SYS$TRNLOG(DEV_LOG$ BY DESC,RSN_LEN,RSN_BUF$,,,,) & \ IF (SYS_STATUS AND 1%)=0% THEN PRINT "ERROR TRNLOG" & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) & 20041 IF ASCII(RSN_BUF$)=27% THEN DEV_NAM$=SEG$(RSN_NAM$,1%,RSN_LEN-4%) & ELSE DEV_NAM$=SEG$(RSN_BUF$,1,RSN_LEN) & 20042 SYS_STATUS=SYS$ASSIGN(DEV_NAM$,DEV_CH%,,) & \ IF (SYS_STATUS AND 1%)=0 THEN PRINT "ERROR ASSIGN" & \ CALL SYS$EXIT(SYS_STATUS BY VALUE) & 20045 FNGETCH=DEV_CH% & 20050 FNEND & 32767 END