Function: erc-server-delayed-check-reconnect

erc-server-delayed-check-reconnect is a byte-compiled function defined in erc-backend.el.gz.

Signature

(erc-server-delayed-check-reconnect BUFFER)

Documentation

Wait for internet connectivity before trying to reconnect.

Expect BUFFER to be the server buffer for the current connection.

Source Code

;; Defined in /usr/src/emacs/lisp/erc/erc-backend.el.gz
;; This may appear to hang at various places.  It's assumed that when
;; *Messages* contains "Waiting for socket ..."  or similar, progress
;; will be made eventually.

(defun erc-server-delayed-check-reconnect (buffer)
  "Wait for internet connectivity before trying to reconnect.
Expect BUFFER to be the server buffer for the current connection."
  (when (buffer-live-p buffer)
    (with-current-buffer buffer
      (setq erc--server-reconnect-timeout
            (funcall erc--server-reconnect-timeout-scale-function
                     (or erc--server-reconnect-timeout
                         erc-server-reconnect-timeout)))
      (let* ((reschedule (lambda (proc)
                           (when (buffer-live-p buffer)
                             (with-current-buffer buffer
                               (let ((erc-server-reconnect-timeout
                                      erc--server-reconnect-timeout))
                                 (delete-process proc)
                                 (erc-display-message nil 'error buffer
                                                      "Nobody home...")
                                 (erc-schedule-reconnect buffer 0))))))
             (conchk-exp (time-add erc--server-reconnect-timeout-check
                                   (current-time)))
             (conchk-timer nil)
             (conchk (lambda (proc)
                       (let ((status (process-status proc))
                             (xprdp (time-less-p conchk-exp (current-time))))
                         (when (or (not (eq 'connect status)) xprdp)
                           (cancel-timer conchk-timer))
                         (when (buffer-live-p buffer)
                           (cond (xprdp (erc-display-message
                                         nil 'error buffer
                                         "Timed out while dialing...")
                                        (delete-process proc)
                                        (funcall reschedule proc))
                                 ((eq 'failed status)
                                  (funcall reschedule proc)))))))
             (sentinel (lambda (proc event)
                         (pcase event
                           ("open\n"
                            (run-at-time nil nil #'send-string proc
                                         (format "PING %d\r\n"
                                                 (time-convert nil 'integer))))
                           ((or "connection broken by remote peer\n"
                                (rx bot "failed"))
                            (run-at-time nil nil reschedule proc)))))
             (filter (lambda (proc _)
                       (delete-process proc)
                       (with-current-buffer buffer
                         (setq erc--server-reconnect-timeout nil))
                       (run-at-time nil nil #'erc-server-delayed-reconnect
                                    buffer))))
        (condition-case _
            (let ((proc (funcall erc-session-connector
                                 "*erc-connectivity-check*" nil
                                 erc-session-server erc-session-port
                                 :nowait t)))
              (setq conchk-timer (run-at-time 1 1 conchk proc))
              (set-process-filter proc filter)
              (set-process-sentinel proc sentinel))
          (file-error (funcall reschedule nil)))))))