This commit was generated by cvs2svn to compensate for changes in r4550,
[elisp/gnus.git-] / lisp / nntp.el
index 39c3dc5..d7665b5 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nntp.el --- nntp access for Gnus
-;;; Copyright (C) 1987-90,92-99 Free Software Foundation, Inc.
+;;; Copyright (C) 1987-90,92-97 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
@@ -85,8 +85,7 @@ case, this list will be used as the parameter list given to rsh.")
 (defvoo nntp-rlogin-user-name nil
   "*User name on remote system when using the rlogin connect method.")
 
-(defvoo nntp-telnet-parameters
-    '("exec" "telnet" "-8" "${NNTPSERVER:=news}" "nntp")
+(defvoo nntp-telnet-parameters '("exec" "telnet" "-8" "${NNTPSERVER:=news}" "nntp")
   "*Parameters to `nntp-open-telnet'.
 That function may be used as `nntp-open-connection-function'.  In that
 case, this list will be executed as a command after logging in
@@ -151,12 +150,6 @@ server there that you can connect to.  See also
 (defvoo nntp-warn-about-losing-connection t
   "*If non-nil, beep when a server closes connection.")
 
-(defvoo nntp-coding-system-for-read 'binary
-  "*Coding system to read from NNTP.")
-
-(defvoo nntp-coding-system-for-write 'binary
-  "*Coding system to write to NNTP.")
-
 (defcustom nntp-authinfo-file "~/.authinfo"
   ".netrc-like file that holds nntp authinfo passwords."
   :type
@@ -210,18 +203,8 @@ If this variable is nil, which is the default, no timers are set.")
 (defvoo nntp-server-xover 'try)
 (defvoo nntp-server-list-active-group 'try)
 
-(defvar nntp-async-needs-kluge
-  (string-match "^GNU Emacs 20\\.3\\." (emacs-version))
-  "*When non-nil, nntp will poll asynchronous connections
-once a second.  By default, this is turned on only for Emacs
-20.3, which has a bug that breaks nntp's normal method of
-noticing asynchronous data.")
-
-(defvar nntp-async-timer nil)
-(defvar nntp-async-process-list nil)
-
 (eval-and-compile
-  (autoload 'mail-source-read-passwd "mail-source")
+  (autoload 'nnmail-read-passwd "nnmail")
   (autoload 'open-ssl-stream "ssl"))
 
 \f
@@ -281,9 +264,9 @@ noticing asynchronous data.")
          (nntp-decode-text (not decode))
          (unless discard
            (save-excursion
-             (set-buffer buffer)
-             (goto-char (point-max))
-             (insert-buffer-substring (process-buffer process))
+             (set-buffer buffer)
+             (goto-char (point-max))
+             (insert-buffer-substring (process-buffer process))
              ;; Nix out "nntp reading...." message.
              (when nntp-have-messaged
                (setq nntp-have-messaged nil)
@@ -292,11 +275,6 @@ noticing asynchronous data.")
       (unless discard
        (erase-buffer)))))
 
-(defun nntp-kill-buffer (buffer)
-  (when (buffer-name buffer)
-    (kill-buffer buffer)
-    (nnheader-init-server-buffer)))
-
 (defsubst nntp-find-connection (buffer)
   "Find the connection delivering to BUFFER."
   (let ((alist nntp-connection-alist)
@@ -309,7 +287,8 @@ noticing asynchronous data.")
     (when process
       (if (memq (process-status process) '(open run))
          process
-       (nntp-kill-buffer (process-buffer process))
+       (when (buffer-name (process-buffer process))
+         (kill-buffer (process-buffer process)))
        (setq nntp-connection-alist (delq entry nntp-connection-alist))
        nil))))
 
@@ -340,7 +319,17 @@ noticing asynchronous data.")
        ((eq callback 'ignore)
        t)
        ((and callback wait-for)
-       (nntp-async-wait process wait-for buffer decode callback)
+       (save-excursion
+         (set-buffer (process-buffer process))
+         (unless nntp-inside-change-function
+           (erase-buffer))
+         (setq nntp-process-decode decode
+               nntp-process-to-buffer buffer
+               nntp-process-wait-for wait-for
+               nntp-process-callback callback
+               nntp-process-start-point (point-max)
+               after-change-functions
+               (list 'nntp-after-change-function-callback)))
        t)
        (wait-for
        (nntp-wait-for process wait-for buffer decode))
@@ -401,7 +390,7 @@ noticing asynchronous data.")
   (cond
    ;; A result that starts with a 2xx code is terminated by
    ;; a line with only a "." on it.
-   ((eq (char-after) ?2)
+   ((eq (following-char) ?2)
     (if (re-search-forward "\n\\.\r?\n" nil t)
        t
       nil))
@@ -480,68 +469,64 @@ noticing asynchronous data.")
 (deffoo nntp-retrieve-groups (groups &optional server)
   "Retrieve group info on GROUPS."
   (nntp-possibly-change-group nil server)
-  (when (nntp-find-connection-buffer nntp-server-buffer)
-    (save-excursion
-      ;; Erase nntp-sever-buffer before nntp-inhibit-erase.
-      (set-buffer nntp-server-buffer)
-      (erase-buffer)
-      (set-buffer (nntp-find-connection-buffer nntp-server-buffer))
-      ;; The first time this is run, this variable is `try'.  So we
-      ;; try.
-      (when (eq nntp-server-list-active-group 'try)
-       (nntp-try-list-active (car groups)))
-      (erase-buffer)
-      (let ((count 0)
-           (received 0)
-           (last-point (point-min))
-           (nntp-inhibit-erase t)
-           (command (if nntp-server-list-active-group "LIST ACTIVE" "GROUP")))
-       (while groups
-         ;; Send the command to the server.
-         (nntp-send-command nil command (pop groups))
-         (incf count)
-         ;; Every 400 requests we have to read the stream in
-         ;; order to avoid deadlocks.
-         (when (or (null groups)       ;All requests have been sent.
-                   (zerop (% count nntp-maximum-request)))
-           (nntp-accept-response)
-           (while (progn
-                    (goto-char last-point)
-                    ;; Count replies.
-                    (while (re-search-forward "^[0-9]" nil t)
-                      (incf received))
-                    (setq last-point (point))
-                    (< received count))
-             (nntp-accept-response))))
-
-       ;; Wait for the reply from the final command.
-       (goto-char (point-max))
-       (re-search-backward "^[0-9]" nil t)
-       (when (looking-at "^[23]")
+  (save-excursion
+    (set-buffer (nntp-find-connection-buffer nntp-server-buffer))
+    ;; The first time this is run, this variable is `try'.  So we
+    ;; try.
+    (when (eq nntp-server-list-active-group 'try)
+      (nntp-try-list-active (car groups)))
+    (erase-buffer)
+    (let ((count 0)
+         (received 0)
+         (last-point (point-min))
+         (nntp-inhibit-erase t)
+         (command (if nntp-server-list-active-group "LIST ACTIVE" "GROUP")))
+      (while groups
+       ;; Send the command to the server.
+       (nntp-send-command nil command (pop groups))
+       (incf count)
+       ;; Every 400 requests we have to read the stream in
+       ;; order to avoid deadlocks.
+       (when (or (null groups)         ;All requests have been sent.
+                 (zerop (% count nntp-maximum-request)))
+         (nntp-accept-response)
          (while (progn
-                  (goto-char (point-max))
-                  (if (not nntp-server-list-active-group)
-                      (not (re-search-backward "\r?\n" (- (point) 3) t))
-                    (not (re-search-backward "^\\.\r?\n" (- (point) 4) t))))
-           (nntp-accept-response)))
+                  (goto-char last-point)
+                  ;; Count replies.
+                  (while (re-search-forward "^[0-9]" nil t)
+                    (incf received))
+                  (setq last-point (point))
+                  (< received count))
+           (nntp-accept-response))))
+
+      ;; Wait for the reply from the final command.
+      (goto-char (point-max))
+      (re-search-backward "^[0-9]" nil t)
+      (when (looking-at "^[23]")
+       (while (progn
+                (goto-char (point-max))
+                (if (not nntp-server-list-active-group)
+                    (not (re-search-backward "\r?\n" (- (point) 3) t))
+                  (not (re-search-backward "^\\.\r?\n" (- (point) 4) t))))
+         (nntp-accept-response)))
+
+      ;; Now all replies are received.  We remove CRs.
+      (goto-char (point-min))
+      (while (search-forward "\r" nil t)
+       (replace-match "" t t))
 
-       ;; Now all replies are received.  We remove CRs.
+      (if (not nntp-server-list-active-group)
+         (progn
+           (copy-to-buffer nntp-server-buffer (point-min) (point-max))
+           'group)
+       ;; We have read active entries, so we just delete the
+       ;; superfluous gunk.
        (goto-char (point-min))
-       (while (search-forward "\r" nil t)
-         (replace-match "" t t))
-
-       (if (not nntp-server-list-active-group)
-           (progn
-             (copy-to-buffer nntp-server-buffer (point-min) (point-max))
-             'group)
-         ;; We have read active entries, so we just delete the
-         ;; superfluous gunk.
-         (goto-char (point-min))
-         (while (re-search-forward "^[.2-5]" nil t)
-           (delete-region (match-beginning 0)
-                          (progn (forward-line 1) (point))))
-         (copy-to-buffer nntp-server-buffer (point-min) (point-max))
-         'active)))))
+       (while (re-search-forward "^[.2-5]" nil t)
+         (delete-region (match-beginning 0)
+                        (progn (forward-line 1) (point))))
+       (copy-to-buffer nntp-server-buffer (point-min) (point-max))
+       'active))))
 
 (deffoo nntp-retrieve-articles (articles &optional group server)
   (nntp-possibly-change-group group server)
@@ -592,7 +577,7 @@ noticing asynchronous data.")
       (and (numberp nntp-large-newsgroup)
           (> number nntp-large-newsgroup)
           (nnheader-message 6 "NNTP: Receiving articles...done"))
-
+      
       ;; Now we have all the responses.  We go through the results,
       ;; wash it and copy it over to the server buffer.
       (set-buffer nntp-server-buffer)
@@ -623,14 +608,9 @@ noticing asynchronous data.")
           (setq nntp-server-list-active-group t)))))
 
 (deffoo nntp-list-active-group (group &optional server)
-  "Return the active info on GROUP (which can be a regexp)."
+  "Return the active info on GROUP (which can be a regexp."
   (nntp-possibly-change-group nil server)
-  (nntp-send-command "^\\.*\r?\n" "LIST ACTIVE" group))
-
-(deffoo nntp-request-group-articles (group &optional server)
-  "Return the list of existing articles in GROUP."
-  (nntp-possibly-change-group nil server)
-  (nntp-send-command "^\\.*\r?\n" "LISTGROUP" group))
+  (nntp-send-command "^.*\r?\n" "LIST ACTIVE" group))
 
 (deffoo nntp-request-article (article &optional group server buffer command)
   (nntp-possibly-change-group group server)
@@ -701,9 +681,10 @@ noticing asynchronous data.")
            ;; Ok, this is evil, but when using telnet and stuff
            ;; as the connection method, it's important that the
            ;; QUIT command actually is sent out before we kill
-           ;; the process.
+           ;; the process.  
            (sleep-for 1))))
-      (nntp-kill-buffer (process-buffer process))
+      (when (buffer-name (process-buffer process))
+       (kill-buffer (process-buffer process)))
       (setq process (car (pop nntp-connection-alist))))
     (nnoo-close-server 'nntp)))
 
@@ -717,9 +698,10 @@ noticing asynchronous data.")
            ;; Ok, this is evil, but when using telnet and stuff
            ;; as the connection method, it's important that the
            ;; QUIT command actually is sent out before we kill
-           ;; the process.
+           ;; the process.  
            (sleep-for 1))))
-      (nntp-kill-buffer (process-buffer process)))))
+      (when (buffer-name (process-buffer process))
+       (kill-buffer (process-buffer process))))))
 
 (deffoo nntp-request-list (&optional server)
   (nntp-possibly-change-group nil server)
@@ -736,7 +718,7 @@ noticing asynchronous data.")
     (prog1
        (nntp-send-command
         "^\\.\r?\n" "NEWGROUPS"
-        (format-time-string "%y%m%d %H%M%S" (date-to-time date)))
+        (format-time-string "%y%m%d %H%M%S" (nnmail-date-to-time date)))
       (nntp-decode-text))))
 
 (deffoo nntp-request-post (&optional server)
@@ -757,7 +739,7 @@ noticing asynchronous data.")
 This function is supposed to be called from `nntp-server-opened-hook'.
 It will make innd servers spawn an nnrpd process to allow actual article
 reading."
-  (nntp-send-command "^.*\n" "MODE READER"))
+  (nntp-send-command "^.*\r?\n" "MODE READER"))
 
 (defun nntp-send-authinfo (&optional send-if-force)
   "Send the AUTHINFO to the nntp server.
@@ -785,7 +767,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
        (or passwd
           nntp-authinfo-password
           (setq nntp-authinfo-password
-                    (mail-source-read-passwd (format "NNTP (%s@%s) password: "
+                    (nnmail-read-passwd (format "NNTP (%s@%s) password: "
                                                 user nntp-address))))))))))
 
 (defun nntp-send-nosy-authinfo ()
@@ -795,7 +777,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
       (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" user)
       (when t                          ;???Should check if AUTHINFO succeeded
        (nntp-send-command "^2.*\r?\n" "AUTHINFO PASS"
-                          (mail-source-read-passwd "NNTP (%s@%s) password: "
+                          (nnmail-read-passwd "NNTP (%s@%s) password: "
                                               user nntp-address))))))
 
 (defun nntp-send-authinfo-from-file ()
@@ -804,7 +786,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
 The authinfo login name is taken from the user's login name and the
 password contained in '~/.nntp-authinfo'."
   (when (file-exists-p "~/.nntp-authinfo")
-    (with-temp-buffer
+    (nnheader-temp-write nil
       (insert-file-contents "~/.nntp-authinfo")
       (goto-char (point-min))
       (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name))
@@ -833,7 +815,7 @@ password contained in '~/.nntp-authinfo'."
       (format " *server %s %s %s*"
              nntp-address nntp-port-number
              (gnus-buffer-exists-p buffer))))
-    (mm-enable-multibyte)
+    (buffer-disable-undo (current-buffer))
     (set (make-local-variable 'after-change-functions) nil)
     (set (make-local-variable 'nntp-process-wait-for) nil)
     (set (make-local-variable 'nntp-process-callback) nil)
@@ -846,20 +828,19 @@ password contained in '~/.nntp-authinfo'."
   "Open a connection to PORT on ADDRESS delivering output to BUFFER."
   (run-hooks 'nntp-prepare-server-hook)
   (let* ((pbuffer (nntp-make-process-buffer buffer))
-        (timer
-         (and nntp-connection-timeout
+        (timer 
+         (and nntp-connection-timeout 
               (nnheader-run-at-time
                nntp-connection-timeout nil
                `(lambda ()
-                  (nntp-kill-buffer ,pbuffer)))))
+                  (when (buffer-name ,pbuffer)
+                    (kill-buffer ,pbuffer))))))
         (process
          (condition-case ()
-             (let ((coding-system-for-read nntp-coding-system-for-read)
-                    (coding-system-for-write nntp-coding-system-for-write))
-               (funcall nntp-open-connection-function pbuffer))
+             (funcall nntp-open-connection-function pbuffer)
            (error nil)
            (quit nil))))
-    (when timer
+    (when timer 
       (nnheader-cancel-timer timer))
     (when (and (buffer-name pbuffer)
               process)
@@ -877,11 +858,13 @@ password contained in '~/.nntp-authinfo'."
              (let ((nnheader-callback-function nil))
                (run-hooks 'nntp-server-opened-hook)
                (nntp-send-authinfo t))))
-       (nntp-kill-buffer (process-buffer process))
+       (when (buffer-name (process-buffer process))
+         (kill-buffer (process-buffer process)))
        nil))))
 
 (defun nntp-open-network-stream (buffer)
-  (open-network-stream "nntpd" buffer nntp-address nntp-port-number))
+  (open-network-stream-as-binary
+   "nntpd" buffer nntp-address nntp-port-number))
 
 (defun nntp-open-ssl-stream (buffer)
   (let* ((ssl-program-arguments '("-connect" (concat host ":" service)))
@@ -909,97 +892,40 @@ password contained in '~/.nntp-authinfo'."
            (eval (cadr entry))
          (funcall (cadr entry)))))))
 
-(defun nntp-async-wait (process wait-for buffer decode callback)
-  (save-excursion
-    (set-buffer (process-buffer process))
-    (unless nntp-inside-change-function
-      (erase-buffer))
-    (setq nntp-process-wait-for wait-for
-         nntp-process-to-buffer buffer
-         nntp-process-decode decode
-         nntp-process-callback callback
-         nntp-process-start-point (point-max))
-    (setq after-change-functions '(nntp-after-change-function))
-    (if nntp-async-needs-kluge
-       (nntp-async-kluge process))))
-
-(defun nntp-async-kluge (process)
-  ;; emacs 20.3 bug: process output with encoding 'binary
-  ;; doesn't trigger after-change-functions.
-  (unless nntp-async-timer
-    (setq nntp-async-timer
-         (nnheader-run-at-time 1 1 'nntp-async-timer-handler)))
-  (add-to-list 'nntp-async-process-list process))
-
-(defun nntp-async-timer-handler ()
-  (mapcar
-   (lambda (proc)
-     (if (memq (process-status proc) '(open run))
-        (nntp-async-trigger proc)
-       (nntp-async-stop proc)))
-   nntp-async-process-list))
-
-(defun nntp-async-stop (proc)
-  (setq nntp-async-process-list (delq proc nntp-async-process-list))
-  (when (and nntp-async-timer (not nntp-async-process-list))
-    (nnheader-cancel-timer nntp-async-timer)
-    (setq nntp-async-timer nil)))
-
-(defun nntp-after-change-function (beg end len)
-  (unwind-protect
-      ;; we only care about insertions at eob
-      (when (and (eq 0 len) (eq (point-max) end))
-       (save-match-data
-         (let ((proc (get-buffer-process (current-buffer))))
-           (when proc
-             (nntp-async-trigger proc)))))
-    ;; any throw from after-change-functions will leave it
-    ;; set to nil.  so we reset it here, if necessary.
-    (when quit-flag
-      (setq after-change-functions '(nntp-after-change-function)))))
-
-(defun nntp-async-trigger (process)
-  (save-excursion
-    (set-buffer (process-buffer process))
-    (when nntp-process-callback
-      ;; do we have an error message?
-      (goto-char nntp-process-start-point)
-      (if (memq (following-char) '(?4 ?5))
-         ;; wants credentials?
-         (if (looking-at "480")
-             (nntp-handle-authinfo nntp-process-to-buffer)
-           ;; report error message.
-           (nntp-snarf-error-message)
-           (nntp-do-callback nil))
-
-       ;; got what we expect?
-       (goto-char (point-max))
-       (when (re-search-backward
-              nntp-process-wait-for nntp-process-start-point t)
-         (nntp-async-stop process)
-         ;; convert it.
+(defun nntp-after-change-function-callback (beg end len)
+  (when nntp-process-callback
+    (save-match-data
+      (if (and (= beg (point-min))
+              (memq (char-after beg) '(?4 ?5)))
+         ;; Report back error messages.
+         (save-excursion
+           (goto-char beg)
+           (if (looking-at "480")
+               (nntp-handle-authinfo nntp-process-to-buffer)
+             (nntp-snarf-error-message)
+             (funcall nntp-process-callback nil)))
+       (goto-char end)
+       (when (and (> (point) nntp-process-start-point)
+                  (re-search-backward nntp-process-wait-for
+                                      nntp-process-start-point t))
          (when (gnus-buffer-exists-p nntp-process-to-buffer)
-           (let ((buf (current-buffer))
-                 (start nntp-process-start-point)
-                 (decode nntp-process-decode))
+           (let ((cur (current-buffer))
+                 (start nntp-process-start-point))
              (save-excursion
                (set-buffer nntp-process-to-buffer)
                (goto-char (point-max))
-               (save-restriction
-                 (narrow-to-region (point) (point))
-                 (insert-buffer-substring buf start)
-                 (when decode
-                   (nntp-decode-text))))))
-         ;; report it.
-         (goto-char (point-max))
-         (nntp-do-callback
-          (buffer-name (get-buffer nntp-process-to-buffer))))))))
-
-(defun nntp-do-callback (arg)
-  (let ((callback nntp-process-callback)
-       (nntp-inside-change-function t))
-    (setq nntp-process-callback nil)
-    (funcall callback arg)))
+               (let ((b (point)))
+                 (insert-buffer-substring cur start)
+                 (narrow-to-region b (point-max))
+                 (nntp-decode-text)
+                 (widen)))))
+         (goto-char end)
+         (let ((callback nntp-process-callback)
+               (nntp-inside-change-function t))
+           (setq nntp-process-callback nil)
+           (save-excursion
+             (funcall callback (buffer-name
+                                (get-buffer nntp-process-to-buffer))))))))))
 
 (defun nntp-snarf-error-message ()
   "Save the error message in the current buffer."
@@ -1009,7 +935,7 @@ password contained in '~/.nntp-authinfo'."
     (nnheader-report 'nntp message)
     message))
 
-(defun nntp-accept-process-output (process &optional timeout)
+(defun nntp-accept-process-output (process)
   "Wait for output from PROCESS and message some dots."
   (save-excursion
     (set-buffer (or (nntp-find-connection-buffer nntp-server-buffer)
@@ -1019,7 +945,7 @@ password contained in '~/.nntp-authinfo'."
       (unless (< len 10)
        (setq nntp-have-messaged t)
        (nnheader-message 7 "nntp read: %dk" len)))
-    (accept-process-output process (or timeout 1))))
+    (accept-process-output process 1)))
 
 (defun nntp-accept-response ()
   "Wait for output from the process that outputs to BUFFER."
@@ -1041,7 +967,10 @@ password contained in '~/.nntp-authinfo'."
        (save-excursion
          (set-buffer (process-buffer (car entry)))
          (erase-buffer)
-         (nntp-send-command "^[245].*\n" "GROUP" group)
+         (nntp-send-string (car entry) (concat "GROUP " group))
+         ;; allow for unexpected responses, since this can be called
+         ;; from a timer with quit inhibited
+         (nntp-wait-for-string "^[245].*\n")
          (setcar (cddr entry) group)
          (erase-buffer))))))
 
@@ -1121,10 +1050,9 @@ password contained in '~/.nntp-authinfo'."
    ((numberp nntp-nov-gap)
     (let ((count 0)
          (received 0)
-         last-point
-         in-process-buffer-p
+         (last-point (point-min))
          (buf nntp-server-buffer)
-         (process-buffer (nntp-find-connection-buffer nntp-server-buffer))
+         ;;(process-buffer (nntp-find-connection (current-buffer))))
          first)
       ;; We have to check `nntp-server-xover'.  If it gets set to nil,
       ;; that means that the server does not understand XOVER, but we
@@ -1137,55 +1065,40 @@ password contained in '~/.nntp-authinfo'."
                    (< (- (nth 1 articles) (car articles)) nntp-nov-gap))
          (setq articles (cdr articles)))
 
-       (setq in-process-buffer-p (stringp nntp-server-xover))
-       (nntp-send-xover-command first (car articles))
-       (setq articles (cdr articles))
-       
-       (when (and nntp-server-xover in-process-buffer-p)
-         ;; Don't count tried request.
-         (setq count (1+ count))
-         
+       (when (nntp-send-xover-command first (car articles))
+         (setq articles (cdr articles)
+               count (1+ count))
+
          ;; Every 400 requests we have to read the stream in
          ;; order to avoid deadlocks.
          (when (or (null articles)     ;All requests have been sent.
                    (zerop (% count nntp-maximum-request)))
-
-           (nntp-accept-response)
+           (accept-process-output)
            ;; On some Emacs versions the preceding function has
            ;; a tendency to change the buffer.  Perhaps.  It's
            ;; quite difficult to reproduce, because it only
            ;; seems to happen once in a blue moon.
-           (set-buffer process-buffer)
+           (set-buffer buf)
            (while (progn
-                    (goto-char (or last-point (point-min)))
+                    (goto-char last-point)
                     ;; Count replies.
                     (while (re-search-forward "^[0-9][0-9][0-9] " nil t)
                       (setq received (1+ received)))
                     (setq last-point (point))
                     (< received count))
-             (nntp-accept-response)
-             (set-buffer process-buffer))
-           (set-buffer buf))))
+             (accept-process-output)
+             (set-buffer buf)))))
 
       (when nntp-server-xover
-       (when in-process-buffer-p
-         (set-buffer process-buffer)
-         ;; Wait for the reply from the final command.
-         (goto-char (point-max))
-         (re-search-backward "^[0-9][0-9][0-9] " nil t)
-         (when (looking-at "^[23]")
-           (while (progn
-                    (goto-char (point-max))
-                    (forward-line -1)
-                    (not (looking-at "^\\.\r?\n")))
-             (nntp-accept-response)
-             (set-buffer process-buffer)))
-         (set-buffer buf)
-         (goto-char (point-max))
-         (insert-buffer-substring process-buffer)
-         (set-buffer process-buffer)
-         (erase-buffer)
-         (set-buffer buf))
+       ;; Wait for the reply from the final command.
+       (goto-char (point-max))
+       (re-search-backward "^[0-9][0-9][0-9] " nil t)
+       (when (looking-at "^[23]")
+         (while (progn
+                  (goto-char (point-max))
+                  (forward-line -1)
+                  (not (looking-at "^\\.\r?\n")))
+           (nntp-accept-response)))
 
        ;; We remove any "." lines and status lines.
        (goto-char (point-min))
@@ -1193,6 +1106,7 @@ password contained in '~/.nntp-authinfo'."
          (delete-char -1))
        (goto-char (point-min))
        (delete-matching-lines "^\\.$\\|^[1-5][0-9][0-9] ")
+       ;;(copy-to-buffer nntp-server-buffer (point-min) (point-max))
        t))))
 
   nntp-server-xover)
@@ -1208,7 +1122,7 @@ password contained in '~/.nntp-authinfo'."
            (nntp-send-command-nodelete
             "\r?\n\\.\r?\n" nntp-server-xover range)
          ;; We do not wait for the reply.
-         (nntp-send-command-nodelete nil nntp-server-xover range))
+         (nntp-send-command-nodelete "\r?\n\\.\r?\n" nntp-server-xover range))
       (let ((commands nntp-xover-commands))
        ;; `nntp-xover-commands' is a list of possible XOVER commands.
        ;; We try them all until we get at positive response.
@@ -1249,9 +1163,10 @@ password contained in '~/.nntp-authinfo'."
   (save-excursion
     (set-buffer buffer)
     (erase-buffer)
-    (let ((proc (apply
-                'start-process
-                "nntpd" buffer nntp-telnet-command nntp-telnet-switches))
+    (let ((proc (as-binary-process
+                (apply
+                 'start-process
+                 "nntpd" buffer nntp-telnet-command nntp-telnet-switches)))
          (case-fold-search t))
       (when (memq (process-status proc) '(open run))
        (process-send-string proc "set escape \^X\n")
@@ -1274,8 +1189,9 @@ password contained in '~/.nntp-authinfo'."
         proc (concat
               (or nntp-telnet-passwd
                   (setq nntp-telnet-passwd
-                        (mail-source-read-passwd "Password: ")))
+                        (nnmail-read-passwd "Password: ")))
               "\n"))
+       (erase-buffer)
        (nntp-wait-for-string nntp-telnet-shell-prompt)
        (process-send-string
         proc (concat (mapconcat 'identity nntp-telnet-parameters " ") "\n"))
@@ -1295,13 +1211,15 @@ password contained in '~/.nntp-authinfo'."
 (defun nntp-open-rlogin (buffer)
   "Open a connection to SERVER using rsh."
   (let ((proc (if nntp-rlogin-user-name
-                 (apply 'start-process
-                        "nntpd" buffer nntp-rlogin-program
-                        nntp-address "-l" nntp-rlogin-user-name
-                        nntp-rlogin-parameters)
-               (apply 'start-process
-                      "nntpd" buffer nntp-rlogin-program nntp-address
-                      nntp-rlogin-parameters))))
+                 (as-binary-process
+                  (apply 'start-process
+                         "nntpd" buffer nntp-rlogin-program
+                         nntp-address "-l" nntp-rlogin-user-name
+                         nntp-rlogin-parameters))
+               (as-binary-process
+                (apply 'start-process
+                       "nntpd" buffer nntp-rlogin-program nntp-address
+                       nntp-rlogin-parameters)))))
     (save-excursion
       (set-buffer buffer)
       (nntp-wait-for-string "^\r*20[01]")