--- /dev/null
+<PACKAGE "PIPES">
+
+<RENTRY PIPE>
+
+<ENTRY GET-PIPE READ-DESC WRITE-DESC READ-SAFE-BUFFER>
+
+<USE "NEWSTRUC">
+
+<MSETG READ-DESC 1>
+<MSETG WRITE-DESC 2>
+
+<NEWSTRUC PIPE VECTOR
+ PIPE-IJFN <OR FIX FALSE>
+ PIPE-DEV <OR STRING FALSE>
+ PIPE-SNM FALSE
+ PIPE-NM1 FALSE
+ PIPE-NM2 FALSE
+ PIPE-DSN FALSE
+ PIPE-STATUS FIX
+ PIPE-OJFN <OR FIX FALSE>
+ PIPE-PIPE <UVECTOR [2 FIX]>
+ PIPE-BUF STRING>
+
+<COND (<NOT <GASSIGNED? NEW-CHANNEL-TYPE>>
+ <SETG NEW-CHANNEL-TYPE ,TIME>)>
+
+<NEW-CHANNEL-TYPE PIPE DEFAULT
+ OPEN PIPE-OPEN
+ CLOSE PIPE-CLOSE
+ READ-SAFE-BUFFER PIPE-READ-SAFE
+ READ-BUFFER PIPE-READ-BUFFER
+ READ-BYTE PIPE-READ-BYTE
+ WRITE-BUFFER PIPE-WRITE-BUFFER
+ WRITE-BYTE PIPE-WRITE-BYTE
+ GET-PIPE GET-PIPE>
+
+<SETG LEN-BUF <UVECTOR 0>>
+<GDECL (LEN-BUF) UVECTOR>
+
+<DEFINE PIPE-OPEN (STYPE OPER "TUPLE" STUFF "AUX" (PUV <UVECTOR 0 0>) RES)
+ #DECL ((PUV) UVECTOR (RES) <OR UVECTOR FALSE>)
+ <COND (<SET RES <CALL PIPE .PUV>>
+ <CHTYPE [<READ-DESC .PUV>
+ <> <> <> <> <> 0
+ <WRITE-DESC .PUV> .PUV " "] PIPE>)>>
+
+<DEFINE PIPE-CLOSE (CHANNEL OPER "OPTIONAL" (WHICH <>)
+ "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) JFN)
+ #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
+ <COND (.WHICH
+ <SET JFN <NTH <PIPE-PIPE .PIPE> .WHICH>>
+ <CALL SYSCALL CLOSE .JFN>
+ <COND (<==? .WHICH ,READ-DESC>
+ <PIPE-IJFN .PIPE <>>)
+ (<PIPE-OJFN .PIPE <>>)>)
+ (T
+ <COND (<PIPE-IJFN .PIPE><CALL SYSCALL CLOSE <PIPE-IJFN .PIPE>>)>
+ <COND (<PIPE-OJFN .PIPE><CALL SYSCALL CLOSE <PIPE-OJFN .PIPE>>)>)>>
+
+<DEFINE PIPE-READ-SAFE (CHANNEL OPER STRING "OPTIONAL" (LEN <LENGTH .STRING>)
+ "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES
+ (BUF ,LEN-BUF))
+ #DECL ((CHANNEL) CHANNEL (LEN) FIX (STRING) STRING (PIPE) PIPE
+ (BUF) UVECTOR)
+ <COND (<SET RES <CALL SYSCALL IOCTL <PIPE-IJFN .PIPE> ,FIONREAD .BUF>>
+ <SET LEN <MIN .LEN <1 .BUF> <LENGTH .STRING>>>
+ <COND (<G? .LEN 0>
+ <COND (<SET RES <CALL SYSCALL READ
+ <PIPE-IJFN .PIPE> .STRING .LEN>>
+ .RES)
+ (T .RES)>)
+ (0)>)>>
+
+<DEFINE PIPE-READ-BUFFER (CHANNEL OPER STRING "OPTIONAL" (LEN <LENGTH .STRING>)
+ "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
+ #DECL ((CHANNEL) CHANNEL (STRING) STRING (LEN) FIX (PIPE) PIPE)
+ <COND (<SET RES <ISYSCALL READ <PIPE-IJFN .PIPE> .STRING .LEN>>
+ .RES)
+ (T .RES)>>
+
+<DEFINE PIPE-READ-BYTE (CHANNEL OPER "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
+ #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
+ <COND (<SET RES <ISYSCALL READ <PIPE-IJFN .PIPE> <PIPE-BUF .PIPE> 1>>
+ <1 <PIPE-BUF .PIPE>>)
+ (T .RES)>>
+
+<DEFINE PIPE-WRITE-BUFFER (CHANNEL OPER BUF "OPTIONAL" (LEN <LENGTH .BUF>)
+ "AUX" (PIPE <CHANNEL-DATA .CHANNEL>) RES)
+ #DECL ((CHANNEL) CHANNEL (BUF) STRING (LEN) FIX (PIPE) PIPE)
+ <COND (<SET RES <CALL SYSCALL WRITE <PIPE-OJFN .PIPE> .BUF .LEN>>
+ .RES)
+ (T .RES)>>
+
+<DEFINE PIPE-WRITE-BYTE (CHANNEL OPER BYTE "AUX" (PIPE <CHANNEL-DATA .CHANNEL>)
+ RES (BUF <PIPE-BUF .PIPE>))
+ #DECL ((CHANNEL) CHANNEL (BYTE) CHARACTER (PIPE) PIPE (BUF) STRING)
+ <1 .BUF .BYTE>
+ <COND (<SET RES <CALL SYSCALL WRITE <PIPE-OFJN .PIPE> .BUF 1>>
+ .BYTE)
+ (T .RES)>>
+
+<DEFINE GET-PIPE (CHANNEL OPER "AUX" (PIPE <CHANNEL-DATA .CHANNEL>))
+ #DECL ((CHANNEL) CHANNEL (PIPE) PIPE)
+ <PIPE-PIPE .PIPE>>
+
+<ENDPACKAGE>