1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-06 19:11:04 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

402 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE WHOACT - Action routines for WHO
SEARCH WHOMAC
$SETUP (WHOACT)
Comment |
This module contains all the "action" routines for WHO. Action
routines are things that actually do things to jobs, like force
a command to them, output a string on there terminal, etc. The
entry point is DOACTION which will call all the other action
processors.
|
; TABLE OF CONTENTS FOR WHOACT
;
;
; SECTION PAGE
; 1. DOACTION - Call all the action routines................... 3
; 2. Action routines
; 2.1 DOSEND - Send a string to a user.................. 4
; 2.2 DOFORCE - Force a command on a user............... 5
; 2.3 DOINPUT - Input a string to a user................ 6
; 2.4 DOOUTPUT - Output a string to a user.............. 7
; 2.5 DOSETUUO - Do SETUUOs for a job................... 8
; 2.6 DONETWORK - Handle network functions.............. 9
; 2.7 INETWORK - Handle initial network functions....... 10
; 3. Routines
; 3.1 ACTPRV - See if privileged........................ 11
; 3.2 GACJOB - Get a target job number.................. 12
; 3.3 GACLIN - Get a target line number................. 12
; 3.4 GACDES - Get a target line or job number.......... 12
; 3.5 GACTTY - Get a target terminal name............... 12
; 4. Storage................................................... 13
SUBTTL DOACTION - Call all the action routines
DOACTION::
PUSHJ P,DOSEND ;/SEND::"STRING"
PUSHJ P,DOFORCE ;/FORCE:COMMAND
PUSHJ P,DOINPUT ;/INPUT:"STRING"
PUSHJ P,DOOUTPUT ;/OUTPUT:"STRING"
PUSHJ P,DOSETUUO ;/SETUUO:ARGS
PUSHJ P,DONETWORK ;/NETWORK:ARGS
PUSHJ P,DOHANGUP ;/HANGUP
POPJ P, ;AND RETURN
SUBTTL Action routines -- DOSEND - Send a string to a user
DOSEND: TRNN F,FR.TRMOP ;TRMOP. UUO FAILED?
SKIPN S.SEND## ;/SEND: GIVEN?
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTSND ;CHECK PRIVS
PUSHJ P,.SAVE1## ;SAVE P1
MOVEI T1,SNDCHR ;GET CHAR PUTTER
PUSHJ P,.TYOCH## ;TELL SCAN
PUSH P,T1 ;SAVE OLD ONE
MOVE P1,[POINT 7,SNDBUF] ;POINT TO TEXT BUFFER
MOVEI T1,[BYTE (7) .CHCRT,.CHLFD,.CHBEL,";",";",0]
PUSHJ P,.TSTRG## ;SEND CRLF BELL ;;
MOVE T2,.MYPPN## ;GET USERS PPN
TRNE T2,777775 ;OPR OR REMOTE OPR?
JRST DOSE.1 ;NO
MOVSI T1,'OPR' ;GET THE NAME
PUSHJ P,.TSIXN## ;ADD THAT
HLRZ T1,.MYPPN## ;GET USERS PPN
SUBI T1,100 ;GET LOCAL NODE NUMBER
CAILE T1,0 ;SKIP IF NOT LOCAL OPR
PUSHJ P,.TOCTW## ;TYPE STATION FOR LOCAL OPR
PUSHJ P,.TLPRN## ;TYPE "("
MOVE T1,MYTTY## ;GET TERMINAL NAME
PUSHJ P,.TSIXN## ;INCLUDE THAT
PUSHJ P,.TRPRN## ;CLOSE ")"
JRST DOSE.2 ;AND SKIP NORMAL STUFF
DOSE.1: MOVE T1,MYTTY## ;GET USERS TERMINAL
PUSHJ P,.TSIXN## ;TYPE
DOSE.2: MOVEI T1,[ASCIZ/: - /] ;GET SEPARATPR
PUSHJ P,.TSTRG## ;TYPE
MOVEI T1,S.SEND## ;POINT TO SEND STRING
PUSHJ P,TSTRG ;TYPE STRING
PUSHJ P,.TCRLF## ;START NEW LINE
MOVEI T1,0 ;FINISH OFF
PUSHJ P,SNDCHR ;SEND
POP P,.TOUTZ## ;RESTORE SCAN TYPER
MOVEI T1,.TOOUS ;GET FUNCTION
MOVEI T2,SNDBUF ;POINT TO BUFFER
PUSHJ P,ACTRMOP ;DO TRMOP
TROA F,FR.TRMOP ;FLAG FAILED
POPJ P, ;RETURN
$WARN (TSF,<TRMOP. SEND failed>,,.POPJ##)
SNDCHR: IDPB T1,P1 ;STORE CHAR
POPJ P, ;AND RETURN
ACTRMOP:MOVEM T1,TRMBLK+0 ;STORE FUNCTION
MOVEM T2,TRMBLK+2 ;STORE ARGUMENT
PUSHJ P,GACLIN ;GET TARGET LINE
JRST .POPJ1## ;NONE
MOVEM T1,TRMBLK+1 ;STORE TARGET
MOVE T1,[3,,TRMBLK] ;POINT TO BLOCK
TRMOP. T1, ;DO TRMOP.
POPJ P, ;FAILED
JRST .POPJ1## ;SUCCESS
TSTRG: HRLI T1,(POINT 7,) ;FORM BYTE POINTER
PUSH P,T1 ;SAVE IT
TSTR.1: ILDB T1,(P) ;GET A CHAR
JUMPE T1,TSTR.3 ;DONE?
CAIE T1,"^" ;CONTROL FLAG?
JRST TSTR.2 ;NO
ILDB T1,(P) ;GET NEXT CHAR
CAIL T1,"a" ;SEE IF LOWER CASE
CAILE T1,"z" ;..
CAIA ;NO
SUBI T1,"a"-"A" ;YES--CONVERT
JUMPE T1,TSTR.3 ;TURKEY!
SUBI T1,100 ;CONVERT
TSTR.2: PUSHJ P,.TCHAR## ;TYPE IT
JRST TSTR.1 ;AND LOOP
TSTR.3: POP P,(P) ;TRIM STACK
POPJ P, ;RETURN
SUBTTL Action routines -- DOFORCE - Force a command on a user
DOFORCE:MOVE T1,S.FORCE## ;GET VALUE
TRNN F,FR.FRCUUO ;FRCUUO. UUO FAILED?
CAMN T1,[-1] ;SEE IF GIVEN
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
PUSHJ P,GACDES ;GET A DESTINATION (JOB OR LINE)
POPJ P, ;JOB MODE AND DETACHED
MOVEM T1,FRCBLK+1 ;STORE JOB/LINE
MOVE T1,S.FORCE## ;GET COMMAND
MOVEM T1,FRCBLK+0 ;STORE
MOVE T1,[2,,FRCBLK] ;POINT TO ARGS
FRCUUO T1, ;FORCE IT
TROA F,FR.FRCUUO ;FLAG FAILED
POPJ P, ;GOOD RETURN
$WARN (FUF,<FRCUUO. failed>,,.POPJ##)
SUBTTL Action routines -- DOINPUT - Input a string to a user
DOINPUT:TRNN F,FR.TRMOP ;TRMOP. UUO FAILED?
SKIPN S.INPUT## ;/INPUT: GIVEN?
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
PUSHJ P,.SAVE1## ;SAVE P1
MOVEI T1,SNDCHR ;GET CHAR PUTTER
PUSHJ P,.TYOCH## ;TELL SCAN
PUSH P,T1 ;SAVE OLD ONE
MOVE P1,[POINT 7,SNDBUF] ;POINT TO TEXT BUFFER
MOVEI T1,S.INPUT## ;POINT TO INPUT STRING
PUSHJ P,TSTRG ;TYPE STRING
PUSHJ P,.TCRLF## ;START NEW LINE
MOVEI T1,0 ;FINISH OFF
PUSHJ P,SNDCHR ;SEND
POP P,.TOUTZ## ;RESTORE SCAN TYPER
MOVEI T1,.TOTYP ;GET FUNCTION
MOVEI T2,SNDBUF ;POINT TO BUFFER
PUSHJ P,ACTRMOP ;DO TRMOP
TROA F,FR.TRMOP ;FLAG FAILED
POPJ P, ;RETURN
JRST E$$TSF ;TYPE ERROR AND RETURN
SUBTTL Action routines -- DOOUTPUT - Output a string to a user
DOOUTPUT:TRNN F,FR.TRMOP ;TRMOP. UUO FAILED?
SKIPN S.OUTPUT## ;/OUTPUT: GIVEN?
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
PUSHJ P,.SAVE1## ;SAVE P1
MOVEI T1,SNDCHR ;GET CHAR PUTTER
PUSHJ P,.TYOCH## ;TELL SCAN
PUSH P,T1 ;SAVE OLD ONE
MOVE P1,[POINT 7,SNDBUF] ;POINT TO TEXT BUFFER
MOVEI T1,S.OUTPUT## ;POINT TO OUTPUT STRING
PUSHJ P,TSTRG ;TYPE STRING
PUSHJ P,.TCRLF## ;START NEW LINE
MOVEI T1,0 ;FINISH OFF
PUSHJ P,SNDCHR ;SEND
POP P,.TOUTZ## ;RESTORE SCAN TYPER
MOVEI T1,.TOOUS ;GET FUNCTION
MOVEI T2,SNDBUF ;POINT TO BUFFER
PUSHJ P,ACTRMOP ;DO TRMOP
DOOU.1: TROA F,FR.TRMOP ;FLAG FAILED
POPJ P, ;RETURN
JRST E$$TSF ;TYPE ERROR AND RETURN
SUBTTL Action routines -- DOSETUUO - Do SETUUOs for a job
DOSETUUO:TRNN F,FR.SETUUO ;SETUUO FAILED?
SKIPG SETCNT## ;ANYTHING TO DO?
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
PUSHJ P,GACJOB ;GET THE JOB NUMBER
POPJ P, ;NONE
MOVEI T2,0 ;CLEAR COUNTER
MOVE T4,SETCNT## ;GET COUNT OF ARGS
SETU.1: SOJL T4,.POPJ## ;RETURN WHEN DONE
MOVEM T1,SETBLK##+1(T2) ;STORE USER JOB
HRRI T3,SETBLK##+1(T2) ;POINT TO ARGS
ADD T2,SETBLK##(T2) ;ADVANCE TO NEXT SET
HRLI T3,2 ;INDICATE LENGTH
JBSET. T3, ;DO THE UUO
TROA F,FR.SETUUO ;FLAG FLAGED
JRST SETU.1 ;LOOP FOR ALL
$WARN (SUF,<SETUUO failed>,,.POPJ##)
SUBTTL Action routines -- DONETWORK - Handle network functions
DONETWORK:SKIPG T1,S.NETWORK## ;ANYTHING TO DO?
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
MOVE T1,S.NETWORK## ;GET FUNCTION
CAIE T1,NETDISCONNECT## ;DISCONNECT?
POPJ P, ;NO--RETURN
PUSHJ P,GACTTY ;GET A TTY NUMBER
POPJ P, ;NONE
MOVEI T2,2 ;TWO ARGS
EXCH T1,T2 ;POSITION COUNT,,ARG
MOVE T3,[.NDTDS,,T1] ;FUNCTION,,ARGBLK
NODE. T3, ;DISCONNECT HIM
$WARN (CDN,<Cant disconnect line >,E.CDN)
POPJ P, ;AND RETURN
SUBTTL Action routines -- DOHANGUP - Hangup a dialup line
DOHANGUP:SKIPG T1,.FZHNG##(I) ;ANYTHING TO DO?
POPJ P, ;NO--JUST RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
PUSHJ P,LB$TLN## ;GET LINE NUMBER
JUMPL T1,.POPJ## ;RETURN IF DETACHED
MOVEI T2,.TODSF ;DISCONNECT DATASET FUNCTION
MOVEI T3,.UXTRM(T1) ;UDX
MOVE T1,[2,,T2] ;SET UP UUO
TRMOP. T1, ;DO IT
$WARN (CHL,<Can't hangup line >,E.CHL)
POPJ P, ;RETURN
E.CHL: PUSHJ P,LB$TLN## ;GET LINE NUMBER
PJRST .TOCTW## ;TYPE IT AND RETURN
SUBTTL Action routines -- INETWORK - Handle initial network functions
INETWORK::MOVE T1,S.NETWORK## ;GET /NETWORK:ARGS
CAIE T1,NETCONNECT## ;CONNECT?
POPJ P, ;NO--RETURN
PUSHJ P,ACTPRV ;CHECK PRIVS
PUSHJ P,.SAVE2## ;SAVE P1&P2
PUSHJ P,S$FIRST## ;POSITION TO FIRST SPEC
INET.1: MOVE T2,.FZNNM##(I) ;GET NODE NAME
CAMN T2,[-1] ;SEE IF GIVEN
$FATAL (NNS,<No node specified for /NETWORK:CONNECT>)
MOVE T1,.FZNNM##+1(I) ;GET MASK
CAME T1,[-1] ;CHECK FOR WILDCARDS
$FATAL (WNI,<Wildcarded node illegal with /NETWORK:CONNECT>)
MOVE T1,.FZNNM##(I) ;GET NODE NAME
PUSHJ P,ANODE## ;CONVERT TO NUMBER
$WARN (NNA,<Node not available; cannot connect terminals>,,INET.N)
MOVEI P2,(T1) ;SAVE IT FOR LATER
SKIPGE P1,.FZNLN##(I) ;SEE IF LINE SPECIFIED
JRST INET.2 ;NO--GET THEM ALL
HRLI P1,-1 ;YES--MAKE SINGLE AOBJN POINTER
JRST INET.L ;AND CONNECT HIM
INET.2: MOVEI T1,4 ;INDICATE LENGTH
MOVEI T3,0 ;MUST BE ZERO
MOVX T4,.TYTTY ;FIND HOW MANY TERMINALS
MOVE P1,[.NDRCI,,T1] ;SETUP ARG BLK POINTER
NODE. P1, ;ASK MONITOR
JRST E$$NNA ;ERROR
HLRZ T1,T4 ;GET COUNT OF TERMINALS
JUMPE T1,INET.N ;JUMP IF NO TERMINALS
MOVN P1,T1 ;GET -N
HRLZS P1 ;MAKE -N,,0
INET.L: MOVEI T1,2 ;LENGHT
MOVEI T2,(P1) ;GET LINE NUMBER
HRLI T2,(P2) ;INCLUDE NODE NUMBER
MOVE T3,[.NDTCN,,T1] ;GET CONNECT FUNCTION
NODE. T3, ;DO IT
$WARN (CCL,<Cannot connect line >,E.CCL)
AOBJN P1,INET.L ;LOOP FOR ALL
INET.N: PUSHJ P,S$NEXT## ;GET NEXT SCAN BLOCK
POPJ P, ;ALL DONE
JRST INET.1 ;AND LOOP
E.CCL: PUSH P,T3 ;SAVE ERROR CODE
MOVE T1,.FZNNM##(I) ;GET NODE
PUSHJ P,.TSIXN## ;TYPE
MOVEI T1,"_" ;DELIMITER
PUSHJ P,.TCHAR## ;TYPE
MOVEI T1,(P1) ;GET LINE NUMBER
PUSHJ P,.TOCTW## ;TYPE
E.CCL1: MOVEI T1,[ASCIZ/; /] ;TEXT
PUSHJ P,.TSTRG## ;TYPE IT
POP P,T1 ;RESTORE ERROR CODE
PUSHJ P,.TENOD## ;MAP THE ERROR
JFCL ;
PJRST .TSTRG## ;TYPE STRING AND RETURN
E.CDN: PUSH P,T3 ;SAVE ERROR CODE
MOVE T1,T2 ;COPY TTY
PUSHJ P,.TSIXN## ;TYPE
JRST E.CCL1 ;AND FINISH OFF
SUBTTL Routines -- ACTPRV - See if privileged
ACTSND: TDZA T1,T1 ;FLAG SEND PRIV
ACTPRV: MOVEI T1,1 ;FLAG NORMAL PRIV
PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,T1 ;SAVE FLAG
TLNE F,(FL.CRASH) ;SEE IF CRASH FILE MODE
$FATAL (ASI,<Action switches illegal when reading crash files>)
CAIE M,M%JOB## ;SEE IF JOB MODE
JRST ACTP.2 ;NO
MOVNI T1,1 ;GET -1
CAMN T1,.FZJOB##(I) ;SEE IF JOB
CAME T1,.FZNAM##(I) ;OR NAME
CAIA ;OK
$FATAL (EJR,<Explicit job, name or * required for action functions>)
MOVEI T1,.GTPPN ;GET PPN AGAIN
PUSHJ P,JTAB## ;..
PUSH P,T1 ;SAVE CURRENT PPN
PUSHJ P,JB$PPN## ;GET ORIGINAL PPN
POP P,T2 ;RESTORE CURRENT
CAME T1,T2 ;SAME AS BEFORE?
JRST ACTP.1 ;NO--ERROR
MOVEI T1,.GTSTS ;GET JOB STATUS AGAIN
PUSHJ P,JTAB## ;..
TXC T1,JS.LOG!JS.JNA ;ASSIGNED AND LOGGED IN?
TXCE T1,JS.LOG!JS.JNA ;CHECK AGAIN
JRST ACTP.1 ;NO--ERROR
PUSHJ P,JB$PPG## ;GET PROGRAMMER NUMBER
HRRZ T2,.MYPPN## ;AND MINE
CAIN T1,(T2) ;MATCH ME?
POPJ P, ;YES--LET ME TRY
JUMPN P1,ACTP.1 ;NO--DO NORMAL CHECKS IF NOT SEND
PUSHJ P,JB$PPJ## ;GET USER PROJECT
HLRZ T2,.MYPPN## ;AND MINE
CAIN T1,(T2) ;MATCH ME?
POPJ P, ;YES--LET ME TRY
JRST ACTP.1 ;NO--DO NORMAL CHECKS
ACTP.2: MOVNI T1,1 ;GET -1
CAMN T1,.FZTTY##(I) ;SEE IF TERMINAL
CAME T1,.FZNNM##(I) ;OR NODE
CAIA ;OK
$FATAL (ELR,<Explicit node, line, device, or * required for action functions>)
PUSHJ P,LB$JOB## ;GET JOB USING TERMINAL
CAMN T1,MYJOB## ;ME?
POPJ P, ;YES--LET ME TRY
;NO--DO NORMAL CHECKS
ACTP.1: TLNE F,(FL.JACCT) ;SEE IF JACCTED
TLNE F,(FL.GOD!FL.POKE) ;YES--SEE IF [1,2] OR POKE
POPJ P, ;NO PRIVS--TRY ANYWAY
$FATAL (FRP,<Function requires privileges>)
SUBTTL Routines -- GACJOB - Get a target job number
GACJOB: CAIN M,M%JOB## ;JOB MODE?
PUSHJ P,JB$JOB## ;YES--GET JOB
CAIN M,M%LINE## ;LINE MODE?
PUSHJ P,LB$JOB## ;YES--GET JOB
JUMPE T1,.POPJ## ;ERROR IF NONE
JRST .POPJ1## ;ELSE SKIP RETURN
SUBTTL Routines -- GACLIN - Get a target line number
GACLIN: CAIN M,M%JOB## ;JOB MODE?
PUSHJ P,JB$TLN## ;YES--GET LINE
CAIN M,M%LINE## ;LINE MODE?
PUSHJ P,LB$TLN## ;YES--GET LINE
JUMPL T1,.POPJ## ;ERROR IF DETACHED
ADDI T1,.UXTRM ;MAKE UDX
JRST .POPJ1## ;AND SKIP RETURN
SUBTTL Routines -- GACDES - Get a target line or job number
GACDES: CAIE M,M%JOB## ;SEE IF JOB MODE
JRST GACD.1 ;NO
PUSHJ P,JB$TLN## ;GET TERMINAL
JUMPL T1,.POPJ## ;ERROR IF DETACHED
PUSHJ P,JB$JOB## ;GET JOB NUMBER
PJRST .POPJ1## ;AND SKIP RETURN
GACD.1: PUSHJ P,LB$JOB## ;GET JOB NUMBER
JUMPN T1,.POPJ1## ;USE THAT IF PRESENT
PUSHJ P,LB$TLN## ;ELSE GET LINE NUMBER
ADDI T1,.UXTRM ;MAKE UDX
JRST .POPJ1## ;AND SKIP RETURN
SUBTTL Routines -- GACTTY - Get a target terminal name
GACTTY: CAIE M,M%JOB## ;JOB MODE?
JRST GACT.1 ;NO
PUSHJ P,JB$TLN## ;GET LINE
JUMPL T1,.POPJ## ;ERROR IF DETACHED
PUSHJ P,JB$TTY## ;GET TTY NAME
JRST .POPJ1## ;AND SKIP RETURN
GACT.1: PUSHJ P,LB$TTY## ;GET TTY NAME
JRST .POPJ1## ;AND SKIP RETURN
SUBTTL Storage
$LOW
SNDBUF: BLOCK LN$SND+3
TRMBLK: BLOCK 3
FRCBLK: BLOCK 2
END