<<>> <> <> <> <> <> <> <> <<>> DIRECTORY PseudoTerminal USING [PseudoTerminal], Rope USING [ROPE], UnixTypes USING [FileDescriptor]; Plumber: CEDAR DEFINITIONS ~ { Wire: TYPE ~ REF WireRep ¬ NIL; -- Wire is here only for Conduit WireRep: TYPE ~ RECORD [ active: BOOLEAN ¬ FALSE, connectedTo: Rope.ROPE ¬ NIL, process: PROCESS ¬ NIL, result: REF ¬ NIL ]; <<-- Conduit should be opaque, but that makes reloading impossible, or requires that we add a private interface soley for the purpose of hiding Conduit. Fooey.>> Conduit: PUBLIC TYPE = REF ConduitRep; ConduitRep: PUBLIC TYPE = MONITORED RECORD [ closing: BOOLEAN ¬ FALSE, pty: PseudoTerminal.PseudoTerminal ¬ NIL, stdin: Wire, stdout: Wire, stderr: Wire, message: REF ]; SpawnResult: TYPE = RECORD [res: INT, errno: INT, details: REF]; Error: ERROR [code: ATOM, msg: Rope.ROPE]; Spawn: PROC [ command: Rope.ROPE, wd: Rope.ROPE, stdin: REF, stdout: REF, stderr: REF, exec: BOOL, tty: BOOL, debug: BOOL ¬ FALSE, noisy: BOOL ¬ FALSE, reportSourceFD: PROC[fd: UnixTypes.FileDescriptor] ¬ NIL ] RETURNS [SpawnResult]; <> <> <> <> <> <> <> <<>> <> <<>> SpawnWithConduit: PROC [ conduit: Conduit, command: Rope.ROPE, wd: Rope.ROPE, exec: BOOLEAN, tty: BOOLEAN, reportSourceFD: PROC[fd: UnixTypes.FileDescriptor] ¬ NIL ] RETURNS [SpawnResult]; MakeConduit: PROC [stdin, stdout, stderr: REF, debug:BOOL¬FALSE, noisy:BOOL¬ FALSE] RETURNS [Conduit]; Terminate: PROC [conduit: Conduit, reason: ATOM]; }.