(defun erc-process-sentinel-1 (event) "Finish what erc-process-sentinel started. Return nil if server buffer is still alive, or t if it has been killed." (cond ((and (string= event "exited abnormally with code 256\n") (not quitting)) ;; Sometimes (eg on a /LIST command) ERC happens to die with ;; an exit code 256. The icrii client also shows this behavior ;; and it restarts itself. So do I. (erc-display-message nil 'error (current-buffer) (if erc-auto-reconnect 'disconnected 'disconnected-noreconnect)) (erc-update-mode-line) (setq erc-active-buffer (current-buffer)) (setq last-sent-time 0) (setq erc-lines-sent 0) (if erc-auto-reconnect (erc erc-session-server erc-session-port current-nick erc-session-user-full-name t erc-session-password) (erc-display-message nil 'error (current-buffer) (concat "\n\n*** ERC terminated: " event "\n"))) nil) (t ;; normal quit (erc-display-message nil 'error (current-buffer) "\n\n*** ERC finished ***\n") (if erc-kill-server-buffer-on-quit (progn (set-buffer-modified-p nil) (kill-buffer (current-buffer)) t) nil)))) (defun erc-process-sentinel (cproc event) "Sentinel function for ERC process." (erc-log (format "SENTINEL: proc: %S status: %S event: %S (quitting: %S)" erc-process (process-status erc-process) event quitting)) (save-excursion (set-buffer (process-buffer cproc)) (cond ((equal event "open\n") ;; newly opened connection for a nowait connection (erc-login)) ;; ((eq event 'failed))) ;; default to this (t (erc-with-all-buffers-of-server cproc nil (setq erc-connected nil)) (when erc-ping-handler (with-current-buffer (current-buffer) (progn (cancel-timer erc-ping-handler) (setq erc-ping-handler nil)))) (run-hook-with-args 'erc-disconnected-hook (erc-current-nick) (system-name) "") ;; If erc-process-sentinel-1 returns nil, it means that the ;; server buffer is still alive (when (not (erc-process-sentinel-1 event)) (set-buffer-modified-p nil) (erc-update-mode-line))))))