;;; -*- Mode:Lisp; Readtable:T; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for Mailer version 2.1
;;; Reason:
;;;  Simplify MAIL server, add better error-catching macro that doesn't catch
;;;   CERROR (!).
;;; Written 3-Jul-86 19:17:26 by RpK (Robert P. Krajewski) at site LMI Cambridge
;;; while running on Lambda Four from band 2
;;; with System 110.232, Lambda-Diag 7.17, Experimental Local-File 68.7, FILE-Server 18.4, Unix-Interface 9.1, ZMail 65.14, Object Lisp 3.4, Tape 6.39, Site Data Editor 3.3, Tiger 24.0, KERMIT 31.3, Gateway 4.15, TCP-Kernel 39.7, TCP-User 62.7, TCP-Server 45.5, MEDIUM-RESOLUTION-COLOR 3.4, MICRO-COMPILATION-TOOLS 3.2, System Revision Level 3.94, Experimental Window-Maker 2.0, Experimental Mailer 2.0, microcode 1563, SDU Boot Tape 3.13, SDU ROM 102, Beta II, lmi-site.



; From modified file DJ: L.NETWORK.MAILER; MAIN.LISP#4 at 3-Jul-86 19:17:27
#10R MAILER#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "MAILER")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; MAILER; MAIN  "

(defmacro ignoring-errors (&body body)
  `(condition-call-if (not *debug-server*) (.condition.) (progn ,@body t)
     ((and (condition-typep .condition. 'error)
	   (not (or (send .condition. :debugging-condition-p)
		    (send .condition. :dangerous-condition-p)
		    (condition-typep .condition. 'cerror))))
      nil)))

))

; From modified file DJ: L.NETWORK.MAILER; CHAOS.LISP#5 at 3-Jul-86 19:18:09
#10R MAILER#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "MAILER")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; MAILER; CHAOS  "

(defun mail-server-chaos (&aux final-ok qfile)
  (let ((user-id "Mail-Server"))
    (ignoring-errors
      (as-mail-server (stream (chaos:open-stream nil "MAIL"))
	(send stream :add-as-server "MAIL")
	(ignoring-errors ; catch network lossage
	  (with-text-buffer (text stream)
	    (let ((recipients (expand-addresses (get-mail-recipients stream))))
	      (with-output-to-string (s text)
		(write-line (reception-line stream) s))
	      (get-mail-text stream text)
	      (finish-output stream)
	      (let ((result
		      (write-queue-file (setq qfile (qfile-name))
					recipients `(:failures 0
						     :source-network-type :chaos
						     :source-protocol :chaos-mail
						     :source-host ,(send stream :foreign-host))
					      TEXT STREAM)))
		(cond ((errorp result)
		       (setq final-ok ())
		       (if (probef qfile) (deletef qfile)))
		      (t
		       (setq final-ok :queued-ok))))))
	  (if final-ok (format stream "+Message sent successfully.~%"))
	  (force-output stream)))
	(when (and (eq final-ok :queued-ok)
		   (not *delay-delivery*))
	  (mail-deliver-qfile qfile)))))

))
