!TITLE A General Interface to Director Facilities
!<DPROCEDURE
externalintegerfn DPROCEDURE(integer ACT, ADR)
!
! This procedure provides a general interface to Director to allow
! new facilities to be tested easily
!
! ACT is an activity number and ADR the address of a record
!
! ACT = 1
! Returns Directors 'proclist'. In this case, ADR is the
! address of a record of format:
! %integername N, %integer A
! the proclist entries are returned to address A onwards and
! the number of entries is returned in N. Currently each
! proclist entry is 56 bytes long, but is liable to change.
!
! ACT = 2
! Allows the caller to 'fork' another invocation of his own process.
! ADR is the address of a record of format:
! %integer INVOC, %string(31)PARAM
! The new invocation number is returned in INVOC and PARAM
! is placed in the UINF record of the new invocation as
! UINF_SPOOLRFILE. The caller should disable the IO streams
! before calling this procedure. Director disconnects the
! streams and reconnects them subsequently to the new
! invocation.
! ACT = 3
! Sends a message to another invocation of your own process.
! ADR is the address of a record of format:
! %record(PARMF) P, %integer INVOC, MSGTYPE, OUTNO)
!>
INTEGER J, CUR, A, SEG, GAP, SIZE, L, FINDAD
!
STRING (127)W
STRING (6)UNA
STRING (11)INA
STRING (18)INDEX, S11
STRING (18)FILENAME
RECORD (LOGFHDF)NAME LH
RECORD (PROCDATF)NAME PROCDAT
!
RECORDFORMAT R1F(INTEGER N, A)
RECORD (R1F)NAME R1
!
RECORDFORMAT R2F(INTEGER INVOC, STRING (31)PARAM)
RECORD (R2F)NAME R2
!
RECORDFORMAT R3F(RECORD (PARMF)P, INTEGER INVOC, MSGTYPE, OUTNO)
RECORD (R3F)NAME R3
!
RECORDFORMAT R4F(STRING (31)FILEINDEX, STRING (127)NODE, INTEGER FSYS)
RECORD (R4F)NAME R4
!
CONSTRECORD (UINFF)NAME UINF = 9 << 18
CONSTINTEGER TOPACT = 4
SWITCH SW(1 : TOPACT)
J = IN2(44)
-> OUT UNLESS J = 0
!
J = 8
-> SW(ACT) IF 1 <= ACT <= TOPACT
!
-> OUT
SW(1): ! Return Director's proclist
SIZE = SIZEOF(PROCDAT)
R1 == RECORD(ADR)
R1_N = 0
A = R1_A
!
FILENAME = "VOLUMS.#LOGMAP"
SEG = 0
GAP = 0
J = DCONNECTI(FILENAME, -1, WRSH, 0, SEG, GAP)
-> OUT UNLESS J = 0 OR J = 34
!
LH == RECORD(SEG<<18 + X'10000')
CUR = LH_BACKHD
WHILE CUR # ENDLIST CYCLE
PROCDAT == RECORD(A)
PROCDAT = LH_PROCLIST(CUR)
R1_N = R1_N + 1
A = A + SIZE
CUR = LH_PROCLIST(CUR)_BLNK
REPEAT
J = DDISCONNECTI(FILENAME, -1, 0) IF J = 0
-> OUT
SW(2):
R2 == RECORD(ADR)
J = STARTP(UINF_USER, R2_PARAM, UINF_ITADDR, R2_INVOC,
UINF_FSYS, UINF_STARTCNSL, 5, UINF_STREAMID, UINF_DIRVSN,0)
-> OUT
SW(3):
R3 == RECORD(ADR)
-> OUT UNLESS 1 <= R3_MSGTYPE <= 3
-> OUT UNLESS 5 <= R3_OUTNO <= 10
R3_P_DEST = X'FFFF0009'
R3_P_P1 = (UINF_ISUFF<<24) ! (R3_P_P1<<8>>8)
J = DPON3I(PROCUSER, R3_P, R3_INVOC, R3_MSGTYPE, R3_OUTNO)
-> OUT
SW(4): ! Dselectnode
! The node name is checked for good syntax but not existence
R4 == RECORD(ADR)
L = LENGTH(R4_NODE)
R4_NODE = R4_NODE . NSEP UNLESS L > 0 AND CHARNO(R4_NODE, L) = NSEPCH
!
IF R4_NODE -> W . (".") . R4_NODE C {allow NODE to specify the whole thing}
THEN W = R4_FILEINDEX . W C
ELSE W = R4_FILEINDEX
!
J = UIO(W, UNA, INA, INDEX)
-> OUT UNLESS J = 0
!
J = FINDA(INDEX, R4_FSYS, FINDAD, 2); ! just to get fsys
-> OUT UNLESS J = 0
!
IF LENGTH(R4_NODE) > 1 START
W = R4_NODE
CYCLE
W -> S11 . (NSEP) . W
J = S11OK(S11)
-> OUT UNLESS J = 0
EXIT IF W = ""
REPEAT
FINISH
!
SELECTED INDEX = INDEX
SELECTED NODE = R4_NODE
SELECTED FSYS = R4_FSYS
J = 0
-> OUT
OUT:
RESULT = OUT(J, "")
END ; ! DPROCEDURE
!
!-----------------------------------------------------------------------
!