;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for System version 123.263
;;; Reason:
;;;  For the FTP File Access method, I created a nifty macro (fs:handling-file-errors)
;;;  which is similar, but more powerful than (fs:file-operation-retry).  Wrapped
;;;  around file operations, it gives you a chance to try again if network lossage
;;;  occurs (broken connections, etc.)  QFILE is sadly lacking -- any sort of
;;;  connection screwup, and you must abort out (unless you C-M-R from the right
;;;  frame in the EH...)  Replacing a number of calls to (file-operation-retry)
;;;  in QFILE with (handling-file-errors) did wonders...having the file server
;;;  die in the middle of a lengthy make-system is no longer a big deal.
;;; Written 7-May-88 04:29:26 by pld at site Gigamos Cambridge
;;; while running on Azathoth from band 3
;;; with Experimental System 123.262, Experimental Local-File 73.5, Experimental FILE-Server 22.4, Experimental Unix-Interface 11.0, Experimental KERMIT 34.3, Experimental ZMail 71.2, Experimental Lambda-Diag 15.0, Experimental Tape 22.4, microcode 1756, SDU Boot Tape 3.14, SDU ROM 8, the old ones.



; From file DJ: L.IO.FILE; ACCESS.LISP#37 at 7-May-88 04:33:44
#10R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: IO; FILE; ACCESS  "

(defmacro handling-file-errors ((error-p) &body body)
  (let ((tag (gensym))
	(error (gensym)))
    `(condition-case-if (not ,error-p) (,error)
	 (condition-resume-if ,error-p '((file-error remote-network-error)
					 :retry-file-operation t
					 ("Retry the operation on the same file.")
					 (lambda (ignore) (throw ',tag nil)))
	   (block ,tag
	     (loop
	       (catch ',tag
		 (return-from ,tag
		   (progn ,@body))))))
       (file-error ,error))))

))

; From file DJ: L.IO.FILE; ACCESS.LISP#37 at 7-May-88 04:34:07
#10R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: IO; FILE; ACCESS  "

(DEFMETHOD (BASIC-ACCESS :PROPERTIES) (PATHNAME ERROR-P)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (LET ((DIR (SEND SELF :DIRECTORY-LIST PATHNAME (IF ERROR-P '(:DELETED)
						     '(:NOERROR :DELETED)))))
      (IF (CONSP DIR)
	  (IF (CADR DIR)
	      (VALUES (CADR DIR) (GET (CAR DIR) :SETTABLE-PROPERTIES))
	    ;; It is possible for a nonexistent file to give no error
	    ;; but just return an empty directory.
	    (LET ((CONDITION (MAKE-CONDITION 'FILE-NOT-FOUND "~A" PATHNAME :PROPERTIES)))
	      (SEND CONDITION :SET-FORMAT-ARGS
		    (LIST (FORMAT NIL "File not found for ~A" PATHNAME)))
	      (IF ERROR-P (SIGNAL-CONDITION :PROCEED-TYPES ())
		CONDITION)))
	DIR))))

))

; From file DJ: L.IO.FILE; ACCESS.LISP#37 at 7-May-88 04:34:29
#10R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: IO; FILE; ACCESS  "

(DEFMETHOD (DIRECTORY-STREAM-ACCESS-MIXIN :DIRECTORY-LIST) (PATHNAME OPTIONS &AUX DIR-LIST)
  (HANDLING-FILE-ERRORS ((NOT (MEMQ :NOERROR OPTIONS)))
    (WITH-OPEN-STREAM (STREAM (SEND SELF :DIRECTORY-STREAM PATHNAME (REMQ ':SORTED OPTIONS)))
      (IF (ERRORP STREAM) STREAM
	(SETQ DIR-LIST
	      (LET ((PATHNAME (SEND STREAM :PATHNAME)))
		(LOOP AS ENTRY = (SEND SELF :READ-DIRECTORY-STREAM-ENTRY STREAM PATHNAME options)
		      UNTIL (NULL ENTRY)
		      COLLECTING ENTRY)))
	(IF (MEMQ :SORTED OPTIONS)
	    (LET ((NULL-ELEM (ASSQ NIL DIR-LIST)))
	      (AND NULL-ELEM (SETQ DIR-LIST (DELQ NULL-ELEM DIR-LIST)))
	      (SETQ DIR-LIST (SORTCAR DIR-LIST #'PATHNAME-LESSP))
	      (AND NULL-ELEM (PUSH NULL-ELEM DIR-LIST))))
	DIR-LIST))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:35:11
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN DELETE-CHAOS (ACCESS PATHNAME ERROR-P &AUX HOST-UNIT PKT SUCCESS STRING)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (SETQ HOST-UNIT (SEND ACCESS :GET-HOST-UNIT))
    (UNWIND-PROTECT 
	(PROGN
	  (MULTIPLE-VALUE-SETQ (PKT SUCCESS STRING)
	    (SEND HOST-UNIT :COMMAND NIL NIL NIL "Delete" "DELETE" #/NEWLINE
		  (FILE-PRINT-PATHNAME PATHNAME) #/NEWLINE))
	  (OR SUCCESS
	      (QFILE-PROCESS-ERROR-NEW STRING PATHNAME NIL (NOT ERROR-P) :DELETE)))
      (AND PKT (CHAOS:RETURN-PKT PKT)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:35:26
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN RENAME-CHAOS (ACCESS OLD-PATHNAME NEW-PATHNAME ERROR &AUX PKT SUCCESS STRING)
  (DECLARE (VALUES TRUENAME OLD-TRUENAME))
  (HANDLING-FILE-ERRORS (ERROR)
    (LET ((HOST-UNIT (SEND ACCESS :GET-HOST-UNIT)))
      (UNWIND-PROTECT
	  (PROGN (MULTIPLE-VALUE-SETQ (PKT SUCCESS STRING)
		   (SEND HOST-UNIT :COMMAND NIL NIL NIL "Rename" "RENAME" #/NEWLINE
			 (FILE-PRINT-PATHNAME OLD-PATHNAME) #/NEWLINE
			 (FILE-PRINT-PATHNAME NEW-PATHNAME) #/NEWLINE))
		 (IF SUCCESS
		     ;; If there is a second line coming from the file server,
		     ;; it is the new truename.
		     (let* ((from (string-search-char #/newline string)) truename)
		       (if (null from) (values new-pathname old-pathname)
			 (let* ((old (string-search-char #/newline string from))
				(host (send old-pathname :host)))
			   (setq truename (parse-pathname string host nil (1+ from) old))
			   (if (null old) (values truename old-pathname)
			     (values truename
				     (fs:parse-pathname string host nil (1+ old)))))))
		   (QFILE-PROCESS-ERROR-NEW STRING OLD-PATHNAME NIL (NOT ERROR) :RENAME)))
      (AND PKT (CHAOS:RETURN-PKT PKT))))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:35:36
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN CHANGE-PROPERTIES-CHAOS (ACCESS PATHNAME ERROR-P PROPERTIES
				&AUX HOST-UNIT PKT SUCCESS STRING)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (SETQ HOST-UNIT (SEND ACCESS :GET-HOST-UNIT))
    (SETQ STRING (CHANGE-PROPERTIES-STRING PROPERTIES PATHNAME))
    (UNWIND-PROTECT
	(PROGN
	  (MULTIPLE-VALUE-SETQ (PKT SUCCESS STRING)
	    (SEND HOST-UNIT :COMMAND NIL NIL NIL "Change Properties" STRING))
	  (UNLESS SUCCESS
	    (QFILE-PROCESS-ERROR-NEW STRING PATHNAME NIL (NOT ERROR-P) :CHANGE-PROPERTIES)))
      (AND PKT (CHAOS:RETURN-PKT PKT)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:35:45
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN CREATE-LINK-CHAOS (ACCESS LINK LINK-TO ERROR-P &AUX HOST-UNIT PKT SUCCESS STRING)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (SETQ HOST-UNIT (SEND ACCESS :GET-HOST-UNIT))
    (UNWIND-PROTECT
	(PROGN
	  (MULTIPLE-VALUE-SETQ (PKT SUCCESS STRING)
	    (SEND HOST-UNIT :COMMAND NIL NIL NIL "Create Link" "CREATE-LINK" #/NEWLINE
		  (FILE-PRINT-PATHNAME LINK) #/NEWLINE
		  (FILE-PRINT-PATHNAME LINK-TO)))
	  (UNLESS SUCCESS
	    (QFILE-PROCESS-ERROR-NEW STRING LINK NIL (NOT ERROR-P) :CREATE-LINK)))
      (AND PKT (CHAOS:RETURN-PKT PKT)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:35:53
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN DIRECTORY-OPERATION-CHAOS (OPERATION ACCESS PATHNAME ERRORP WHOSTATE
				  &AUX HOST-UNIT PKT SUCCESS FILE-STRING)
  (HANDLING-FILE-ERRORS (ERRORP)
    (SETQ HOST-UNIT (SEND ACCESS :GET-HOST-UNIT))
    (UNWIND-PROTECT
	(PROGN
	  (MULTIPLE-VALUE-SETQ (PKT SUCCESS FILE-STRING)
	    (SEND HOST-UNIT :COMMAND NIL NIL NIL WHOSTATE
		  (STRING OPERATION) #/NEWLINE
		  (FILE-PRINT-DIRECTORY PATHNAME) #/NEWLINE))
	  (COND (SUCCESS
		 (LET ((START (QFILE-CHECK-COMMAND (STRING OPERATION) FILE-STRING)))
		   (VALUES (PARSE-NUMBER FILE-STRING START))))
		(T
		 (QFILE-PROCESS-ERROR-NEW FILE-STRING PATHNAME NIL (NOT ERRORP) OPERATION))))
      (AND PKT (CHAOS:RETURN-PKT PKT)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:36:34
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN OPEN-CHAOS (ACCESS FILE PATHNAME &REST OPTIONS
		   &KEY (DIRECTION :INPUT)
		   	(CHARACTERS T)
			(ERROR T)
			(ELEMENT-TYPE 'STRING-CHAR ELEMENT-TYPE-P)
			(IF-EXISTS nil if-exists-p)
			(IF-DOES-NOT-EXIST nil if-does-not-exist-p)
			(BYTE-SIZE :DEFAULT)
			MOBY-MAPPED
		   &ALLOW-OTHER-KEYS
		   &AUX HOST-UNIT DATA-CONN PKT NOT-ABORTED
		        PHONY-CHARACTERS SIGN-EXTEND-BYTES
			(DEFAULT-CONS-AREA SYS:BACKGROUND-CONS-AREA))
  (SETQ PATHNAME (FS:PARSE-PATHNAME PATHNAME))
  (IF IF-EXISTS-P
      (CHECK-TYPE IF-EXISTS (MEMBER :ERROR :NEW-VERSION :RENAME :RENAME-AND-DELETE
				    :OVERWRITE :APPEND :TRUNCATE :SUPERSEDE NIL))
    (SETQ IF-EXISTS (IF (MEMQ (PATHNAME-VERSION PATHNAME)
			      ;; :UNSPECIFIC here is to prevent lossage
			      ;; writing ITS files with no version numbers.
			      '(:NEWEST :UNSPECIFIC))
			:NEW-VERSION :ERROR)))
  (IF IF-DOES-NOT-EXIST-P
      (CHECK-TYPE IF-DOES-NOT-EXIST (MEMBER :ERROR :CREATE NIL))
    (SETQ IF-DOES-NOT-EXIST
	  (COND ((MEMQ DIRECTION '(:PROBE :PROBE-LINK :PROBE-DIRECTORY))
		 NIL)
		((AND (EQ DIRECTION :OUTPUT)
		      (NOT (MEMQ IF-EXISTS '(:OVERWRITE :TRUNCATE :APPEND))))
		 :CREATE)
		;; Note: if DIRECTION is NIL, this defaults to :ERROR
		;; for compatibility with the past.
		;; A Common-Lisp program would use :PROBE
		;; and get NIL as the default for this.
		(T :ERROR))))
  (ECASE DIRECTION
    ((:INPUT :OUTPUT :PROBE-DIRECTORY :PROBE-LINK))
    (:IO (FERROR "Bidirectional file streams are not yet supported."))
    ((NIL :PROBE) (SETQ DIRECTION NIL)))
  ;; IF-EXISTS-P is T if we need to give the IF-EXISTS to the server.
  (SETQ IF-EXISTS-P
	(NOT (MEMQ IF-EXISTS
		   (CASE (PATHNAME-VERSION PATHNAME)
		     (:NEWEST '(:NEW-VERSION))
		     (:UNSPECIFIC '(:NEW-VERSION :SUPERSEDE))))))
  (WHEN ELEMENT-TYPE-P
    (SETF (VALUES CHARACTERS BYTE-SIZE PHONY-CHARACTERS SIGN-EXTEND-BYTES)
	  (DECODE-ELEMENT-TYPE ELEMENT-TYPE BYTE-SIZE)))
  (flet ((make-stream (string)
	   (LET ((PROPERTIES (READ-FILE-PROPERTY-LIST-STRING STRING "OPEN" PATHNAME)))
	     (AND (EQ CHARACTERS :DEFAULT)
		  (SETQ CHARACTERS (GETF PROPERTIES :CHARACTERS)))
	     (UNLESS (OR (EQ BYTE-SIZE :DEFAULT)
			 (GETF PROPERTIES :BYTE-SIZE))
	       (SETF (GETF PROPERTIES :BYTE-SIZE) BYTE-SIZE))
	     (PROG1
	       (cond (moby-mapped
		      (open-chaos-moby-mapped host-unit properties string))  ;defined in moby stuff.
		     (t
		      (MAKE-INSTANCE (CASE DIRECTION
				(:INPUT
				 (IF CHARACTERS
				     'QFILE-INPUT-CHARACTER-STREAM
				   (COND (SIGN-EXTEND-BYTES
					  'QFILE-INPUT-SIGNED-BINARY-STREAM)
					 (PHONY-CHARACTERS
					  'QFILE-INPUT-PHONY-CHARACTER-STREAM)
					 (T
					  'QFILE-INPUT-BINARY-STREAM))))
				(:OUTPUT
				 (IF CHARACTERS
				     'QFILE-OUTPUT-CHARACTER-STREAM
				   (IF PHONY-CHARACTERS
				       'QFILE-OUTPUT-PHONY-CHARACTER-STREAM
				     'QFILE-OUTPUT-BINARY-STREAM)))
				(T 'QFILE-PROBE-STREAM))
			      :HOST-UNIT HOST-UNIT
			      :DATA-CONNECTION DATA-CONN
			      :PROPERTY-LIST PROPERTIES
			      :PATHNAME PATHNAME)))
	       (SETQ NOT-ABORTED T))))
	 (data-connection-handle ()
	   (CASE DIRECTION
	     (:INPUT (DATA-INPUT-HANDLE DATA-CONN))
	     (:OUTPUT (DATA-OUTPUT-HANDLE DATA-CONN)))))
    (HANDLING-FILE-ERRORS (ERROR)
      (PROGN (IF (or moby-mapped (MEMQ DIRECTION '(NIL :PROBE-DIRECTORY :PROBE-LINK)))
		   ;; PROBE mode implies no need for data connection
		     (SETQ HOST-UNIT (SEND ACCESS :GET-HOST-UNIT))
		   (MULTIPLE-VALUE (DATA-CONN HOST-UNIT)
		     (SEND ACCESS :GET-DATA-CONNECTION DIRECTION)))
	     (UNWIND-PROTECT
		 (let ((success nil) (string nil))
		   (MULTIPLE-VALUE (PKT SUCCESS STRING)
		     (lexpr-send access :open-command host-unit (data-connection-handle)
				 file characters byte-size direction
				 if-exists if-exists-p if-does-not-exist options))
		   (SETQ STRING (STRING-APPEND STRING))
		   (AND PKT (CHAOS:RETURN-PKT PKT))
		   (COND ((NOT SUCCESS)
			  (SETQ NOT-ABORTED T)
			  (OR (NULL DATA-CONN)
			      (SETF (DATA-STREAM DATA-CONN DIRECTION) NIL))
			  (CONDITION-CASE-IF (NOT IF-DOES-NOT-EXIST)
					     ()
			      (CONDITION-CASE-IF (NOT IF-EXISTS)
						 ()
				  (QFILE-PROCESS-ERROR-NEW STRING PATHNAME NIL (NOT ERROR) :OPEN)
				(FILE-ALREADY-EXISTS NIL))
			    (FILE-NOT-FOUND NIL)))
			 (T (make-stream string))))
	       ;; cleanup forms of the unwind-protect
	       (UNLESS (OR NOT-ABORTED
			   (NULL DATA-CONN)
			   (NULL (SEND HOST-UNIT :CONTROL-CONNECTION)))
		 ;; Here if aborted out of it and server may have file open.
		 (CONDITION-CASE ()
		     (PROGN
		      (when (EQ DIRECTION :OUTPUT)
			(let ((pkt (SEND HOST-UNIT :COMMAND NIL (DATA-OUTPUT-HANDLE DATA-CONN) NIL "Delete"
					 "DELETE")))
			  (and pkt (chaos:return-pkt pkt))))
		      (multiple-value-bind (pkt success ignore)
			  (SEND HOST-UNIT :COMMAND NIL (data-connection-handle) NIL "Close" "CLOSE")
			(and pkt (chaos:return-pkt pkt))
			(WHEN success
			  (CASE DIRECTION
			    (:INPUT (READ-UNTIL-SYNCHRONOUS-MARK (DATA-CONNECTION DATA-CONN)))
			    (:OUTPUT (CHAOS:SEND-PKT (DATA-CONNECTION DATA-CONN)
						     (CHAOS:GET-PKT) %QFILE-SYNCHRONOUS-MARK-OPCODE)))))
		      (SEND HOST-UNIT :FREE-DATA-CONNECTION DATA-CONN DIRECTION))
		   (SYS:HOST-STOPPED-RESPONDING NIL))))))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:36:49
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFUN DIRECTORY-CHAOS (ACCESS PATHNAME OPTIONS
			&AUX (NO-ERROR-P NIL) (DELETED-P NIL) (FAST-P NIL) (DIRS-ONLY-P NIL)
			     (NO-EXTRA-INFO NIL) (SORTED-P NIL))
  (DO ((L OPTIONS (CDR L)))
      ((NULL L))
    (CASE (CAR L)
      (:NOERROR (SETQ NO-ERROR-P T))
      (:FAST (SETQ FAST-P T))
      (:NO-EXTRA-INFO
       (WHEN (NOT (TYPEP (SEND ACCESS :HOST) 'FS:UNIX-HOST))
	 (SETQ NO-EXTRA-INFO T)))
      (:SORTED (SETQ SORTED-P T))
      ;; This is for the :ALL-DIRECTORIES message
      (:DIRECTORIES-ONLY (SETQ DIRS-ONLY-P T))
      (:DELETED (SETQ DELETED-P T))
      (OTHERWISE (FERROR NIL "~S is not a known DIRECTORY option" (CAR L)))))
  (HANDLING-FILE-ERRORS ((NOT NO-ERROR-P))
    (MAKE-FILE-PROPERTY-LIST-STREAM-CHAOS ACCESS "DIRECTORY" "Directory"
      (FILE-PRINT-PATHNAME PATHNAME)
      (FORMAT NIL "~:[~; DELETED~]~:[~; FAST~]~:[~; DIRECTORIES-ONLY~]~:[~; NO-EXTRA-INFO~]~
		   ~:[~; SORTED~]"
	      DELETED-P FAST-P DIRS-ONLY-P NO-EXTRA-INFO SORTED-P)
      PATHNAME NO-ERROR-P)))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:37:06
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFMETHOD (QFILE-DATA-STREAM-MIXIN :DELETE) (&OPTIONAL (ERROR-P T) &AUX SUCCESS STRING)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (CASE STATUS
      ((:OPEN :EOF :SYNC-MARKED :ASYNC-MARKED)
       (MULTIPLE-VALUE (STRING SUCCESS)
	 (SEND SELF :COMMAND NIL "Delete" "DELETE"))
       (OR SUCCESS
	   (QFILE-PROCESS-ERROR-NEW STRING SELF NIL (NOT ERROR-P) :DELETE)))
      (OTHERWISE (FERROR NIL "~S in illegal state for delete." SELF)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:37:17
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFMETHOD (QFILE-DATA-STREAM-MIXIN :RENAME) (NEW-NAME &OPTIONAL (ERROR-P T)
					     &AUX SUCCESS STRING)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (CASE STATUS
      ((:OPEN :EOF :SYNC-MARKED :ASYNC-MARKED)
       (MULTIPLE-VALUE (STRING SUCCESS)
	 (SEND SELF :COMMAND NIL "Rename"
				 "RENAME" #/NEWLINE
				  (FILE-PRINT-PATHNAME NEW-NAME) #/NEWLINE))
       (COND (SUCCESS
	      ;; If there is a second line coming from the file server,
	      ;; it is the new truename.
	      (LET* ((FROM (STRING-SEARCH #/NEWLINE STRING)))
		(WHEN FROM
		  (send self :putprop (fs:parse-pathname
					string
					(send (get self :truename) :host) nil
					(1+ from) (string-search #/newline string (1+ from)))
			:truename)))
	      (SETQ PATHNAME NEW-NAME)
	      (SEND TV::WHO-LINE-FILE-STATE-SHEET :CLOBBERED)
	      T)
	     (T (QFILE-PROCESS-ERROR-NEW STRING SELF NIL (NOT ERROR-P) :RENAME))))
      (OTHERWISE (FERROR NIL "~S in illegal state for rename." SELF)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:37:26
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFMETHOD (QFILE-DATA-STREAM-MIXIN :CHANGE-PROPERTIES)
	   (ERROR-P &REST PROPERTIES &AUX SUCCESS STRING)
  (HANDLING-FILE-ERRORS (ERROR-P)
    (CASE STATUS
      ((:OPEN :EOF :SYNC-MARKED :ASYNC-MARKED)
       (MULTIPLE-VALUE (STRING SUCCESS)
	 (SEND SELF :COMMAND NIL "Change Properties"
	       		      (CHANGE-PROPERTIES-STRING PROPERTIES)))
       (OR SUCCESS
	   (QFILE-PROCESS-ERROR-NEW STRING SELF NIL (NOT ERROR-P) :CHANGE-PROPERTIES)))
      (OTHERWISE (FERROR NIL "~S in illegal state for change properties." SELF)))))

))

; From file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:37:56
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFMETHOD (BASIC-QFILE-ACCESS :MULTIPLE-FILE-PLISTS) (FILES OPTIONS)
  (HANDLING-FILE-ERRORS (T)
    (MULTIPLE-PLISTS-CHAOS SELF FILES OPTIONS)))

))

; From modified file DJ: L.NETWORK.CHAOS; QFILE.LISP#380 at 7-May-88 04:39:56
#8R FILE-SYSTEM#: #!:ZL
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "FILE-SYSTEM")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; CHAOS; QFILE  "

(DEFMETHOD (QFILE-STREAM-MIXIN :PROPERTIES) (&OPTIONAL (ERROR-P T))
  (HANDLING-FILE-ERRORS (ERROR-P)
    (IF (EQ STATUS :CLOSED)
	(PROPERTIES-CHAOS (SEND HOST-UNIT :ACCESS) :FILE (SEND SELF :TRUENAME) ERROR-P)
      (PROPERTIES-CHAOS (SEND HOST-UNIT :ACCESS) :STREAM SELF ERROR-P))))

))
