Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / lup-network.mud
diff --git a/mim/development/mim/vax/mimlib/lup-network.mud b/mim/development/mim/vax/mimlib/lup-network.mud
new file mode 100644 (file)
index 0000000..b5677a0
--- /dev/null
@@ -0,0 +1,77 @@
+;"*****************************************************************************
+
+  This file defines library update primitives for use with a network library.
+  See PROTOCOLS.FORMAT for definition of server protocols. This file is
+  spliced into LUP (vax version).
+
+  LUP-NETWORK.MUD: EDIT HISTORY          Machine Dependent (For use under UNIX)
+
+  COMPILATION: Spliced in at compile time.
+
+  JUN84    [Shane] - Created.
+  18OCT84  [Shane] - Commented, cleaned up.
+  27OCT84  [Shane] - New protocols.
+  ****************************************************************************"
+
+;"NET-FILE-COPY --
+  Effect:   Copies FROM to remote server. CNTL is the control connection,
+           used to send the file length and receive the acknowledgement.
+           DATA is the data connection over which the file is transmitted.
+  Modifies: FROM, DATA, CNTL
+  Returns:  T if transfer acknowledged, FALSE otherwise.
+  Requires: DATA, CNTL are open to server awaiting file transaction."
+
+<DEFINE NET-FILE-COPY (FROM:<CHANNEL 'DISK>
+                      DATA:<CHANNEL 'NETWORK> CNTL:<CHANNEL 'NETWORK>
+                      "AUX" (U:UVECTOR <STACK <UVECTOR <FILE-LENGTH .FROM>>>))
+   <CHANNEL-OP .CNTL WRITE-BUFFER .U>
+   <REPEAT ((BUFFER:STRING <STACK <ISTRING ,MAXSTRS>>) AMOUNT:FIX)
+      <SET AMOUNT <OR <CHANNEL-OP .FROM READ-BUFFER .BUFFER> 0>>
+      <COND (<==? .AMOUNT 0>
+            <RETURN <AND <GET-REMOTE-RESPONSE .CNTL .U> <==? <1 .U> ,ACK>>>)
+           (T
+            <CHANNEL-OP .DATA WRITE-BUFFER .BUFFER .AMOUNT>)>>>
+\f
+;"REMOTE-UPDATE --
+  Effect:   Add the module represented by RECORD and associated FILES to
+           remote library LIBC.
+  Modifies: LIBC
+  Returns:  T if update is successful, otherwise FALSE.
+  Requires: LIBC is channel open to server processing file request. RECORD
+           is properly formatted library record as defined in LIBRARY.FORMAT.
+           The order of the file spec vectors (see SEARCH in ABSTR) in FILES
+           is the same as the order of the file names in RECORD (i.e. MSUBR,
+           MUD, ABSTR, DOC), with FALSE indicating omission."
+
+<DEFINE REMOTE-UPDATE (RECORD:UVECTOR LIBC:<CHANNEL 'NETWORK>
+                      "TUPLE" FILES:<PRIMTYPE VECTOR>)
+   <PROG ((U:UVECTOR <STACK <IUVECTOR 4>>) (OUTCHAN:CHANNEL .OUTCHAN)
+         DATA:<OR <CHANNEL 'NETWORK> FALSE> FROM:<OR <CHANNEL 'DISK> FALSE>)
+      ;"Request update, send data address, connect data channel."
+      <CHANNEL-OP .LIBC WRITE-BUFFER <1 .U ,UPDATE-ADD> 1>
+      <CHANNEL-OP .LIBC WRITE-BUFFER .RECORD <LHALF <1 .RECORD>>>
+      <CHANNEL-OP .LIBC LISTEN-ON-DATA>
+      <CHANNEL-OP .LIBC GET-DATA-ADDRESS <CHTYPE .U NET-ADDRESS>>
+      <CHANNEL-OP .LIBC WRITE-BUFFER .U>
+      <COND (<NOT <SET DATA <CHANNEL-OP .LIBC CONNECT-DATA-CHANNEL>>>
+            <ERROR CANT-OPEN-DATA-CONNECTION!-ERRORS
+                    <SYS-ERR "" .DATA %<>> REMOTE-UPDATE>
+            <RETURN %<>>)>
+      ;"Copy files."
+      <MAPF %<>
+           <FUNCTION (FN:<OR <VECTOR [5 STRING]> FALSE>)
+              <COND (.FN
+                     <PRINTSTRING "Copying ">
+                     <PRINTSTRING <1 .FN>>
+                     <CRLF>
+                     <COND (<NOT <SET FROM <CHANNEL-OPEN DISK <1 .FN> "READ">>>
+                            <ERROR FILE-NOT-FOUND!-ERRORS
+                                   <1 .FN> .FROM REMOTE-UPDATE>
+                            <RETURN %<>>)
+                           (<NOT <NET-FILE-COPY .FROM .DATA .LIBC>>
+                            <CHANNEL-OP .LIBC CLOSE-DATA-CHANNEL>
+                            <CLOSE .FROM>
+                            <RETURN %<>>)>)>>
+           .FILES>
+      <CHANNEL-OP .LIBC CLOSE-DATA-CHANNEL>
+      <AND <GET-REMOTE-RESPONSE .LIBC .U> <==? <1 .U> ,ACK>>>>