@X @~
~V7 56 2 -5
~D10
~H                    MUSS

~
~D10
~H             SUP021
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YSUP021
~S1~M~OSUP IMPLEMENTATION DESCRIPTION
~
~M~OSection 2 Version 1
~S1~OSection 2.1 File Manager
~S1~O1. General Description
~BThe File Manager is responsible for the handling of the
remote file requests, as described in the MUSS User Manual.
~S1~O2. Interfaces
Interface procedure~
   FILE MANAGER ()~
~S11) FILE MANAGER ()~
~BThis interface procedure is used during the creation
of the file manager, to start its execution at the appropriate
point.~
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~BThere is one File Manager process (initially at WAIT state)
in every machine in the MU6 network responsible for servicing
the REMOTE.FILE.REQUESTs issued from any process in the
Network.
~BThe conversation is initiated by the user process by
sending a short message holding the parameters of the file
command to be performed (accompanied by a segment from
the user's virtual store in case of a FILE command) to the
File Manager process. The File Manager then performs the
required file command on the behalf of the legal user on
this machine (ie OPEN.DIR followed by FILE.COMMAND).
Then it returns the status varibles as a short message
accompanied by a segment in case of OPEN.FILE, CATALOGUE.FILES
and CATALOGUE.PERMIT commands to the user process. The process
WAITs until another request appears at the appropriate channel.
~Y
~V9 -1
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                SUP021
~V9 -1
~F
@TITLE SUP02(1,6)

@COL 1S-2R-3R-4R-5R-6F

@FLOW 1-2-3-4-5-6

@BOX 1.0
FILE MANAGER
@BOX 4.0
PROCEDURE IN MODULE
   1 FILE MANAGER
@BOX 6.0
END
@BOX 1.1
#SUP02/1
MODULE SUP02 (FILE.MANAGER10);
@BOX 3.1
*GLOBAL 9;
LABEL RESTART.LABEL;
@BOX 4.1
*CODE 1;
LSPEC FILE.MANAGER10 ();
   #SUP02.1
@BOX 6.1
*END
@END
@TITLE SUP02/1(1,11)

@COL 1S-2R-3R-4R

@FLOW 1-2-3-4

@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
SYS15 MESSAGE MANAGEMENT
SYS16 FILE MANAGEMENT
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 4.1
LSPEC CHANGE.ROOT.DIR (LOGICAL64, LOGICAL64);
LSPEC RELEASE.SEGMENT (INTEGER);
LSPEC OPEN.DIR (ADDR [LOGICAL8]);
LSPEC OPEN.FILE (ADDR [LOGICAL8], LOGICAL64, INTEGER, LOGICAL);
LSPEC FILE (ADDR [LOGICAL8], LOGICAL64, INTEGER);
LSPEC DELETE.FILE (ADDR [LOGICAL8], LOGICAL64);
LSPEC RENAME.FILE (ADDR [LOGICAL8], LOGICAL64, ADDR [LOGICAL8]);
LSPEC CATALOGUE.FILES (ADDR [LOGICAL8], LOGICAL64);
LSPEC PERMIT (ADDR [LOGICAL8], LOGICAL64, LOGICAL64, LOGICAL64);
LSPEC CATALOGUE.PERMIT (ADDR [LOGICAL8], LOGICAL64);
LSPEC WAIT (LOGICAL, INTEGER);
LSPEC SET.CH.STATUS (INTEGER, INTEGER, INTEGER, INTEGER);
LSPEC SEND.MESSAGE (ADDR [LOGICAL8], ADDR [INTEGER],
   INTEGER, INTEGER, INTEGER, LOGICAL);
LSPEC READ.MESSAGE (ADDR [LOGICAL8], ADDR [INTEGER], INTEGER, INTEGER);
PSPEC RETURN.FROM.TRAP ();
PSPEC INIT.IO ();
IMPORT LITERAL LIB05.NO.OF.TRAPS;
PSPEC TPROC (INTEGER, INTEGER);
PSPEC SET.TRAP (INTEGER, ADDR TPROC);
PSPEC SET.RECOVERY.STATUS (INTEGER, INTEGER);
ADDR PW0, PW1, PW2, PW3, PW4, PW5, PW6;
@END
@TITLE SUP02.1(1,11)

@COL 1S-7R-12R-2T-8T-3T-9T-4R-5R-6F
@COL 11R
@ROW 4-11
@FLOW 2FAILED-12
@FLOW 3-5
@FLOW 1-7-12-2OK-8OK-3OK-9OK-4-5-12
@FLOW 8FAULTY-11-5
@FLOW 9FAULTY-11
@BOX 1.0
FILE MANAGER
@BOX 2.0
READ MESSAGE FROM CHANNEL 0
@BOX 3.0
OPEN THE DIRECTORY OF
THE CURRENT USER
@BOX 4.0
CALL THE REQUIRED FILE SYSTEM COMMAND
#SUP02.1.2
@BOX 5.0
SEND REPLY MESSAGE TO THE
REQUESTING USER
@BOX 6.0
END
@BOX 7.0
INCLUDE FILE MANAGER TRAP
#SUP02.1.1
@BOX 8.0
MESSAGE PREAMBLE OK?
@BOX 9.0
COMMAND INDEX OK?
@BOX 10.0
RETURN FAULT STATUS -25
(INVALID USER)
@BOX 11.0
RETURN FAULT STATUS -16
(FAULTY MESSAGE)
@BOX 12.0
WAIT FOR A REMOTE REQUEST
@BOX 1.1
PROC FILE.MANAGER10;
INTEGER INDEX, SAVED.PW0, SAVED.PW1, SEGMENT.NO, J, K;
INTEGER [4] DESTN;
LOGICAL64 U.NAME, P.WORD, DISC, R.USER, CMD.INDEX, VAR1, VAR2;
LOGICAL8 [80] MESS;
LOGICAL8 [8] FILE.NAME,  VAR1.NAME;
@BOX 2.1
READ.MESSAGE (^MESS, ^DESTN, 0, -1);
IF PW0 /= 0
@BOX 3.1
PW1 => SAVED.PW1;
FOR J < 8 DO
   U.NAME <<- 8 ! MESS [13 - J] => U.NAME;
   P.WORD <<- 8 ! MESS [21 - J] => P.WORD;
   DISC <<- 8 ! MESS [29 - J] => DISC;
   R.USER <<- 8 ! MESS [37 - J] => R.USER;
   CMD.INDEX <<- 8 ! MESS [45 - J] => CMD.INDEX;
   MESS [53 - J] => FILE.NAME [J];
   VAR1 <<- 8 ! (MESS [61 - J] => VAR1.NAME [J]) => VAR1;
   VAR2 <<- 8 ! MESS [69 - J] => VAR2;
OD;
CHANGE.ROOT.DIR (U.NAME, P.WORD);
IF PW0 /= 0
@BOX 4.1
:: CALL REQUIRED SYSTEM COMMAND
   #SUP02.1.2
CHANGE.ROOT.DIR ("SYSTEM", "MANAGER");
@BOX 5.1
24 => MESS [1];
0 => K;
FOR J < 4 DO
   PW0 ->> K => MESS [J + 6];
   PW1 ->> K => MESS [J + 10];
   PW2 ->> K => MESS [J + 14];
   PW3 ->> K => MESS [J + 18];
   PW4 ->> K => MESS [J + 22];
   PW5 ->> K => MESS [J + 26];
   8 +> K;
OD
SEND.MESSAGE (^MESS, ^DESTN, 0, 0, SEGMENT.NO, VAR1);
@BOX 6.1
END
@BOX 7.1
PSPEC FM.TRAP (INTEGER, INTEGER);
   #SUP02.1.1
RESTART:
INIT.IO ();
RESTART => RESTART.LABEL;
FOR J < LIB05.NO.OF.TRAPS DO
   SET.TRAP (J, ^FM.TRAP);
   SET.RECOVERY.STATUS (J, 0);
OD
SET.RECOVERY.STATUS (4, 1);
@BOX 8.1
0 => SEGMENT.NO;
IF MESS [0] /= 6 OR MESS [1] /= 56
@BOX 9.1
CMD.INDEX => INDEX;
IF INDEX < 0 OR INDEX > 6
@BOX 10.1
-25 => PW0;
@BOX 11.1
-16 => PW0;
@BOX 12.1
SET.CH.STATUS (0, 1, 0, 0);
WAIT (1, %7FFF7FFF);
@END



@TITLE SUP02.1.1(1,6)

@COL 1S-2T-3C
@COL 4R-5F
@ROW 3-4
@FLOW 1-2OTHERS-3
@FLOW 2YES-4-5
@BOX 1.0
FILE MANAGER TRAP (CLASS, CODE)
@BOX 2.0
EXTERNAL INTERRUPT?
@BOX 3.0
RESTART
[SUP02.1]
@BOX 4.0
RETURN FROM TRAP
@BOX 5.0
END
@BOX 1.1
PROC FM.TRAP (CLASS, CODE);
@BOX 2.1
IF CLASS = 3
@BOX 3.1
-> RESTART.LABEL;
@BOX 4.1
RETURN.FROM.TRAP ();
@BOX 5.1
END
@END

@TITLE SUP02.1.2(1,11)

@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
CALL COMMAND
@BOX 2.0
CALL REQUIRED SYSTEM COMMAND
@BOX 3.0
END
@BOX 1.1
:: CALL COMMAND
BEGIN
INTEGER I;
ADDR [LOGICAL8] F.NAME, N.NAME;
LITERAL / ADDR [LOGICAL8] NIL.BYTES =;
@BOX 2.1
-1 => I;
WHILE 1 +> I < 8 AND
      FILE.NAME [I] = 0 DO OD;
PART (^FILE.NAME, I, 7) => F.NAME;
-1 => I;
WHILE 1 +> I < 8 AND
      VAR1.NAME [I] = 0 DO OD;
PART (^VAR1.NAME, I, 7) => N.NAME;
ALTERNATIVE INDEX FROM
   BEGIN
      OPEN.FILE (F.NAME, R.USER, -1, VAR1);
      PW1 => SEGMENT.NO;
   END
   BEGIN
      FILE (F.NAME, R.USER, SAVED.PW1);
      PW0 => SAVED.PW0;
      RELEASE.SEGMENT (SAVED.PW1);
      SAVED.PW0 => PW0;
   END
   DELETE.FILE (F.NAME, R.USER);
   RENAME.FILE (F.NAME, R.USER, N.NAME);
   BEGIN
      CATALOGUE.FILES (NIL.BYTES, 0);
      PW2 => SEGMENT.NO;
      %1E => VAR1;
   END
   PERMIT (F.NAME, VAR2, VAR1, 0);
   BEGIN
      CATALOGUE.PERMIT (NIL.BYTES, 0);
      PW2 => SEGMENT.NO;
      %1E => VAR1;
   END
END
IF PW0 /= 0 THEN
   0 => SEGMENT.NO;
FI
@BOX 3.1
END
@END


