.TITLE ISULOGOUT .IDENT \ISUQUOTA 2.9\ .PAGE .SBTTL SYMBOLS & MACROS ; SYMBOLS ; SYSTEM $ACCDEF $IODEF $JPIDEF $OPCDEF $PCBDEF $PRVDEF $RMSDEF $SSDEF $UAFDEF ; USER ACCOFFDEF AFACTR ACCOFFDEF COST ISUACCDEF LOPRMDEF PRCSDEF QUAXDEF QUOMSGDEF REPLYDEF .PAGE .SBTTL DATA TABLES .PSECT TABLES,RD,NOWRT,NOEXE,LONG LST_NAMES: .WORD 4 .WORD JPI$_UIC .LONG MONMSG_IMDONE+PRCS_UIC .LONG 0 .WORD 4 .WORD JPI$_OWNER .LONG JPI_OWNER .LONG 0 .WORD 4 .WORD JPI$_STS .LONG JPI_STS .LONG 0 .WORD 7 .WORD JPI$_TERMINAL .LONG MONMSG_IMDONE+PRCS_TTNAME+1 .LONG LEN_TTNAME .WORD 12 .WORD JPI$_USERNAME .LONG USERNAME .LONG 0 .WORD 4 .WORD JPI$_UIC .LONG UIC .LONG 0 .WORD 8 .WORD JPI$_ACCOUNT .LONG ACCOUNT .LONG 0 .LONG JPI$C_LISTEND LST_ACCTG: .WORD 8 .WORD JPI$_LOGINTIM .LONG LOGIN_TIME .LONG 0 .WORD 4 .WORD JPI$_CPUTIM .LONG TAB_AFACTR+AFACTR_CPU .LONG 0 .WORD 4 .WORD JPI$_DIRIO .LONG TAB_AFACTR+AFACTR_DIOCNT .LONG 0 .LONG JPI$C_LISTEND TAB_CHKQUOUSE: .LONG QMSK_M_DOLLARS .LONG QXR_Q_DOLLARS .LONG QXR_U_DOLLARS .LONG ISUQUO_LOWDOLR .LONG ISUQUO_OVRDOLR .LONG QMSK_M_CPU .LONG QXR_Q_CPU_C .LONG QXR_U_CPU_C .LONG ISUQUO_LOWCPU .LONG ISUQUO_OVRCPU .LONG QMSK_M_CONN .LONG QXR_Q_CONN_C .LONG QXR_U_CONN_C .LONG ISUQUO_LOWCONN .LONG ISUQUO_OVRCONN .LONG QMSK_M_PRINT .LONG QXR_Q_PAGE_C .LONG QXR_U_PAGE_C .LONG ISUQUO_LOWPAGE .LONG ISUQUO_OVRPAGE .LONG QMSK_M_DISK .LONG QXR_Q_DISK_C .LONG QXR_U_DISK_C .LONG 0 .LONG ISUQUO_OVRDISK .LONG 0 ; END TAB_CHKQUOUSE TAB_DSKNAM: .ASCIC \DRB0\ .ASCIC \DRB1\ .BYTE 0 TAB_LOPRM_MSK: .LONG LOPRM_M_FULL .LONG LOPRM_M_ACC .LONG LOPRM_M_DISK N_LOPRM= .-TAB_LOPRM_MSK/4 L_LOPRM_NAM= 1 ATAB_LOPRM_NAM: .LONG 10$ .LONG 20$ .LONG 30$ .LONG 0 10$: .ASCII \FULL\ 20$: .ASCII \ACCO\ 30$: .ASCII \DISK\ TAB_UPCASE: UPCASEDEF .PAGE .SBTTL LOCAL READ-ONLY DATA .PSECT LCLRODATA,RD,NOWRT,NOEXE,LONG GBL_DISABLE_PRC: GBL_DISABLE_IAC: .LONG 0 GBL_DISABLE_SUB: GBL_DISABLE_NET: GBL_DISABLE_BAT: .LONG QMSK_M_BYPASLO!- QMSK_M_CONN!- QMSK_M_CONSESS!- QMSK_M_DISK!- QMSK_M_PRINT!- QMSK_M_PURGE GBL_REPRIEVE: .LONG QMSK_M_DOLLARS ; ENFORCE EVERYTHING DSC_ISUMONMBX: .ASCID \ISUMONMBX\ PURSPEC: .ASCIC \...]*.*\ STRG_NO: .ASCII \NO\ .PAGE .SBTTL LOCAL READ-WRITE DATA .PSECT LCLRWDATA,RD,WRT,NOEXE,LONG PRM_LOGOUT: .LONG LOPRM_M_ACC STS_WARN: .BLKL 1 STS_FAIL: .BLKL 1 QMASK: .BLKL 1 QUAX: .BLKB QXR_K_LENGTH UAF: .BLKB UAF$K_LENGTH DYN_DEFDEV: .BLKQ 1 DYN_DEFDIR: .BLKQ 1 DYN_PURSPEC: .LONG 0 .LONG 10$ 10$: .BLKB 32 DSC_WRTLOG_ACC: .LONG END_WRTLOG_ACC-BUFR_WRTLOG_ACC .LONG BUFR_WRTLOG_ACC BUFR_WRTLOG_ACC: ;;;;;;;;; .WORD ACC$K_INSMESG ; .BYTE END_WRTLOG_ACC-. ; .WORD ISUACC_K_ACCTG ; .WORD ISUACC_K_ISULGO ; USERNAME: ; .BLKB 12 ; LOGIN_TIME: ; .BLKQ 1 ; UIC: .BLKL 1 ; ACCOUNT: ; .BLKB 8 ; TAB_AFACTR: ; .BLKL N_AFACTR ; TAB_COST: ; .BLKL N_COST ; .BYTE 0 ; QUEUE NAME (NOT USED) .BLKB 15 ; END_WRTLOG_ACC: ;;;;;;;;; MONMSG_IMDONE: .BLKB PRCS_K_LENGTH CUR_TIME: .BLKQ 1 CUR_DSKUSE: .BLKL 1 PID: .BLKL 1 JPI_STS: .BLKL 1 JPI_OWNER: .BLKL 1 LEN_TTNAME: .BLKW 1 CHAN_DISK: .BLKW 1 CHAN_ISUMONMBX: .BLKW 1 IOSB_ISUMONMBX: .BLKQ 1 PURKEEP: .BLKL 1 STRG_MSGTXT: .BLKB REPLY_K_LENTXT DYN_OPRMSG: .LONG 0 .LONG 10$ 10$: .LONG OPC$_RQ_RQST!^X100*OPC$M_NM_CENTRL .LONG 0 .BLKB 120 .PAGE .SBTTL SAVDATA .PSECT SAVDATA,RD,WRT,NOEXE,LONG WORK: .BLKL 8 DYN_PARAM: .LONG 0 .LONG PARAM DSC_PARAM: .LONG 80 .LONG PARAM PARAM: .BLKB 80 DYN_OUT_LINE: .LONG 0 .LONG OUT_LINE DSC_OUT_LINE: .LONG 255 .LONG OUT_LINE OUT_LINE: .BLKB 255 STRG_FULL: .ASCII \/FU\ STRG_FULL_L= .-STRG_FULL ATAB_FACTNAM: .LONG 0 .LONG NAM_CPU .LONG NAM_DIO .LONG 0 .LONG 0 .LONG 0 .LONG NAM_CONN .LONG 0 .LONG 0 .LONG 0 .LONG 0 .LONG 0 .LONG 0 .LONG 0 .LONG 0 NAM_CPU: .ASCID \CPU\ NAM_DIO: .ASCID \DIO\ NAM_CONN: .ASCID \CONN\ FAO_COST_HDG: .ASCID \!^!2(_)VAX Accounting Statistics!/!/\ FAO_COST_CPU: .ASCID \!/!_CPU!_!%T!_$!5SL.!2ZL\ FAO_COST_DIO: .ASCID \!/!_DIO!_!11SL!_$!5SL.!2ZL\ FAO_COST_CONN: .ASCID \!/!_Connect!_!%T!_$!5SL.!2ZL\ FAO_COST_TOTAL: .ASCID \!/!/!_Session Cost!_!_$!5SL.!2ZL!/!_To-Date Cost!_!_\- \$!5SL.!2ZL!/!_Allocated!_!_$!5SL.!2ZL\ .PAGE .SBTTL RMS CONTROL BLOCKS .PSECT RMSCTLBLK,RD,WRT,NOEXE,LONG FAB_QUAX: $FAB FNM=,- FAC=,- RFM=FIX,- MRS=QXR_K_LENGTH,- BKS=1,- SHR=,- ORG=IDX,- XAB=KEY0_QUAX RAB_QUAX: $RAB FAB=FAB_QUAX,- RBF=QUAX,- RSZ=QXR_K_LENGTH,- UBF=QUAX,- USZ=QXR_K_LENGTH,- RAC=KEY,- KBF=MONMSG_IMDONE+PRCS_USERNAME,- KSZ=QXR_K_LENUSRNAM,- KRF=0,- ROP=WAT,- TMO=10 KEY0_QUAX: $XABKEY REF=0,- POS=QXR_USERNAME,- SIZ=QXR_K_LENUSRNAM FAB_SYSUAF: $FAB FNM=,- FAC=GET,- SHR=,- ORG=IDX,- XAB=KEY1_SYSUAF RAB_SYSUAF: $RAB FAB=FAB_SYSUAF,- UBF=UAF,- USZ=UAF$K_LENGTH,- RAC=KEY,- KBF=MONMSG_IMDONE+PRCS_UIC,- KSZ=4,- KRF=1,- ROP= KEY1_SYSUAF: $XABKEY REF=1,- POS=UAF$L_UIC,- SIZ=4 FAB_SYSOUT: $FAB FNM=,- FAC=PUT,- MRS=255 RAB_SYSOUT: $RAB FAB=FAB_SYSOUT,- RBF=OUT_LINE .PAGE .SBTTL CODE .PSECT CODE,RD,NOWRT,EXE,LONG .ENTRY ISULOGOUT,^M JSB PROC_INIT ; INITIALIZATION BITL #QMSK_M_NOTSYS,QMASK ; SYSTEM USER? BNEQ 10$ ; NO BRW RET_ISULOGOUT 10$: JSB PROC_PURGE ; PURGE FILES AS REQUIRED PUSHAB TAB_DSKNAM ; GET DISK USAGE PUSHAL CUR_DSKUSE PUSHAL QXR_UIC(R11) CALLS #3,GETDSKUSE JSB PROC_ERREXIT JSB PROC_ACCTG ; CALCULATE COSTS JSB PROC_WRTLOG ; RECORD DATA IN ACCTG LOG JSB PROC_CHECK ; CHECK CURRENT STATUS JSB PROC_SHOMSG ; DISPLAY MESSAGES AND COSTS MOVQ CUR_TIME,PRCS_LOGOUT_T(R10) ; LOGOUT TIME $QIOW_S CHAN=CHAN_ISUMONMBX,- ; NOTIFY MONITOR LOGOUT COMPLETED IOSB=IOSB_ISUMONMBX,- FUNC=#IO$_WRITEVBLK!IO$M_NOW,- P1=MONMSG_IMDONE,- P2=#PRCS_K_LENGTH RET_ISULOGOUT: SUBL #4*4,SP ; WORK AREA MOVL SP,R6 MOVL #3,QMSG_LENGTH(R6) MOVL #ISUQUO_LOGOUTOK,QMSG_MSGID(R6) MOVL #1,QMSG_FAO_CNT(R6) CLRL QMSG_FAO_ARG(R6) $PUTMSG_S MSGVEC=(R6) ADDL #4*4,SP ; RLSE WORK AREA $CLOSE FAB=FAB_QUAX ; CLOSE FILES $CLOSE FAB=FAB_SYSUAF $DELPRC_S ; A-R-R-R-R-R-R-R-GH! $EXIT_S R0 ; IN CASE SEWERCIDE FAILS .PAGE .SBTTL PROC_INIT ; PROC_INIT: MOVAB QUAX,R11 ; ADR QUAX RECORD MOVAL MONMSG_IMDONE,R10 ; ADR MSG BUFFER TO MONITOR MOVAL TAB_AFACTR,R9 ; ADR ACCTG FACTORS MOVAB UAF,R8 ; ADR SYSUAF RECORD $ASSIGN_S CHAN=CHAN_ISUMONMBX,- ; OPEN ISUMONMBX DEVNAM=DSC_ISUMONMBX JSB PROC_ERREXIT JSB PROC_GETPRM ; SET LOGOUT PARAMS $GETJPI_S ITMLST=LST_NAMES ; GET NAME INFO JSB PROC_ERREXIT JSB PROC_GETUAF ; GET UAF INFO MOVL #PRCS_M_LOGOUT,PRCS_STATE(R10) ; MARK MSG TYPE= LOGOUT $OPEN FAB=FAB_QUAX ; OPEN QUAX JSB PROC_ERREXIT $CONNECT RAB=RAB_QUAX JSB PROC_ERREXIT $GET RAB=RAB_QUAX ; READ QUAX RECORD JSB PROC_ERREXIT $RELEASE RAB=RAB_QUAX ; IN CASE LOGOUT TAKES AWHILE TSTW LEN_TTNAME ; IAC PRCS? BEQL 10$ ; NO MOVL #PRCS_M_IAC,PRCS_TYPE(R10) BICL3 GBL_DISABLE_IAC,QXR_QMASK(R11),QMASK ; SET QMASK IAC BRW RSB_INIT 10$: BITL #1@PCB$V_BATCH,JPI_STS ; BAT PRCS? BEQL 13$ ; NO MOVL #PRCS_M_BAT,PRCS_TYPE(R10) BICL3 GBL_DISABLE_BAT,QXR_QMASK(R11),QMASK ; SET QMASK BATCH BRB RSB_INIT 13$: BITL #1@PCB$V_NETWRK,JPI_STS ; NETWORK PROCESS? BEQL 15$ ; NO MOVL #PRCS_M_NET,PRCS_TYPE(R10) BICL3 GBL_DISABLE_NET,QXR_QMASK(R11),QMASK ; SET QMASK NETWORK BRB RSB_INIT 15$: CMPL PID,JPI_OWNER ; SUB PRCS? BEQL 17$ ; NO MOVL #PRCS_M_SUB,PRCS_TYPE(R10) BICL3 GBL_DISABLE_SUB,QXR_QMASK(R11),QMASK ; SET QMASK NON-IAC BRB RSB_INIT 17$: MOVL #PRCS_M_PRC,PRCS_TYPE(R10) ; DETACHED PROCESS BICL3 GBL_DISABLE_PRC,QXR_QMASK(R11),QMASK ; SET QMASK FOR IAC RSB_INIT: RSB .PAGE .SBTTL PROC_GETPRM MSK_GETPRM= ^M PROC_GETPRM: PUSHR #MSK_GETPRM ; SAVE WORK REGS CLRL -(SP) ; GET PARAMETER STRING PUSHAW DYN_PARAM CLRL -(SP) PUSHAQ DSC_PARAM CALLS #4,G^LIB$GET_FOREIGN TSTL DYN_PARAM ; ANY PARAMS SUPPLIED? BNEQ 10$ ; YES JMP RSB_GETPRM 10$: MOVTC DYN_PARAM,@DYN_PARAM+4,#^A\ \,- ; UPCASE PARAM STRG TAB_UPCASE,DYN_PARAM,@DYN_PARAM+4 MOVL DYN_PARAM+4,R6 ; ADR STRG REMAINDER MOVZWL DYN_PARAM,R7 ; LEN STRG REMAINDER LOOP_GETPRM: MOVL #1,R8 ; FLG= TRUE LOCC #^A"/",R7,(R6) ; LOCATE "/" BEQL RSB_GETPRM ; DONE -- NONE FOUND ADDL3 #1,R1,R6 ; ADR PARAM SUBL3 #1,R0,R7 ; LEN STRG REMAINING MATCHC #2,STRG_NO,#2,(R6) ; NEGATED PARAM? BNEQ 10$ ; NO CLRL R8 ; FLG= FALSE MOVAB 2(R6),R6 ; MOVE PAST "NO" SUBL #2,R7 10$: MOVAL ATAB_LOPRM_NAM,R9 ; ADR PARAM NAMES CLRL R10 ; LOOP INDEX LOOP_GETPRM_LOC: MATCHC #L_LOPRM_NAM,@(R9),#L_LOPRM_NAM,(R6) ; FIND PARAMETER BNEQ CONT_GETPRM_LOC BLBS R8,10$ ; BR IF SET PARAM BICL TAB_LOPRM_MSK[R10],PRM_LOGOUT ; CLEAR PARAM BRW CONT_GETPRM 10$: BISL TAB_LOPRM_MSK[R10],PRM_LOGOUT ; SET PARAM BRW CONT_GETPRM CONT_GETPRM_LOC: ADDL #4,R9 ; NEXT PRM NAME ADR AOBLSS #N_LOPRM,R10,LOOP_GETPRM_LOC CONT_GETPRM: BRW LOOP_GETPRM RSB_GETPRM: POPR #MSK_GETPRM ; RESTORE WORK REGS RSB .PAGE .SBTTL PROC_GETUAF ; PROC_GETUAF: $OPEN FAB=FAB_SYSUAF ; OPEN SYSUAF JSB PROC_ERREXIT $CONNECT RAB=RAB_SYSUAF $GET RAB=RAB_SYSUAF ; READ USER RECORD JSB PROC_ERREXIT MOVC3 #UAF$S_USERNAME,UAF$T_USERNAME(R8),- ; SET USERNAME PRCS_USERNAME(R10) MOVZBL UAF$T_DEFDEV(R8),DYN_DEFDEV ; SET DEFAULT DESCRIPT MOVAB UAF$T_DEFDEV+1(R8),DYN_DEFDEV+4 MOVZBL UAF$T_DEFDIR(R8),DYN_DEFDIR MOVAB UAF$T_DEFDIR+1(R8),DYN_DEFDIR+4 RSB_SETUSERNAME: RSB .PAGE .SBTTL PROC_PURGE ; PROC_PURGE: BITL #QMSK_M_PURGE,QMASK ; PURGE ENFORCED? BNEQ 10$ ; YES JMP RSB_PURGE 10$: MOVL DYN_PURSPEC+4,R6 ; GENERATE PURSPEC MOVC3 DYN_DEFDEV,@DYN_DEFDEV+4,(R6) ADDL DYN_DEFDEV,R6 MOVC3 DYN_DEFDIR,@DYN_DEFDIR+4,(R6) ADDL DYN_DEFDIR,R6 DECL R6 ; OVERLAY "]" MOVZBL PURSPEC,DYN_PURSPEC MOVC3 DYN_PURSPEC,PURSPEC+1,(R6) ADDL R6,DYN_PURSPEC SUBL DYN_PURSPEC+4,DYN_PURSPEC MOVZWL QXR_PURKEEP(R11),PURKEEP ; PURKEEP TO LONGWORD PUSHAL PRCS_UIC(R10) ; PURGE FILES PUSHAQ DYN_DEFDEV PUSHAL PURKEEP PUSHAQ DYN_PURSPEC CALLS #4,ISUPURDEL JSB PROC_ERREXIT RSB_PURGE: RSB .PAGE .SBTTL PROC_ACCTG ; PROC_ACCTG: $GET RAB=RAB_QUAX ; READ/LOCK QUAX RECORD JSB PROC_ERREXIT $GETTIM_S TIMADR=CUR_TIME ; CURRENT TIME JSB PROC_ERREXIT $GETJPI_S ITMLST=LST_ACCTG ; GET POOP FOR ACCTG JSB PROC_ERREXIT TSTW LEN_TTNAME ; IAC PRCS? BEQL 10$ ; NO MOVQ CUR_TIME,QXR_IACLOGOUT_T(R11) ; SET LOGOUT TIME CLRQ -(SP) ; WORK AREA SUBQ3 LOGIN_TIME,CUR_TIME,0(SP) ; COMPUTE CONNECT TIME EDIV #10000000,(SP),(SP),4(SP) MOVL (SP),AFACTR_CONN(R9) MOVAB 8(SP),SP ; RLSE WORK AREA 10$: PUSHAL TAB_COST ; DO ACCOUNTING PUSHAB QUAX PUSHAL TAB_AFACTR PUSHAL PRCS_TYPE(R10) PUSHAQ LOGIN_TIME CALLS #5,G^ISUACCTG MOVL CUR_DSKUSE,QXR_U_DISK_C(R11) ; CURRENT DISK USE $UPDATE RAB=RAB_QUAX ; UPDATE/RLSE QUAX RECORD JSB PROC_ERREXIT RSB_ACCTG: RSB .PAGE .SBTTL PROC_WRTLOG ; PROC_WRTLOG: $SNDACC_S MSGBUF=DSC_WRTLOG_ACC ; LOCAL ACCTG INFO TO LOG RSB .PAGE .SBTTL PROC_CHECK ; PROC_CHECK: BITL #QMSK_M_AUTHEXP,QMASK ; DATES ENFORCED? BEQL 10$ ; NO PUSHAL STS_WARN ; CHECK DATE STATUS PUSHAL STS_FAIL PUSHAB QUAX PUSHAQ CUR_TIME PUSHAL QMASK CALLS #5,CHKDATES 10$: PUSHAL STS_WARN ; CHECK QUOTA/USAGE STATUS PUSHAL STS_FAIL PUSHAB QUAX PUSHAL TAB_CHKQUOUSE PUSHAL QMASK CALLS #5,CHKQUOUSE RSB .PAGE .SBTTL PROC_SHOMSG ; PROC_SHOMSG: TSTL STS_WARN ; ANY WARNINGS? BEQL 10$ ; NO PUSHAB QUAX ; SHOW WARNINGS PUSHAL STS_WARN CALLS #2,G^SHOWARN 10$: BICL GBL_REPRIEVE,STS_FAIL ; CLEAR UN-ENFORCED QUOTAS BEQL 20$ ; A-OK PUSHAB QUAX ; SHOW FATAL MSGS PUSHAL STS_FAIL CALLS #2,G^SHOFAIL 20$: BITL #LOPRM_M_DISK,PRM_LOGOUT ; SHO DISK USAGE? BEQL 30$ ; NO SUBL #4*4,SP ; WORK AREA MOVL SP,R6 ; ADR MSG VECTOR MOVL #3,QMSG_LENGTH(R6) ; INIT MSGVEC MOVL #ISUQUO_DSKUSAGE,QMSG_MSGID(R6) MOVL #1,QMSG_FAO_CNT(R6) MOVL QXR_U_DISK_C(R11),QMSG_FAO_ARG(R6) $PUTMSG_S MSGVEC=(R6) ADDL #4*4,SP ; RLSE WORK AREA 30$: BITL #LOPRM_M_ACC,PRM_LOGOUT ; SHO ACCOUNTING INFO? BEQL RSB_SHOMSG ; NO JSB PROC_SHOCOST ; DISPLAY JOB COST RSB_SHOMSG: RSB .PAGE .SBTTL PROC_SHOCOST MASK_SHOCOST= ^M PROC_SHOCOST: PUSHR #MASK_SHOCOST ; SAVE WORK REGS MOVAL TAB_AFACTR,R9 ; SET BASE REGS MOVAL TAB_COST,R8 BITL #LOPRM_M_ACC,PRM_LOGOUT ; DISPLAY ACCOUNTING INFO? BNEQ 5$ ; YES JMP RSB_SHOCOST 5$: $OPEN FAB=FAB_SYSOUT ; OPEN SYS$OUTPUT JSB PROC_ERREXIT $CONNECT RAB=RAB_SYSOUT JSB PROC_ERREXIT $FAO_S CTRSTR=FAO_COST_HDG,- ; ACCTG PAGE HEADING OUTLEN=DYN_OUT_LINE,- OUTBUF=DSC_OUT_LINE $RAB_STORE RAB=RAB_SYSOUT,- RSZ=DYN_OUT_LINE $PUT RAB=RAB_SYSOUT BITL #LOPRM_M_FULL,PRM_LOGOUT ; SHOW FULL ACCOUNTING INFO? BNEQ 20$ ; YES JMP SHOCOST_TOTAL 20$: EMUL #100000,AFACTR_CPU(R9),#0,WORK ; CPU TO QUAD TIME DOLRCENT COST_CPU(R8),WORK+8,WORK+12 $FAO_S CTRSTR=FAO_COST_CPU,- OUTLEN=DYN_OUT_LINE,- OUTBUF=DSC_OUT_LINE,- P1=#WORK,- P2=WORK+8,- P3=WORK+12 $RAB_STORE RAB=RAB_SYSOUT,- RSZ=DYN_OUT_LINE $PUT RAB=RAB_SYSOUT DOLRCENT COST_DIOCNT(R8),WORK,WORK+4 $FAO_S CTRSTR=FAO_COST_DIO,- OUTLEN=DYN_OUT_LINE,- OUTBUF=DSC_OUT_LINE,- P1=AFACTR_DIOCNT(R9),- P2=WORK,- P3=WORK+4 $RAB_STORE RAB=RAB_SYSOUT,- RSZ=DYN_OUT_LINE $PUT RAB=RAB_SYSOUT TSTL AFACTR_CONN(R9) BEQL SHOCOST_TOTAL EMUL #100000,AFACTR_CONN(R9),#0,WORK ; CVT CONN TO QUAD TIME DOLRCENT COST_CONN(R8),WORK+8,WORK+12 $FAO_S CTRSTR=FAO_COST_CONN,- OUTLEN=DYN_OUT_LINE,- OUTBUF=DSC_OUT_LINE,- P1=#WORK,- P2=WORK+8,- P3=WORK+12 $RAB_STORE RAB=RAB_SYSOUT,- RSZ=DYN_OUT_LINE $PUT RAB=RAB_SYSOUT SHOCOST_TOTAL: DOLRCENT COST_TOTAL(R8),WORK+4,WORK+8 ; SESSION TOTAL DOLRCENT QUAX+QXR_U_DOLLARS,WORK+12,WORK+16 ; CUM-TO-DATE DOLRCENT QUAX+QXR_Q_DOLLARS,WORK+20,WORK+24 ; ALLOCATED $FAO_S CTRSTR=FAO_COST_TOTAL,- ; TOTAL COST OUTLEN=DYN_OUT_LINE,- OUTBUF=DSC_OUT_LINE,- P1=WORK+4,- P2=WORK+8,- P3=WORK+12,- P4=WORK+16,- P5=WORK+20,- P6=WORK+24 $RAB_STORE RAB=RAB_SYSOUT,- RSZ=DYN_OUT_LINE $PUT RAB=RAB_SYSOUT RSB_SHOCOST: $CLOSE FAB=FAB_SYSOUT ; CLOSE SYS$OUTPUT POPR #MASK_SHOCOST ; RESTORE WORK REGS RSB .PAGE .SBTTL PROC_ERREXIT ; PROC_ERREXIT: BLBC R0,10$ RSB ; IF OK THEN RETURN 10$: MOVL SP,R7 ; SAVE RETURN ADR SUBL #6*4,SP ; WORK AREA MOVAL (SP),R6 MOVL R6,R8 ; ADR MSGVEC MOVL #5,QMSG_LENGTH(R6) ; SET UP MSG VECTOR MOVL #ISUQUO_ERREXIT,QMSG_MSGID(R6) MOVL #3,QMSG_FAO_CNT(R6) MOVAL QMSG_FAO_ARG(R6),R6 CLRL (R6)+ ; CURRENT TIME MOVL R0,(R6)+ ; SYSTEM STATUS MOVL (R7),(R6)+ ; LOCN OF ERROR $PUTMSG_S MSGVEC=(R8),- ACTRTN=MSGACTRTN,- ACTPRM=#3 MOVL R7,SP ; RLSE WORK AREA $DELPRC_S ; SEWER-SIDE $EXIT_S R0 ; IF ALL ELSE FAILS .PAGE .SBTTL MSGACTRTN ; THIS ROUTINE SAVES THE MSG CREATED BY $PUTMSG IN STRG_MSGTXT (ASCIC) ; ; CALL MSGACTRTN (MSG, PRM) ; WHERE ; MSG - DESCRIPTOR OF MSG TO RELAY ; PRM - OPTION MASK AND RETURN STATUS FOR THIS ROUTINE ; BIT-0 CONTROLS MSG WRITING (1 WRITE, 0 NO WRITE) ; BIT-1 CONTROLS MSG TO OPERATOR (1 SNDOPR, 0 NO SNDOPR) ARG_COUNT= 0 ARG_MSG= 4 ARG_PRM= 8 .ENTRY MSGACTRTN,^M MOVL ARG_MSG(AP),R11 ; ADR MSG STRG DESCRIPTOR MOVB (R11),STRG_MSGTXT ; SET STRG COUNT MOVC3 (R11),@4(R11),STRG_MSGTXT+1 ; SET STRG TEXT BITL #2,ARG_PRM(AP) ; DISPLAY MSG ON CONSOLE? BEQL RET_MSGACTRTN ; NO MOVL DYN_OPRMSG+4,R6 ; ADR OPER MSG BUFFER MOVZBL STRG_MSGTXT,DYN_OPRMSG ; LEN MSG TEXT MOVC3 DYN_OPRMSG,STRG_MSGTXT+1,- ; INSERT MSG IN OPER MSG BUFFER OPC$L_MS_TEXT(R6) ADDL #OPC$L_MS_TEXT,DYN_OPRMSG ; SET DESCRIPTOR LENGTH $SNDOPR_S MSGBUF=DYN_OPRMSG ; NOTIFY OPER WE HAVE TROUBLE RET_MSGACTRTN: MOVL ARG_PRM(AP),R0 ; SET RETURN STATUS RET .END ISULOGOUT