<<>> <> <> <> DIRECTORY Rope, SunRPC, MS, MSGetPut; MSGetPutImpl: CEDAR PROGRAM IMPORTS SunRPC EXPORTS MS, MSGetPut = BEGIN Handle: TYPE = SunRPC.Handle; ROPE: TYPE = Rope.ROPE; ReturnCodesNames: PUBLIC ARRAY MS.ReturnCodes OF ROPE _ [ "Success", "IllegalMaintainSpec", "CouldntRunProgram", "IllegalMaintainID" ]; GetReturnCodes: PUBLIC PROC[h: Handle] RETURNS [res: MS.ReturnCodes] = { res _ VAL[SunRPC.GetInt32[h]]; }; PutReturnCodes: PUBLIC PROC[h: Handle, in: MS.ReturnCodes] = { SunRPC.PutInt32[h, ORD[in]]; }; GetString: PUBLIC PROC[h: Handle] RETURNS [res: MS.String] = { res _ SunRPC.GetRope[h]; }; PutString: PUBLIC PROC[h: Handle, in: MS.String] = { SunRPC.PutRope[h, in]; }; GetMaintainargs: PUBLIC PROC[h: Handle] RETURNS [res: MS.Maintainargs] = { res.idStr _ SunRPC.GetRope[h]; res.progName _ SunRPC.GetRope[h]; { len: INT _ SunRPC.GetInt32[h]; res.progArgs _ NEW[MS.SeqType0Object[len]]; FOR i: INT IN [0..len) DO res.progArgs[i] _ GetString[h]; ENDLOOP; }; res.uid _ SunRPC.GetInt32[h]; res.pid _ SunRPC.GetInt32[h]; }; PutMaintainargs: PUBLIC PROC[h: Handle, in: MS.Maintainargs] = { SunRPC.PutRope[h, in.idStr]; SunRPC.PutRope[h, in.progName]; SunRPC.PutInt32[h, in.progArgs.size]; FOR i: INT IN [0..in.progArgs.size) DO PutString[h, in.progArgs[i]]; ENDLOOP; SunRPC.PutInt32[h, in.uid]; SunRPC.PutInt32[h, in.pid]; }; GetMaintainreturn: PUBLIC PROC[h: Handle] RETURNS [res: MS.Maintainreturn] = { tag: MS.ReturnCodes; tag _ GetReturnCodes[h]; SELECT tag FROM Success => { v: REF Success MS.MaintainreturnObject _ NEW[Success MS.MaintainreturnObject]; v.pid _ SunRPC.GetInt32[h]; res _ v; }; IllegalMaintainID => { v: REF IllegalMaintainID MS.MaintainreturnObject _ NEW[IllegalMaintainID MS.MaintainreturnObject]; res _ v; }; CouldntRunProgram => { v: REF CouldntRunProgram MS.MaintainreturnObject _ NEW[CouldntRunProgram MS.MaintainreturnObject]; res _ v; }; IllegalMaintainSpec => { v: REF IllegalMaintainSpec MS.MaintainreturnObject _ NEW[IllegalMaintainSpec MS.MaintainreturnObject]; res _ v; }; ENDCASE => NULL; }; PutMaintainreturn: PUBLIC PROC[h: Handle, in: MS.Maintainreturn] = { PutReturnCodes[h, in.returnCode]; SELECT in.returnCode FROM Success => { v: REF Success MS.MaintainreturnObject _ NARROW[in]; SunRPC.PutInt32[h, v.pid]; }; IllegalMaintainID => { v: REF IllegalMaintainID MS.MaintainreturnObject _ NARROW[in]; }; CouldntRunProgram => { v: REF CouldntRunProgram MS.MaintainreturnObject _ NARROW[in]; }; IllegalMaintainSpec => { v: REF IllegalMaintainSpec MS.MaintainreturnObject _ NARROW[in]; }; ENDCASE => NULL; }; GetUnmaintainargs: PUBLIC PROC[h: Handle] RETURNS [res: MS.Unmaintainargs] = { res.idStr _ SunRPC.GetRope[h]; }; PutUnmaintainargs: PUBLIC PROC[h: Handle, in: MS.Unmaintainargs] = { SunRPC.PutRope[h, in.idStr]; }; END.