(rmail-clear-headers): Handle the last header in a message correctly.
[bpt/emacs.git] / lisp / rlogin.el
index 1eb5487..76b8626 100644 (file)
@@ -1,26 +1,29 @@
 ;;; rlogin.el --- remote login interface
 
+;; Copyright (C) 1992, 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
+
 ;; Author: Noah Friedman
 ;; Maintainer: Noah Friedman <friedman@prep.ai.mit.edu>
 ;; Keywords: unix, comm
 
-;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
-;;
-;; This program is free software; you can redistribute it and/or modify
+;; $Id: rlogin.el,v 1.39 1997/05/05 01:00:35 rms Exp $
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; the Free Software Foundation; either version 2, or (at your option)
 ;; any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with this program; if not, write to: The Free Software Foundation,
-;; Inc.; 675 Massachusetts Avenue.; Cambridge, MA 02139, USA.
 
-;; $Id: rlogin.el,v 1.29 1995/06/08 13:03:15 roland Exp friedman $
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
 
 ;;; Commentary:
 
 (require 'comint)
 (require 'shell)
 
-(defvar rlogin-program "rlogin"
-  "*Name of program to invoke rlogin")
-
-(defvar rlogin-explicit-args nil
-  "*List of arguments to pass to rlogin on the command line.")
-
-(defvar rlogin-mode-hook nil
-  "*Hooks to run after setting current buffer to rlogin-mode.")
-
-(defvar rlogin-process-connection-type nil
+(defgroup rlogin nil
+  "Remote login interface"
+  :group 'processes
+  :group 'unix)
+
+
+(defcustom rlogin-program "rlogin"
+  "*Name of program to invoke rlogin"
+  :type 'string
+  :group 'rlogin)
+
+(defcustom rlogin-explicit-args nil
+  "*List of arguments to pass to rlogin on the command line."
+  :type '(repeat (string :tag "Argument"))
+  :group 'rlogin)
+
+(defcustom rlogin-mode-hook nil
+  "*Hooks to run after setting current buffer to rlogin-mode."
+  :type 'hook
+  :group 'rlogin)
+
+(defcustom rlogin-process-connection-type
+  (save-match-data
+    ;; Solaris 2.x `rlogin' will spew a bunch of ioctl error messages if
+    ;; stdin isn't a tty.
+    (cond ((and (boundp 'system-configuration)
+                (stringp system-configuration)
+                (string-match "-solaris2" system-configuration))
+           t)
+          (t nil)))
   "*If non-`nil', use a pty for the local rlogin process.
 If `nil', use a pipe (if pipes are supported on the local system).
 
 Generally it is better not to waste ptys on systems which have a static
 number of them.  On the other hand, some implementations of `rlogin' assume
-a pty is being used, and errors will result from using a pipe instead.")
+a pty is being used, and errors will result from using a pipe instead."
+  :type '(choice (const :tag "ptys" t)
+                (const :tag "pipes" nil))
+  :group 'rlogin)
 
-(defvar rlogin-directory-tracking-mode 'local
+(defcustom rlogin-directory-tracking-mode 'local
   "*Control whether and how to do directory tracking in an rlogin buffer.
 
 nil means don't do directory tracking.
@@ -72,18 +98,26 @@ This variable becomes local to a buffer when set in any fashion for it.
 It is better to use the function of the same name to change the behavior of
 directory tracking in an rlogin session once it has begun, rather than
 simply setting this variable, since the function does the necessary
-re-synching of directories.")
+re-synching of directories."
+  :type '(choice (const :tag "off" nil)
+                (const :tag "ftp" t)
+                (const :tag "local" local))
+  :group 'rlogin)
 
 (make-variable-buffer-local 'rlogin-directory-tracking-mode)
 
-(defvar rlogin-host nil
-  "*The name of the remote host.  This variable is buffer-local.")
+(defcustom rlogin-host nil
+  "*The name of the remote host.  This variable is buffer-local."
+  :type '(choice (const nil) string)
+  :group 'rlogin)
 
-(defvar rlogin-remote-user nil
+(defcustom rlogin-remote-user nil
   "*The username used on the remote host.
 This variable is buffer-local and defaults to your local user name.
 If rlogin is invoked with the `-l' option to specify the remote username,
-this variable is set from that.")
+this variable is set from that."
+  :type '(choice (const nil) string)
+  :group 'rlogin)
 
 ;; Initialize rlogin mode map.
 (defvar rlogin-mode-map '())
@@ -106,7 +140,10 @@ this variable is set from that.")
 
 ;;;###autoload
 (defun rlogin (input-args &optional buffer)
-  "Open a network login connection to HOST via the `rlogin' program.
+  "Open a network login connection via `rlogin' with args INPUT-ARGS.
+INPUT-ARGS should start with a host name; it may also contain
+other arguments for `rlogin'.
+
 Input is sent line-at-a-time to the remote connection.
 
 Communication with the remote host is recorded in a buffer `*rlogin-HOST*'
@@ -114,8 +151,8 @@ Communication with the remote host is recorded in a buffer `*rlogin-HOST*'
 If a prefix argument is given and the buffer `*rlogin-HOST*' already exists,
 a new buffer with a different connection will be made.
 
-When called from a program, if the optional second argument is a string or
-buffer, it names the buffer to use.
+When called from a program, if the optional second argument BUFFER is
+a string or buffer, it specifies the buffer to use.
 
 The variable `rlogin-program' contains the name of the actual program to
 run.  It can be a relative or absolute path.
@@ -177,29 +214,38 @@ variable."
       ;; Set process-mark to point-max in case there is text in the
       ;; buffer from a previous exited process.
       (set-marker (process-mark proc) (point-max))
-      (rlogin-mode)
 
       ;; comint-output-filter-functions is just like a hook, except that the
       ;; functions in that list are passed arguments.  add-hook serves well
       ;; enough for modifying it.
+      ;; comint-output-filter-functions should already have a
+      ;; permanent-local property, at least in emacs 19.27 or later.
+      (if (fboundp 'make-local-hook)
+          (make-local-hook 'comint-output-filter-functions)
+        (make-local-variable 'comint-output-filter-functions))
       (add-hook 'comint-output-filter-functions 'rlogin-carriage-filter)
 
+      (rlogin-mode)
+
       (make-local-variable 'rlogin-host)
       (setq rlogin-host host)
       (make-local-variable 'rlogin-remote-user)
       (setq rlogin-remote-user user)
 
-      (cond
-       ((eq rlogin-directory-tracking-mode t)
-        ;; Do this here, rather than calling the tracking mode function, to
-        ;; avoid a gratuitous resync check; the default should be the
-        ;; user's home directory, be it local or remote.
-        (setq comint-file-name-prefix
-              (concat "/" rlogin-remote-user "@" rlogin-host ":"))
-        (cd-absolute comint-file-name-prefix))
-       ((null rlogin-directory-tracking-mode))
-       (t
-        (cd-absolute (concat comint-file-name-prefix "~/"))))))))
+      (condition-case ()
+          (cond ((eq rlogin-directory-tracking-mode t)
+                 ;; Do this here, rather than calling the tracking mode
+                 ;; function, to avoid a gratuitous resync check; the default
+                 ;; should be the user's home directory, be it local or remote.
+                 (setq comint-file-name-prefix
+                       (concat "/" rlogin-remote-user "@" rlogin-host ":"))
+                 (cd-absolute comint-file-name-prefix))
+                ((null rlogin-directory-tracking-mode))
+                (t
+                 (cd-absolute (concat comint-file-name-prefix "~/"))))
+        (error nil))))))
+
+(put 'rlogin-mode 'mode-class 'special)
 
 (defun rlogin-mode ()
   "Set major-mode for rlogin sessions.
@@ -319,4 +365,6 @@ Delete ARG characters forward, or send a C-d to process if at end of buffer."
       (comint-dynamic-complete)
     (insert "\C-i")))
 
+(provide 'rlogin)
+
 ;;; rlogin.el ends here