X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fnntp.el;h=d7665b5ed8c3a6ffdd51b4c726776e49efe5155a;hb=ee87db5d44e0d91d5cb710975c6d14fd190d738c;hp=39c3dc5284f86b761843973776bd45525b47750b;hpb=73edf76920c3d86afa1628ca8f1509394cb7b26c;p=elisp%2Fgnus.git- diff --git a/lisp/nntp.el b/lisp/nntp.el index 39c3dc5..d7665b5 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -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 ;; 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")) @@ -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]")