+Fri Feb 13 22:40:39 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Quassia Gnus v0.25 is released.
+
+Fri Feb 13 19:01:19 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nndoc.el (nndoc-type-alist): Allow blank lines to separate
+ headers from bodies.
+
+ * gnus-art.el (gnus-article-edit): Restore Date header.
+
+ * gnus-async.el (gnus-asynch-obarray): New variable.
+ (gnus-async-prefetched-article-entry): Use it.
+ (gnus-async-set-buffer): Use it.
+
+ * nnmh.el (nnmh-active-number): Create parent dirs.
+
+ * nntp.el (nntp-last-command): New variable.
+ (nntp-handle-authinfo): New function.
+
+ * gnus-sum.el (gnus-summary-exit): Call purging function.
+
+Fri Feb 13 18:59:16 1998 François Pinard <pinard@iro.umontreal.ca>
+
+ * nnmail.el (nnmail-get-new-mail): Don't clear split-history.
+ (nnmail-purge-split-history): New function.
+
+Fri Feb 13 18:36:16 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nntp.el (nntp-telnet-shell-prompt): Renamed.
+
+Fri Feb 13 18:35:23 1998 Sam Falkner <samf@channelpoint.com>
+
+ * nntp.el (nntp-open-telnet-envuser): New variable.
+
+Fri Feb 13 18:29:23 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * message.el (message-send-mail-function): Added smtpmail-send-it.
+
+1998-02-11 Dave Love <d.love@dl.ac.uk>
+
+ * gnus-art.el (gnus-button-url): Don't lose in Emacs 20 with
+ browse-url-browser-function an alist, not a function.
+ (gnus-button-embedded-url): Likewise.
+
+Fri Feb 13 17:10:31 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-cite.el (gnus-cite-localize): New function.
+ (gnus-cite-close): Renamed.
+ (gnus-cite-parse-maybe): Use it.
+
+ * gnus-sum.el (gnus-summary-move-article): Move back to summary
+ buffer.
+
+ * nnfolder.el (nnfolder-request-accept-article): Save excursion.
+ (nnfolder-request-move-article): Ditto.
+
+ * nntp.el (nntp-find-connection): Don't message.
+
+Fri Feb 13 14:51:56 1998 MORIOKA Tomohiko <steve@xemacs.org>
+
+ * message.el (message-send-mail-with-qmail): Fix.
+
+1998-02-13 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus-draft.el (gnus-draft-make-menu-bar): Added missing commands.
+
+1998-01-06 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus/gnus-cus.el (gnus-score-parameters): Make `files' and
+ `exclude-files' widgets inline.
+
+Fri Feb 13 12:46:23 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-article-mark): Dox dox.
+
Wed Feb 11 15:05:03 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Quassia Gnus v0.24 is released.
(when (and (not force)
(gnus-group-read-only-p))
(error "The current newsgroup does not support article editing"))
+ (gnus-article-date-original)
(gnus-article-edit-article
`(lambda (no-highlight)
(gnus-summary-edit-article-done
(defun gnus-button-url (address)
"Browse ADDRESS."
- (funcall browse-url-browser-function address))
+ ;; In Emacs 20, `browse-url-browser-function' may be an alist.
+ (if (listp browse-url-browser-function)
+ (browse-url address)
+ (funcall browse-url-browser-function address)))
(defun gnus-button-embedded-url (address)
"Browse ADDRESS."
- (funcall browse-url-browser-function (gnus-strip-whitespace address)))
+ ;; In Emacs 20, `browse-url-browser-function' may be an alist.
+ (if (listp browse-url-browser-function)
+ (browse-url (gnus-strip-whitespace address))
+ (funcall browse-url-browser-function (gnus-strip-whitespace address))))
;;; Next/prev buttons in the article buffer.
(defvar gnus-async-article-alist nil)
(defvar gnus-async-article-semaphore '(nil))
(defvar gnus-async-fetch-list nil)
+(defvar gnus-asynch-obarray nil)
(defvar gnus-async-prefetch-headers-buffer " *Async Prefetch Headers*")
(defvar gnus-async-header-prefetched nil)
gnus-async-header-prefetched nil))
(defun gnus-async-set-buffer ()
- (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t))
+ (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t)
+ (unless gnus-asynch-obarray
+ (set (make-local-variable 'gnus-asynch-obarray)
+ (gnus-make-hashtable 1023))))
(defun gnus-async-halt-prefetch ()
"Stop prefetching."
(when arg
(gnus-async-set-buffer)
(gnus-async-with-semaphore
- (push (list ',(intern (format "%s-%d" group article))
+ (push (list ',(intern (format "%s-%d" group article)
+ gnus-asynch-obarray)
,mark (set-marker (make-marker) (point-max))
,group ,article)
gnus-async-article-alist)))
(defun gnus-async-prefetched-article-entry (group article)
"Return the entry for ARTICLE in GROUP iff it has been prefetched."
- (let ((entry (assq (intern (format "%s-%d" group article))
- gnus-async-article-alist)))
+ (let ((entry (save-excursion
+ (gnus-async-set-buffer)
+ (assq (intern (format "%s-%d" group article)
+ gnus-asynch-obarray)
+ gnus-async-article-alist))))
;; Perhaps something has emptied the buffer?
(if (and entry
(= (cadr entry) (caddr entry)))
(defun gnus-cite-parse-maybe (&optional force)
;; Parse if the buffer has changes since last time.
- (if (and (not force) (equal gnus-cite-article gnus-article-current))
+ (if (and (not force)
+ (equal gnus-cite-article gnus-article-current))
()
+ (gnus-cite-localize)
;;Reset parser information.
(setq gnus-cite-prefix-alist nil
gnus-cite-attribution-alist nil
(setq prefix (car entry))))
prefix))
-(gnus-add-shutdown 'gnus-cache-close 'gnus)
-
-(defun gnus-cache-close ()
- (setq gnus-cite-prefix-alist nil))
+(defun gnus-cite-localize ()
+ "Make the citation variables local to the article buffer."
+ (let ((vars '(gnus-cite-article
+ gnus-cite-overlay-list gnus-cite-prefix-alist
+ gnus-cite-attribution-alist gnus-cite-loose-prefix-alist
+ gnus-cite-loose-attribution-alist)))
+ (while vars
+ (make-local-variable (pop vars)))))
(gnus-ems-redefine)
`gnus-thread-score-function' says how to compute the total score
for a thread.")
- (files (repeat :tag "Files" file) "\
+ (files (repeat :inline t :tag "Files" file) "\
The value of this entry should be any number of file names.
These files are assumed to be score files as well, and will be loaded
the same way this one was.")
- (exclude-files (repeat :tag "Exclude-files" file) "\
+ (exclude-files (repeat :inline t :tag "Exclude-files" file) "\
The clue of this entry should be any number of files.
These files will not be loaded, even though they would normally be so,
for some reason or other.")
(easy-menu-define
gnus-draft-menu gnus-draft-mode-map ""
'("Drafts"
- ["Toggle whether to send" gnus-draft-toggle-sending t]))))
+ ["Toggle whether to send" gnus-draft-toggle-sending t]
+ ["Edit" gnus-draft-edit-message t]
+ ["Send selected message(s)" gnus-draft-send-message t]
+ ["Send all messages" gnus-draft-send-all-messages t]))))
(defun gnus-draft-mode (&optional arg)
"Minor mode for providing a draft summary buffers.
(gnus-summary-last-subject))))
(defmacro gnus-summary-article-header (&optional number)
+ "Return the header of article NUMBER."
`(gnus-data-header (gnus-data-find
,(or number '(gnus-summary-article-number)))))
(defmacro gnus-summary-thread-level (&optional number)
+ "Return the level of thread that starts with article NUMBER."
`(if (and (eq gnus-summary-make-false-root 'dummy)
(get-text-property (point) 'gnus-intangible))
0
,(or number '(gnus-summary-article-number))))))
(defmacro gnus-summary-article-mark (&optional number)
+ "Return the mark of article NUMBER."
`(gnus-data-mark (gnus-data-find
,(or number '(gnus-summary-article-number)))))
(defmacro gnus-summary-article-pos (&optional number)
+ "Return the position of the line of article NUMBER."
`(gnus-data-pos (gnus-data-find
,(or number '(gnus-summary-article-number)))))
gnus-summary-default-score 0))
(defun gnus-summary-article-children (&optional number)
+ "Return a list of article numbers that are children of article NUMBER."
(let* ((data (gnus-data-find-list (or number (gnus-summary-article-number))))
(level (gnus-data-level (car data)))
l children)
(nreverse children)))
(defun gnus-summary-article-parent (&optional number)
+ "Return the article number of the parent of article NUMBER."
(let* ((data (gnus-data-find-list (or number (gnus-summary-article-number))
(gnus-data-list t)))
(level (gnus-data-level (car data))))
(= mark gnus-expirable-mark))))
(defmacro gnus-article-mark (number)
+ "Return the MARK of article NUMBER.
+This macro should only be used when computing the mark the \"first\"
+time; i.e., when generating the summary lines. After that,
+`gnus-summary-article-mark' should be used to examine the
+marks of articles."
`(cond
((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark)
((memq ,number gnus-newsgroup-undownloaded) gnus-undownloaded-mark)
(gnus-dup-enter-articles))
(when gnus-use-trees
(gnus-tree-close group))
+ ;; Remove entries for this group.
+ (nnmail-purge-split-history group)
;; Make all changes in this group permanent.
(unless quit-config
(run-hooks 'gnus-exit-group-hook)
(gnus-request-replace-article
article gnus-newsgroup-name (current-buffer)))))
+ ;;;!!!Why is this necessary?
+ (set-buffer gnus-summary-buffer)
+
(gnus-summary-goto-subject article)
(when (eq action 'move)
(gnus-summary-mark-article article gnus-canceled-mark))))
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.24"
+(defconst gnus-version-number "0.25"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number)
("pp" pp pp-to-string pp-eval-expression)
("ps-print" ps-print-preprint)
("mail-extr" mail-extract-address-components)
+ ("browse-url" browse-url)
("message" :interactive t
message-send-and-exit message-yank-original)
("nnmail" nnmail-split-fancy nnmail-article-group nnmail-date-to-time)
variable `mail-header-separator'.
Legal values include `message-send-mail-with-sendmail' (the default),
-`message-send-mail-with-mh' and `message-send-mail-with-qmail'."
+`message-send-mail-with-mh', `message-send-mail-with-qmail' and
+`smtpmail-send-it'."
:type '(radio (function-item message-send-mail-with-sendmail)
(function-item message-send-mail-with-mh)
(function-item message-send-mail-with-qmail)
+ (function-item smtpmail-send-it)
(function :tag "Other"))
:group 'message-sending
:group 'message-mail)
(defun message-dont-send ()
"Don't send the message you have been editing."
(interactive)
+ (save-buffer)
(let ((actions message-postpone-actions))
(message-bury (current-buffer))
(message-do-actions actions)))
(save-excursion
(set-buffer errbuf)
(erase-buffer))))
- (let ((default-directory "/"))
+ (let ((default-directory "/")
+ (coding-system-for-write 'binary))
(apply 'call-process-region
(append (list (point-min) (point-max)
(if (boundp 'sendmail-program)
(run-hooks 'message-send-mail-hook)
;; send the message
(case
- (apply
- 'call-process-region 1 (point-max) message-qmail-inject-program
- nil nil nil
- ;; qmail-inject's default behaviour is to look for addresses on the
- ;; command line; if there're none, it scans the headers.
- ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin.
- ;;
- ;; in general, ALL of qmail-inject's defaults are perfect for simply
- ;; reading a formatted (i. e., at least a To: or Resent-To header)
- ;; message from stdin.
- ;;
- ;; qmail also has the advantage of not having been raped by
- ;; various vendors, so we don't have to allow for that, either --
- ;; compare this with message-send-mail-with-sendmail and weep
- ;; for sendmail's lost innocence.
- ;;
- ;; all this is way cool coz it lets us keep the arguments entirely
- ;; free for -inject-arguments -- a big win for the user and for us
- ;; since we don't have to play that double-guessing game and the user
- ;; gets full control (no gestapo'ish -f's, for instance). --sj
- message-qmail-inject-args)
+ (let ((coding-system-for-write 'binary))
+ (apply
+ 'call-process-region 1 (point-max) message-qmail-inject-program
+ nil nil nil
+ ;; qmail-inject's default behaviour is to look for addresses on the
+ ;; command line; if there're none, it scans the headers.
+ ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin.
+ ;;
+ ;; in general, ALL of qmail-inject's defaults are perfect for simply
+ ;; reading a formatted (i. e., at least a To: or Resent-To header)
+ ;; message from stdin.
+ ;;
+ ;; qmail also has the advantage of not having been raped by
+ ;; various vendors, so we don't have to allow for that, either --
+ ;; compare this with message-send-mail-with-sendmail and weep
+ ;; for sendmail's lost innocence.
+ ;;
+ ;; all this is way cool coz it lets us keep the arguments entirely
+ ;; free for -inject-arguments -- a big win for the user and for us
+ ;; since we don't have to play that double-guessing game and the user
+ ;; gets full control (no gestapo'ish -f's, for instance). --sj
+ message-qmail-inject-args))
;; qmail-inject doesn't say anything on it's stdout/stderr,
;; we have to look at the retval instead
(0 nil)
(defvoo nndoc-post-type 'mail
"*Whether the nndoc group is `mail' or `post'.")
+(defvoo nndoc-open-document-hook 'nnheader-ms-strip-cr
+ "Hook run after opening a document.
+The default function removes all trailing carriage returns
+from the document.")
+
(defvar nndoc-type-alist
`((mmdf
(article-begin . "^\^A\^A\^A\^A\n")
(article-begin . ,(concat "^\n" (make-string 30 ?-) "\n\n+"))
(prepare-body-function . nndoc-unquote-dashes)
(body-end-function . nndoc-digest-body-end)
- (head-end . "^ ?$")
- (body-begin . "^ ?\n")
+ (head-end . "^ *$")
+ (body-begin . "^ *\n")
(file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
(subtype digest guess))
(slack-digest
(erase-buffer)
(if (stringp nndoc-address)
(nnheader-insert-file-contents nndoc-address)
- (insert-buffer-substring nndoc-address)))))
+ (insert-buffer-substring nndoc-address))
+ (run-hooks 'nndoc-open-document-hook))))
;; Initialize the nndoc structures according to this new document.
(when (and nndoc-current-buffer
(not nndoc-dissection-alist))
(nnmail-save-active nnfolder-group-alist nnfolder-active-file)
(nconc rest articles))))
-(deffoo nnfolder-request-move-article
- (article group server accept-form &optional last)
- (let ((buf (get-buffer-create " *nnfolder move*"))
- result)
- (and
- (nnfolder-request-article article group server)
- (save-excursion
- (set-buffer buf)
- (buffer-disable-undo (current-buffer))
- (erase-buffer)
- (insert-buffer-substring nntp-server-buffer)
- (goto-char (point-min))
- (while (re-search-forward
- (concat "^" nnfolder-article-marker)
- (save-excursion (search-forward "\n\n" nil t) (point)) t)
- (delete-region (progn (beginning-of-line) (point))
- (progn (forward-line 1) (point))))
- (setq result (eval accept-form))
- (kill-buffer buf)
- result)
- (save-excursion
- (nnfolder-possibly-change-group group server)
- (set-buffer nnfolder-current-buffer)
- (goto-char (point-min))
- (when (search-forward (nnfolder-article-string article) nil t)
- (nnfolder-delete-mail))
- (when last
- (nnfolder-save-buffer)
- (nnfolder-adjust-min-active group)
- (nnmail-save-active nnfolder-group-alist nnfolder-active-file))))
- result))
+(deffoo nnfolder-request-move-article (article group server
+ accept-form &optional last)
+ (save-excursion
+ (let ((buf (get-buffer-create " *nnfolder move*"))
+ result)
+ (and
+ (nnfolder-request-article article group server)
+ (save-excursion
+ (set-buffer buf)
+ (buffer-disable-undo (current-buffer))
+ (erase-buffer)
+ (insert-buffer-substring nntp-server-buffer)
+ (goto-char (point-min))
+ (while (re-search-forward
+ (concat "^" nnfolder-article-marker)
+ (save-excursion (search-forward "\n\n" nil t) (point)) t)
+ (delete-region (progn (beginning-of-line) (point))
+ (progn (forward-line 1) (point))))
+ (setq result (eval accept-form))
+ (kill-buffer buf)
+ result)
+ (save-excursion
+ (nnfolder-possibly-change-group group server)
+ (set-buffer nnfolder-current-buffer)
+ (goto-char (point-min))
+ (when (search-forward (nnfolder-article-string article) nil t)
+ (nnfolder-delete-mail))
+ (when last
+ (nnfolder-save-buffer)
+ (nnfolder-adjust-min-active group)
+ (nnmail-save-active nnfolder-group-alist nnfolder-active-file))))
+ result)))
(deffoo nnfolder-request-accept-article (group &optional server last)
- (nnfolder-possibly-change-group group server)
- (nnmail-check-syntax)
- (let ((buf (current-buffer))
- result art-group)
- (goto-char (point-min))
- (when (looking-at "X-From-Line: ")
- (replace-match "From "))
- (and
- (nnfolder-request-list)
- (save-excursion
- (set-buffer buf)
- (goto-char (point-min))
- (search-forward "\n\n" nil t)
- (forward-line -1)
- (while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
- (delete-region (point) (progn (forward-line 1) (point))))
- (when nnmail-cache-accepted-message-ids
- (nnmail-cache-insert (nnmail-fetch-field "message-id")))
- (setq result (if (stringp group)
- (list (cons group (nnfolder-active-number group)))
- (setq art-group
- (nnmail-article-group 'nnfolder-active-number))))
- (if (and (null result)
- (yes-or-no-p "Moved to `junk' group; delete article? "))
- (setq result 'junk)
- (setq result
- (car (nnfolder-save-mail result)))))
- (when last
+ (save-excursion
+ (nnfolder-possibly-change-group group server)
+ (nnmail-check-syntax)
+ (let ((buf (current-buffer))
+ result art-group)
+ (goto-char (point-min))
+ (when (looking-at "X-From-Line: ")
+ (replace-match "From "))
+ (and
+ (nnfolder-request-list)
(save-excursion
- (nnfolder-possibly-change-folder (or (caar art-group) group))
- (nnfolder-save-buffer)
+ (set-buffer buf)
+ (goto-char (point-min))
+ (search-forward "\n\n" nil t)
+ (forward-line -1)
+ (while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
+ (delete-region (point) (progn (forward-line 1) (point))))
(when nnmail-cache-accepted-message-ids
- (nnmail-cache-close)))))
- (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
- (unless result
- (nnheader-report 'nnfolder "Couldn't store article"))
- result))
+ (nnmail-cache-insert (nnmail-fetch-field "message-id")))
+ (setq result (if (stringp group)
+ (list (cons group (nnfolder-active-number group)))
+ (setq art-group
+ (nnmail-article-group 'nnfolder-active-number))))
+ (if (and (null result)
+ (yes-or-no-p "Moved to `junk' group; delete article? "))
+ (setq result 'junk)
+ (setq result
+ (car (nnfolder-save-mail result)))))
+ (when last
+ (save-excursion
+ (nnfolder-possibly-change-folder (or (caar art-group) group))
+ (nnfolder-save-buffer)
+ (when nnmail-cache-accepted-message-ids
+ (nnmail-cache-close)))))
+ (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
+ (unless result
+ (nnheader-report 'nnfolder "Couldn't store article"))
+ result)))
(deffoo nnfolder-request-replace-article (article group buffer)
(nnfolder-possibly-change-group group)
(setq nnfolder-current-group group)
(when (or (not nnfolder-current-buffer)
- (not (verify-visited-file-modtime nnfolder-current-buffer)))
+ (not (verify-visited-file-modtime
+ nnfolder-current-buffer)))
(save-excursion
(setq file (nnfolder-group-pathname group))
;; See whether we need to create the new file.
(defun nnmail-get-new-mail (method exit-func temp
&optional group spool-func)
"Read new incoming mail."
- ;; Nix out the previous split history.
- (unless group
- (setq nnmail-split-history nil))
(let* ((spools (nnmail-get-spool-files group))
(group-in group)
nnmail-current-spool incoming incomings spool)
", "))
(princ "\n")))))
+(defun nnmail-purge-split-history (group)
+ (let ((history nnmail-split-history))
+ (while history
+ (let ((pairs (car history)))
+ (while pairs
+ (if (string= (car (car pairs)) group)
+ (setcar pairs (cdr pairs))
+ (setq pairs (cdr pairs)))))
+ (setq history (cdr history))))
+ (setq nnmail-split-history (delq nil nnmail-split-history)))
+
(defun nnmail-new-mail-p (group)
"Say whether GROUP has new mail."
(let ((his nnmail-split-history)
(setq active (cons 1 0))
(push (list group active) nnmh-group-alist)
(unless (file-exists-p dir)
- (make-directory dir))
+ (gnus-make-directory dir))
;; Find the highest number in the group.
(let ((files (sort
(mapcar
(defvoo nntp-telnet-passwd nil
"Password to use to log in via telnet with.")
+(defvoo nntp-open-telnet-envuser nil
+ "*If non-nil, telnet session (client and server both) will support the ENVIRON option and not prompt for login name.")
+
+(defvoo nntp-telnet-shell-prompt "bash\\|\$ *\r?$\\|> *\r?"
+ "*Regular expression to match the shell prompt on the remote machine.")
+
(defvoo nntp-telnet-command "telnet"
"Command used to start telnet.")
(defvar nntp-process-start-point nil)
(defvar nntp-inside-change-function nil)
(defvoo nntp-last-command-time nil)
+(defvoo nntp-last-command nil)
(defvar nntp-connection-list nil)
(defsubst nntp-send-string (process string)
"Send STRING to PROCESS."
+ (setq nntp-last-command-time (current-time)
+ nntp-last-command string)
(process-send-string process (concat string nntp-end-of-line)))
(defsubst nntp-wait-for (process wait-for buffer &optional decode discard)
(while (or (not (memq (char-after (point)) '(?2 ?3 ?4 ?5)))
(looking-at "480"))
(when (looking-at "480")
- (erase-buffer)
- (funcall nntp-authinfo-function))
+ (nntp-handle-authinfo process))
(nntp-accept-process-output process)
(goto-char (point-min)))
(prog1
(if (memq (process-status process) '(open run))
process
(when (buffer-name (process-buffer process))
- (message "Killed buffer %s" (process-buffer process))
(kill-buffer (process-buffer process)))
(setq nntp-connection-alist (delq entry nntp-connection-alist))
nil))))
(process-buffer process))))
(defsubst nntp-retrieve-data (command address port buffer
- &optional wait-for callback decode)
+ &optional wait-for callback decode)
"Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS."
- (setq nntp-last-command-time (current-time))
(let ((process (or (nntp-find-connection buffer)
(nntp-open-connection buffer))))
(if (not process)
(deffoo nntp-request-group (group &optional server dont-check)
(nntp-possibly-change-group nil server)
- (when (nntp-send-command "^2.*\n" "GROUP" group)
+ (when (nntp-send-command "^21.*\n" "GROUP" group)
(let ((entry (nntp-find-connection-entry nntp-server-buffer)))
(setcar (cddr entry) group))))
This function is supposed to be called from `nntp-server-opened-hook'.
It will prompt for a password."
(nntp-send-command
- "^.*\r?\n" "AUTHINFO USER"
+ "^3.*\r?\n" "AUTHINFO USER"
(read-string (format "NNTP (%s) user name: " nntp-address)))
(nntp-send-command
- "^.*\r?\n" "AUTHINFO PASS"
+ "^2.*\r?\n" "AUTHINFO PASS"
(nnmail-read-passwd "NNTP (%s) password: " nntp-address)))
(defun nntp-send-authinfo ()
"Send the AUTHINFO to the nntp server.
This function is supposed to be called from `nntp-server-opened-hook'.
It will prompt for a password."
- (nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name))
+ (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name))
(nntp-send-command
- "^.*\r?\n" "AUTHINFO PASS"
+ "^2.*\r?\n" "AUTHINFO PASS"
(nnmail-read-passwd (format "NNTP (%s) password: " nntp-address))))
(defun nntp-send-authinfo-from-file ()
(nnheader-temp-write nil
(insert-file-contents "~/.nntp-authinfo")
(goto-char (point-min))
- (nntp-send-command "^.*\r?\n" "AUTHINFO USER" (user-login-name))
+ (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name))
(nntp-send-command
- "^.*\r?\n" "AUTHINFO PASS"
+ "^2.*\r?\n" "AUTHINFO PASS"
(buffer-substring (point) (progn (end-of-line) (point)))))))
;;; Internal functions.
+(defun nntp-handle-authinfo (process)
+ "Take care of an authinfo response from the server."
+ (let ((last nntp-last-command))
+ (funcall nntp-authinfo-function)
+ ;; We have to re-send the function that was interrupted by
+ ;; the authinfo request.
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer))
+ (nntp-send-string process last)))
+
(defun nntp-make-process-buffer (buffer)
"Create a new, fresh buffer usable for nntp process connections."
(save-excursion
(save-excursion
(goto-char beg)
(if (looking-at "480")
- (funcall nntp-authinfo-function)
+ (nntp-handle-authinfo nntp-process-to-buffer)
(nntp-snarf-error-message)
(funcall nntp-process-callback nil)))
(goto-char end)
(case-fold-search t))
(when (memq (process-status proc) '(open run))
(process-send-string proc "set escape \^X\n")
- (process-send-string proc (concat "open " nntp-address "\n"))
- (nntp-wait-for-string "^\r*.?login:")
- (process-send-string
- proc (concat
- (or nntp-telnet-user-name
- (setq nntp-telnet-user-name (read-string "login: ")))
- "\n"))
+ (cond
+ ((and nntp-open-telnet-envuser nntp-telnet-user-name)
+ (process-send-string proc (concat "open " "-l" nntp-telnet-user-name
+ nntp-address "\n")))
+ (t
+ (process-send-string proc (concat "open " nntp-address "\n"))))
+ (cond
+ ((not nntp-open-telnet-envuser)
+ (nntp-wait-for-string "^\r*.?login:")
+ (process-send-string
+ proc (concat
+ (or nntp-telnet-user-name
+ (setq nntp-telnet-user-name (read-string "login: ")))
+ "\n"))))
(nntp-wait-for-string "^\r*.?password:")
(process-send-string
proc (concat
(nnmail-read-passwd "Password: ")))
"\n"))
(erase-buffer)
- (nntp-wait-for-string "bash\\|\$ *\r?$\\|> *\r?")
+ (nntp-wait-for-string nntp-telnet-shell-prompt)
(process-send-string
proc (concat (mapconcat 'identity nntp-telnet-parameters " ") "\n"))
(nntp-wait-for-string "^\r*20[01]")
+Fri Feb 13 18:23:19 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Mail Group Commands): Typo.
+ (NNTP): Addition.
+ (Mail and Procmail): Addition.
+
Mon Feb 9 16:30:30 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi (Article Date): Addition.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Quassia Gnus 0.24 Manual
+@settitle Quassia Gnus 0.25 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Quassia Gnus 0.24 Manual
+@title Quassia Gnus 0.25 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Quassia Gnus 0.24.
+This manual corresponds to Quassia Gnus 0.25.
@end ifinfo
@item gnus-subscribe-randomly
@vindex gnus-subscribe-randomly
Subscribe all new groups in arbitrary order. This really means that all
-new groups will be added at ``the top'' of the grop buffer.
+new groups will be added at ``the top'' of the group buffer.
@item gnus-subscribe-alphabetically
@vindex gnus-subscribe-alphabetically
Copy the article from one group (mail group or not) to a mail group
(@code{gnus-summary-copy-article}).
-@item B C
-@kindex B C (Summary)
+@item B B
+@kindex B B (Summary)
@cindex crosspost mail
@findex gnus-summary-crosspost-article
Crosspost the current article to some other group
A list of strings executed as a command after logging in
via @code{telnet}.
+@item nntp-telnet-shell-prompt
+@vindex nntp-telnet-shell-prompt
+Regexp matching the shell prompt on the remote machine. The default is
+@samp{bash\\|\$ *\r?$\\|> *\r?}.
+
+@item nntp-open-telnet-envuser
+@vindex nntp-open-telnet-envuser
+If non-@code{nil}, the @code{telnet} session (client and server both)
+will support the @code{ENVIRON} option and not prompt for login name.
+This works for Solaris @code{telnet}, for instance.
+
@end table
@item nntp-end-of-line
@code{nnmail-spool-file} to @code{procmail} to ensure that the mail
backends never ever try to fetch mail by themselves.
+If you have a combined @code{procmail}/POP/mailbox setup, you can do
+something like the following:
+
+@vindex nnmail-use-procmail
+@lisp
+(setq nnmail-use-procmail t)
+(setq nnmail-spool-file
+ '("/usr/spool/mail/my-name" "po:my-name"))
+@end lisp
+
This also means that you probably don't want to set
@code{nnmail-split-methods} either, which has some, perhaps, unexpected
side effects.
handle 480/381 authinfo requests separately.
@item
- when sending authinfo automatically, things hang.
-
-@item
include the texi/dir file in the distribution.
@item
snews://secnews.netscape.com/netscape.communicator.unix
@item
-When the nntp server hangs up while the user is composing the message,
-when sending the message and the nntp server asks for AUTH, Gnus hangs.
-
-@item
One command to edit the original version if an article, and one to edit
the displayed version.
Switch from initial text to the new default text mechanism.
@item
+How about making it possible to expire local articles? Will it be
+possible to make various constraints on when an article can be
+expired, e.g. (read), (age > 14 days), or the more interesting (read
+& age > 14 days)?
+
+@item
Solve the halting problem.
@c TODO
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 0.24 Manual
+@settitle Message 0.25 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Message 0.24 Manual
+@title Message 0.25 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message 0.24. Message is distributed with
+This manual corresponds to Message 0.25. Message is distributed with
the Gnus distribution bearing the same version number as this manual
has.