diff lisp/net/tramp.el @ 51177:6234a4fe96f9

Version 2.0.34 (of Tramp) released. (tramp-handle-file-symlink-p): If target of symlink is absolute, return a Tramp filename. (Ie, return "/user@host:/target" instead of "/target".) (tramp-handle-file-truename): Deal with new return value from `file-symlink-p'. (tramp-handle-expand-file-name): Make default method explicit in file name. (tramp-unified-filenames): Move to an earlier spot in the file. (top-level): If tramp-unified-filenames is set and we're running on XEmacs, load tramp-efs. (tramp-wait-for-shell-prompt, tramp-barf-if-no-shell-prompt): New functions, used by tramp-send-command-internal. (tramp-open-connection-setup-interactive-shell): Simplify using `tramp-send-command-internal'. (tramp-send-command-internal): New function. (tramp-methods): New entries "remsh" and "remcp" are like "rsh" and "rcp" but invoke "remsh" instead of "rsh". This is useful on Cray systems, for instance. Unify tramp-rsh-program, tramp-telnet-program, tramp-su-program into tramp-login-program. Likewise with tramp-login-args, tramp-copy-program, tramp-copy-args, tramp-copy-keep-date-arg. Users changed. New method plink1; like plink but pass "-1" to force protocol version 1. (tramp-default-method): Use plink as the default on machines where the plink program is present. (tramp-completion-file-name-handler): Add safe-magic property. (tramp-shell-prompt-pattern): Allow ANSI escapes at end of prompt. (ANSI escapes elsewhere in the prompt are recognized properly already.)
author Kai Großjohann <kgrossjo@eu.uu.net>
date Sat, 24 May 2003 14:10:15 +0000
parents 5b6aaf393205
children 978e262c8f3a
line wrap: on
line diff
--- a/lisp/net/tramp.el	Sat May 24 08:58:03 2003 +0000
+++ b/lisp/net/tramp.el	Sat May 24 14:10:15 2003 +0000
@@ -87,9 +87,18 @@
 (unless (fboundp 'uudecode-decode-region)
   (autoload 'uudecode-decode-region "uudecode"))
 
-;; ;; It does not work to load EFS after loading TRAMP.  
-;; (when (fboundp 'efs-file-handler-function)
-;;   (require 'efs))
+;; XEmacs is distributed with few Lisp packages.  Further packages are
+;; installed using EFS.  If we use a unified filename format, then
+;; Tramp is required in addition to EFS.  (But why can't Tramp just
+;; disable EFS when Tramp is loaded?  Then XEmacs can ship with EFS
+;; just like before.)  Another reason for using a separate filename
+;; syntax on XEmacs is that EFS hooks into XEmacs in many places, but
+;; Tramp only knows how to deal with `file-name-handler-alist', not
+;; the other places.
+;;;###autoload
+(defvar tramp-unified-filenames (not (featurep 'xemacs))
+  "Non-nil means to use unified Ange-FTP/Tramp filename syntax.
+Nil means to use a separate filename syntax for Tramp.")
 
 ;; Load foreign methods.  Because they do require Tramp internally, this
 ;; must be done with the `eval-after-load' trick.
@@ -98,6 +107,9 @@
 (unless (featurep 'xemacs)
   (eval-after-load "tramp"
     '(require 'tramp-ftp)))
+(when (and tramp-unified-filenames (featurep 'xemacs))
+  (eval-after-load "tramp"
+    '(require 'tramp-efs)))
 
 ;; tramp-smb uses "smbclient" from Samba.
 ;; Not available under Cygwin and Windows, because they don't offer
@@ -123,19 +135,6 @@
   (when (fboundp 'byte-compiler-options)
     (byte-compiler-options (warnings (- unused-vars)))))
 
-;; XEmacs is distributed with few Lisp packages.  Further packages are
-;; installed using EFS.  If we use a unified filename format, then
-;; Tramp is required in addition to EFS.  (But why can't Tramp just
-;; disable EFS when Tramp is loaded?  Then XEmacs can ship with EFS
-;; just like before.)  Another reason for using a separate filename
-;; syntax on XEmacs is that EFS hooks into XEmacs in many places, but
-;; Tramp only knows how to deal with `file-name-handler-alist', not
-;; the other places.
-;;;###autoload
-(defvar tramp-unified-filenames (not (featurep 'xemacs))
-  "Non-nil means to use unified Ange-FTP/Tramp filename syntax.
-Nil means to use a separate filename syntax for Tramp.")
-
 ;;; User Customizable Internal Variables:
 
 (defgroup tramp nil
@@ -234,265 +233,198 @@
 
 (defcustom tramp-methods
   '( ("rcp"   (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "rsh")
-              (tramp-rcp-program          "rcp")
+              (tramp-login-program        "rsh")
+              (tramp-copy-program         "rcp")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             nil)
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           nil)
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    "-p"))
      ("scp"   (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          "scp")
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         "scp")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args             nil)
+              (tramp-copy-keep-date-arg    "-p"))
      ("scp1"  (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          "scp")
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         "scp")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-1" "-e" "none"))
-              (tramp-rcp-args             ("-1"))
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-1" "-e" "none"))
+              (tramp-copy-args            ("-1"))
+              (tramp-copy-keep-date-arg    "-p"))
      ("scp2"  (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          "scp")
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         "scp")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-2" "-e" "none"))
-              (tramp-rcp-args             ("-2"))
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-2" "-e" "none"))
+              (tramp-copy-args            ("-2"))
+              (tramp-copy-keep-date-arg    "-p"))
      ("scp1_old"
               (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh1")
-              (tramp-rcp-program          "scp1")
+              (tramp-login-program        "ssh1")
+              (tramp-copy-program         "scp1")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    "-p"))
      ("scp2_old"
               (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh2")
-              (tramp-rcp-program          "scp2")
+              (tramp-login-program        "ssh2")
+              (tramp-copy-program         "scp2")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    "-p"))
      ("rsync" (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          "rsync")
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         "rsync")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             ("-e" "ssh"))
-              (tramp-rcp-keep-date-arg    "-t")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args            ("-e" "ssh"))
+              (tramp-copy-keep-date-arg    "-t"))
+     ("remcp" (tramp-connection-function  tramp-open-connection-rsh)
+              (tramp-login-program        "remsh")
+              (tramp-copy-program         "rcp")
+              (tramp-remote-sh            "/bin/sh")
+              (tramp-login-args           nil)
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    "-p"))
      ("rsh"   (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "rsh")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "rsh")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             nil)
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           nil)
+              (tramp-copy-args             nil)
+              (tramp-copy-keep-date-arg    nil))
      ("ssh"   (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args             nil)
+              (tramp-copy-keep-date-arg    nil))
      ("ssh1"  (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-1" "-e" "none"))
-              (tramp-rcp-args             ("-1"))
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-1" "-e" "none"))
+              (tramp-copy-args            ("-1"))
+              (tramp-copy-keep-date-arg    nil))
      ("ssh2"  (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-2" "-e" "none"))
-              (tramp-rcp-args             ("-2"))
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-2" "-e" "none"))
+              (tramp-copy-args            ("-2"))
+              (tramp-copy-keep-date-arg    nil))
      ("ssh1_old"
               (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh1")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "ssh1")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("ssh2_old"
               (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh2")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "ssh2")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
+     ("remsh" (tramp-connection-function  tramp-open-connection-rsh)
+              (tramp-login-program        "remsh")
+              (tramp-copy-program         nil)
+              (tramp-remote-sh            "/bin/sh")
+              (tramp-login-args           nil)
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("telnet"
               (tramp-connection-function  tramp-open-connection-telnet)
-              (tramp-rsh-program          nil)
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "telnet")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             nil)
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       "telnet")
-              (tramp-telnet-args          nil))
+              (tramp-login-args           nil)
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("su"    (tramp-connection-function  tramp-open-connection-su)
-              (tramp-rsh-program          nil)
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "su")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             nil)
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           "su")
-              (tramp-su-args              ("-" "%u"))
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-" "%u"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("sudo"  (tramp-connection-function  tramp-open-connection-su)
-              (tramp-rsh-program          nil)
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "sudo")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             nil)
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           "sudo")
-              (tramp-su-args              ("-u" "%u" "-s"))
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-u" "%u" "-s"
+					   "-p" "Password:"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("multi" (tramp-connection-function  tramp-open-connection-multi)
-              (tramp-rsh-program          nil)
-              (tramp-rcp-program          nil)
+              (tramp-login-program        nil)
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             nil)
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           nil)
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("scpx"  (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          "scp")
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         "scp")
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none" "-t" "-t" "/bin/sh"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none" "-t" "-t" "/bin/sh"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    "-p"))
      ("sshx"  (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "ssh")
-              (tramp-rcp-program          nil)
+              (tramp-login-program        "ssh")
+              (tramp-copy-program         nil)
               (tramp-remote-sh            "/bin/sh")
-              (tramp-rsh-args             ("-e" "none" "-t" "-t" "/bin/sh"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    nil)
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("-e" "none" "-t" "-t" "/bin/sh"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    nil))
      ("krlogin"
               (tramp-connection-function  tramp-open-connection-rsh)
-	      (tramp-rsh-program          "krlogin")
-	      (tramp-rcp-program          nil)
+	      (tramp-login-program        "krlogin")
+	      (tramp-copy-program         nil)
 	      (tramp-remote-sh            "/bin/sh")
-	      (tramp-rsh-args             ("-x"))
-	      (tramp-rcp-args             nil)
-	      (tramp-rcp-keep-date-arg    nil)
-	      (tramp-su-program           nil)
-	      (tramp-su-args              nil)
-	      (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+	      (tramp-login-args           ("-x"))
+	      (tramp-copy-args            nil)
+	      (tramp-copy-keep-date-arg    nil))
      ("plink"
               (tramp-connection-function  tramp-open-connection-rsh)
-	      (tramp-rsh-program          "plink")
-	      (tramp-rcp-program          nil)
+	      (tramp-login-program        "plink")
+	      (tramp-copy-program         nil)
 	      (tramp-remote-sh            "/bin/sh")
-	      (tramp-rsh-args             ("-ssh")) ;optionally add "-v"
-	      (tramp-rcp-args             nil)
-	      (tramp-rcp-keep-date-arg    nil)
-	      (tramp-su-program           nil)
-	      (tramp-su-args              nil)
-	      (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+	      (tramp-login-args           ("-ssh")) ;optionally add "-v"
+	      (tramp-copy-args            nil)
+	      (tramp-copy-keep-date-arg    nil))
+     ("plink1"
+              (tramp-connection-function  tramp-open-connection-rsh)
+	      (tramp-login-program        "plink")
+	      (tramp-copy-program         nil)
+	      (tramp-remote-sh            "/bin/sh")
+	      (tramp-login-args           ("-1" "-ssh")) ;optionally add "-v"
+	      (tramp-copy-args            nil)
+	      (tramp-copy-keep-date-arg    nil))
      ("pscp"
               (tramp-connection-function  tramp-open-connection-rsh)
-	      (tramp-rsh-program          "plink")
-	      (tramp-rcp-program          "pscp")
+	      (tramp-login-program        "plink")
+	      (tramp-copy-program         "pscp")
 	      (tramp-remote-sh            "/bin/sh")
-	      (tramp-rsh-args             ("-ssh"))
-	      (tramp-rcp-args             nil)
-	      (tramp-rcp-keep-date-arg    "-p")
-	      (tramp-su-program           nil)
-	      (tramp-su-args              nil)
-	      (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+	      (tramp-login-args           ("-ssh"))
+	      (tramp-copy-args            nil)
+	      (tramp-copy-keep-date-arg    "-p"))
      ("fcp"   
 	      (tramp-connection-function  tramp-open-connection-rsh)
-              (tramp-rsh-program          "fsh")
-              (tramp-rcp-program          "fcp")
+              (tramp-login-program        "fsh")
+              (tramp-copy-program         "fcp")
               (tramp-remote-sh            "/bin/sh -i")
-              (tramp-rsh-args             ("sh" "-i"))
-              (tramp-rcp-args             nil)
-              (tramp-rcp-keep-date-arg    "-p")
-              (tramp-su-program           nil)
-              (tramp-su-args              nil)
-              (tramp-telnet-program       nil)
-              (tramp-telnet-args          nil))
+              (tramp-login-args           ("sh" "-i"))
+              (tramp-copy-args            nil)
+              (tramp-copy-keep-date-arg    "-p"))
      )
   "*Alist of methods for remote files.
 This is a list of entries of the form (NAME PARAM1 PARAM2 ...).
@@ -510,57 +442,52 @@
     which groks tilde expansion, but it can search for it.  Also note
     that \"/bin/sh\" exists on all Unixen, this might not be true for
     the value that you decide to use.  You Have Been Warned.
-  * `tramp-rsh-program'
-    This specifies the name of the program to use for rsh; this might be
-    the absolute filename of rsh or the name of a workalike program.
-  * `tramp-rsh-args'
+  * `tramp-login-program'
+    This specifies the name of the program to use for logging in to the
+    remote host.  Depending on `tramp-connection-function', this may be
+    the name of rsh or a workalike program (when
+    `tramp-connection-function' is `tramp-open-connection-rsh'), or the
+    name of telnet or a workalike (for `tramp-open-connection-telnet'),
+    or the name of su or a workalike (for `tramp-open-connection-su').
+  * `tramp-login-args'
     This specifies the list of arguments to pass to the above
     mentioned program.  Please note that this is a list of arguments,
     that is, normally you don't want to put \"-a -b\" or \"-f foo\"
     here.  Instead, you want two list elements, one for \"-a\" and one
     for \"-b\", or one for \"-f\" and one for \"foo\".
-  * `tramp-rcp-program'
-    This specifies the name of the program to use for rcp; this might be
-    the absolute filename of rcp or the name of a workalike program.
-  * `tramp-rcp-args'
+    If `tramp-connection-function' is `tramp-open-connection-su', then
+    \"%u\" in this list is replaced by the user name, and \"%%\" can
+    be used to obtain a literal percent character.
+  * `tramp-copy-program'
+    This specifies the name of the program to use for remotely copying
+    the file; this might be the absolute filename of rcp or the name of
+    a workalike program.
+  * `tramp-copy-args'
     This specifies the list of parameters to pass to the above mentioned
-    program, the hints for `tramp-rsh-args' also apply here.
-  * `tramp-rcp-keep-date-arg'
-    This specifies the parameter to use for `rcp' when the timestamp
-    of the original file should be kept.  For `rcp', use `-p', for
+    program, the hints for `tramp-login-args' also apply here.
+  * `tramp-copy-keep-date-arg'
+    This specifies the parameter to use for the copying program when the
+    timestamp of the original file should be kept.  For `rcp', use `-p', for
     `rsync', use `-t'.
-  * `tramp-su-program'
-    This specifies the name of the program to use for `su'.
-  * `tramp-su-args'
-    This specifies the list of arguments to pass to `su'.
-    \"%u\" is replaced by the user name, use \"%%\" for a literal
-    percent character.
-  * `tramp-telnet-program'
-    Specifies the telnet program to use when using
-    `tramp-open-connection-telnet' to log in.
-  * `tramp-telnet-args'
-    Specifies list of arguments to pass to `telnet'.  The hints for
-    `tramp-rsh-args' also apply here.
-
-What does all this mean?  Well, you should specify `tramp-rsh-program',
-`tramp-telnet-program' or `tramp-su-program' for all methods; this program
-is used to log in to the remote site.  Then, there are two ways to
-actually transfer the files between the local and the remote side.
-One way is using an additional rcp-like program.  If you want to do
-this, set `tramp-rcp-program' in the method.
+
+What does all this mean?  Well, you should specify `tramp-login-program'
+for all methods; this program is used to log in to the remote site.  Then,
+there are two ways to actually transfer the files between the local and the
+remote side.  One way is using an additional rcp-like program.  If you want
+to do this, set `tramp-copy-program' in the method.
 
 Another possibility for file transfer is inline transfer, i.e. the
-file is passed through the same buffer used by `tramp-rsh-program'.  In
+file is passed through the same buffer used by `tramp-login-program'.  In
 this case, the file contents need to be protected since the
-`tramp-rsh-program' might use escape codes or the connection might not
+`tramp-login-program' might use escape codes or the connection might not
 be eight-bit clean.  Therefore, file contents are encoded for transit.
 See the variable `tramp-coding-commands' for details.
 
 So, to summarize: if the method is an out-of-band method, then you
-must specify `tramp-rcp-program' and `tramp-rcp-args'.  If it is an
+must specify `tramp-copy-program' and `tramp-copy-args'.  If it is an
 inline method, then these two parameters should be nil.  Every method,
 inline or out of band, must specify `tramp-connection-function' plus
-the associated arguments (for example, the telnet program if you chose
+the associated arguments (for example, the login program if you chose
 `tramp-open-connection-telnet').
 
 Notes:
@@ -574,19 +501,16 @@
   :type '(repeat
           (cons string
                 (set (list (const tramp-connection-function) function)
-                     (list (const tramp-rsh-program)
+                     (list (const tramp-login-program)
 			   (choice (const nil) string))
-                     (list (const tramp-rcp-program)
+                     (list (const tramp-copy-program)
 			   (choice (const nil) string))
                      (list (const tramp-remote-sh)
 			   (choice (const nil) string))
-                     (list (const tramp-rsh-args) (repeat string))
-                     (list (const tramp-rcp-args) (repeat string))
-                     (list (const tramp-rcp-keep-date-arg)
+                     (list (const tramp-login-args) (repeat string))
+                     (list (const tramp-copy-args) (repeat string))
+                     (list (const tramp-copy-keep-date-arg)
 			   (choice (const nil) string))
-                     (list (const tramp-su-program)
-			   (choice (const nil) string))
-                     (list (const tramp-su-args) (repeat string))
                      (list (const tramp-encoding-command)
 			   (choice (const nil) string))
                      (list (const tramp-decoding-command)
@@ -594,10 +518,7 @@
                      (list (const tramp-encoding-function)
 			   (choice (const nil) function))
                      (list (const tramp-decoding-function)
-			   (choice (const nil) function))
-                     (list (const tramp-telnet-program)
-			   (choice (const nil) string))
-                     (list (const tramp-telnet-args) (repeat string))))))
+			   (choice (const nil) function))))))
 
 (defcustom tramp-multi-methods '("multi" "multiu")
   "*List of multi-hop methods.
@@ -609,9 +530,10 @@
 (defcustom tramp-multi-connection-function-alist
   '(("telnet" tramp-multi-connect-telnet "telnet %h%n")
     ("rsh"    tramp-multi-connect-rlogin "rsh %h -l %u%n")
+    ("remsh"  tramp-multi-connect-rlogin "remsh %h -l %u%n")
     ("ssh"    tramp-multi-connect-rlogin "ssh %h -l %u%n")
     ("su"     tramp-multi-connect-su     "su - %u%n")
-    ("sudo"   tramp-multi-connect-su     "sudo -u %u -s%n"))
+    ("sudo"   tramp-multi-connect-su     "sudo -u %u -s -p Password:%n"))
   "*List of connection functions for multi-hop methods.
 Each list item is a list of three items (METHOD FUNCTION COMMAND),
 where METHOD is the name as used in the file name, FUNCTION is the
@@ -629,7 +551,11 @@
   :group 'tramp
   :type '(repeat (list string function string)))
 
-(defcustom tramp-default-method "ssh"
+(defcustom tramp-default-method
+  (if (and (fboundp 'executable-find)
+	   (executable-find "plink"))
+      "plink"
+    "ssh")
   "*Default method to use for transferring files.
 See `tramp-methods' for possibilities.
 Also see `tramp-default-method-alist'."
@@ -659,8 +585,7 @@
   (unless (memq system-type '(windows-nt))
     '((tramp-parse-rhosts "/etc/hosts.equiv")
       (tramp-parse-rhosts "~/.rhosts")))
-  "Default list of (FUNCTION FILE) pairs to be examined for rsh methods."
-)
+  "Default list of (FUNCTION FILE) pairs to be examined for rsh methods.")
 
 ;; Default values for non-Unices seeked
 (defconst tramp-completion-function-alist-ssh
@@ -673,22 +598,19 @@
       (tramp-parse-rhosts  "~/.shosts")
       (tramp-parse-shosts  "~/.ssh/known_hosts")
       (tramp-parse-sconfig "~/.ssh/config")))
-  "Default list of (FUNCTION FILE) pairs to be examined for ssh methods."
-)
+  "Default list of (FUNCTION FILE) pairs to be examined for ssh methods.")
 
 ;; Default values for non-Unices seeked
 (defconst tramp-completion-function-alist-telnet
   (unless (memq system-type '(windows-nt))
     '((tramp-parse-hosts "/etc/hosts")))
-  "Default list of (FUNCTION FILE) pairs to be examined for telnet methods."
-)
+  "Default list of (FUNCTION FILE) pairs to be examined for telnet methods.")
 
 ;; Default values for non-Unices seeked
 (defconst tramp-completion-function-alist-su
   (unless (memq system-type '(windows-nt))
     '((tramp-parse-passwd "/etc/passwd")))
-  "Default list of (FUNCTION FILE) pairs to be examined for su methods."
-)
+  "Default list of (FUNCTION FILE) pairs to be examined for su methods.")
 
 (defcustom tramp-completion-function-alist
   (list (cons "rcp"      tramp-completion-function-alist-rsh)
@@ -774,14 +696,14 @@
   :type 'regexp)
 
 (defcustom tramp-shell-prompt-pattern
-  "^[^#$%>\n]*[#$%>] *"
+  "^[^#$%>\n]*[#$%>] *\\(\e\\[[0-9;]*[a-zA-Z]\\)?"
   "Regexp to match prompts from remote shell.
 Normally, Tramp expects you to configure `shell-prompt-pattern'
 correctly, but sometimes it happens that you are connecting to a
 remote host which sends a different kind of shell prompt.  Therefore,
 Tramp recognizes things matched by `shell-prompt-pattern' as prompt,
 and also things matched by this variable.  The default value of this
-variable is the same as the default value of `shell-prompt-pattern',
+variable is similar to the default value of `shell-prompt-pattern',
 which should work well in many cases."
   :group 'tramp
   :type 'regexp)
@@ -1315,27 +1237,27 @@
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
-(defvar tramp-rsh-program nil
+(defvar tramp-login-program nil
   "This internal variable holds a parameter for `tramp-methods'.
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
-(defvar tramp-rsh-args nil
+(defvar tramp-login-args nil
   "This internal variable holds a parameter for `tramp-methods'.
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
-(defvar tramp-rcp-program nil
+(defvar tramp-copy-program nil
   "This internal variable holds a parameter for `tramp-methods'.
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
-(defvar tramp-rcp-args nil
+(defvar tramp-copy-args nil
   "This internal variable holds a parameter for `tramp-methods'.
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
-(defvar tramp-rcp-keep-date-arg nil
+(defvar tramp-copy-keep-date-arg nil
   "This internal variable holds a parameter for `tramp-methods'.
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
@@ -1360,21 +1282,6 @@
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
-(defvar tramp-telnet-program nil
-  "This internal variable holds a parameter for `tramp-methods'.
-In the connection buffer, this variable has the value of the like-named
-method parameter, as specified in `tramp-methods' (which see).")
-
-(defvar tramp-telnet-args nil
-  "This internal variable holds a parameter for `tramp-methods'.
-In the connection buffer, this variable has the value of the like-named
-method parameter, as specified in `tramp-methods' (which see).")
-
-(defvar tramp-su-program nil
-  "This internal variable holds a parameter for `tramp-methods'.
-In the connection buffer, this variable has the value of the like-named
-method parameter, as specified in `tramp-methods' (which see).")
-
 ;; CCC `local in each buffer'?
 (defvar tramp-ls-command nil
   "This command is used to get a long listing with numeric user and group ids.
@@ -1944,6 +1851,17 @@
 	       (setq numchase (1+ numchase))
 	       (when (file-name-absolute-p symlink-target)
 		 (setq result nil))
+	       ;; If the symlink was absolute, we'll get a string like
+	       ;; "/user@host:/some/target"; extract the
+	       ;; "/some/target" part from it.
+	       (when (tramp-tramp-file-p symlink-target)
+		 (with-parsed-tramp-file-name symlink-target sym
+		   (unless (equal (list multi-method method user host)
+				  (list sym-multi-method sym-method
+					sym-user sym-host))
+		     (error "Symlink target `%s' on wrong host"
+			    symlink-target))
+		   (setq symlink-target localname)))
 	       (setq steps
 		     (append (tramp-split-string symlink-target "/") steps)))
 	      (t
@@ -2321,7 +2239,13 @@
   "Like `file-symlink-p' for tramp files."
   (with-parsed-tramp-file-name filename nil
     (let ((x (car (tramp-handle-file-attributes filename))))
-      (when (stringp x) x))))
+      (when (stringp x)
+	;; When Tramp is running on VMS, then `file-name-absolute-p'
+	;; might do weird things.
+	(if (file-name-absolute-p x)
+	    (tramp-make-tramp-file-name
+	     multi-method method user host x)
+	  x)))))
 
 (defun tramp-handle-file-writable-p (filename)
   "Like `file-writable-p' for tramp files."
@@ -2604,7 +2528,7 @@
 	    ;; source and target file.
 
 	    ;; CCC: If both source and target are Tramp files,
-	    ;; and both are using the same rcp-program, then we
+	    ;; and both are using the same copy-program, then we
 	    ;; can invoke rcp directly.  Note that
 	    ;; default-directory should point to a local
 	    ;; directory if we want to invoke rcp.
@@ -2922,7 +2846,8 @@
 	;; would otherwise use backslash.
 	(let ((directory-sep-char ?/))
 	  (tramp-make-tramp-file-name
-	   multi-method method user host
+	   multi-method (or method (tramp-find-default-method user host))
+	   user host
 	   (tramp-drop-volume-letter
 	    (tramp-run-real-handler 'expand-file-name
 				    (list localname)))))))))
@@ -3012,14 +2937,14 @@
   (with-parsed-tramp-file-name filename nil
     (let ((output-buf (get-buffer-create "*tramp output*"))
 	  (tramp-buf (tramp-get-buffer multi-method method user host))
-	  (rcp-program (tramp-get-rcp-program
-			multi-method
-			(tramp-find-method multi-method method user host)
-			user host))
-	  (rcp-args (tramp-get-rcp-args
-		     multi-method
-		     (tramp-find-method multi-method method user host)
-		     user host))
+	  (copy-program (tramp-get-copy-program
+			 multi-method
+			 (tramp-find-method multi-method method user host)
+			 user host))
+	  (copy-args (tramp-get-copy-args
+		      multi-method
+		      (tramp-find-method multi-method method user host)
+		      user host))
 	  ;; We used to bind the following as late as possible.
 	  ;; loc-enc and loc-dec were bound directly before the if
 	  ;; statement that checks them.  But the functions
@@ -3035,7 +2960,7 @@
 	(error "Cannot make local copy of non-existing file `%s'"
 	       filename))
       (setq tmpfil (tramp-make-temp-file))
-      (cond (rcp-program
+      (cond (copy-program
 	     ;; Use rcp-like program for file transfer.
 	     (tramp-message-for-buffer
 	      multi-method method user host
@@ -3044,11 +2969,11 @@
 	     (unless (equal
 		      0
 		      (apply #'call-process
-			     rcp-program
+			     copy-program
 			     nil output-buf nil
-			     (append rcp-args
+			     (append copy-args
 				     (list
-				      (tramp-make-rcp-program-file-name
+				      (tramp-make-copy-program-file-name
 				       user host
 				       (tramp-shell-quote-argument localname))
 				      tmpfil))))
@@ -3056,7 +2981,7 @@
 	       (error
 		(concat "tramp-handle-file-local-copy: `%s' didn't work, "
 			"see buffer `%s' for details")
-		rcp-program output-buf))
+		copy-program output-buf))
 	     (tramp-message-for-buffer
 	      multi-method method user host
 	      5 "Fetching %s to tmp file %s...done" filename tmpfil))
@@ -3180,10 +3105,11 @@
       (error "File not overwritten")))
   (with-parsed-tramp-file-name filename nil
     (let ((curbuf (current-buffer))
-	  (rcp-program (tramp-get-rcp-program
-			multi-method (tramp-find-method multi-method method user host)
-			user host))
-	  (rcp-args (tramp-get-rcp-args
+	  (copy-program (tramp-get-copy-program
+			 multi-method
+			 (tramp-find-method multi-method method user host)
+			 user host))
+	  (copy-args (tramp-get-copy-args
 		     multi-method
 		     (tramp-find-method multi-method method user host)
 		     user host))
@@ -3221,17 +3147,17 @@
       ;; decoding command must be specified.  However, if the method
       ;; _also_ specifies an encoding function, then that is used for
       ;; encoding the contents of the tmp file.
-      (cond (rcp-program
+      (cond (copy-program
 	     ;; use rcp-like program for file transfer
-	     (let ((argl (append rcp-args
+	     (let ((argl (append copy-args
 				 (list
 				  tmpfil
-				  (tramp-make-rcp-program-file-name
+				  (tramp-make-copy-program-file-name
 				   user host
 				   (tramp-shell-quote-argument localname))))))
 	       (tramp-message-for-buffer
 		multi-method method user host
-		6 "Writing tmp file using `%s'..." rcp-program)
+		6 "Writing tmp file using `%s'..." copy-program)
 	       (save-excursion (set-buffer trampbuf) (erase-buffer))
 	       (when tramp-debug-buffer
 		 (save-excursion
@@ -3239,19 +3165,19 @@
 						       method user host))
 		   (goto-char (point-max))
 		   (tramp-insert-with-face
-		    'bold (format "$ %s %s\n" rcp-program
+		    'bold (format "$ %s %s\n" copy-program
 				  (mapconcat 'identity argl " ")))))
 	       (unless (equal 0
 			      (apply #'call-process
-				     rcp-program nil trampbuf nil argl))
+				     copy-program nil trampbuf nil argl))
 		 (pop-to-buffer trampbuf)
 		 (error
 		  "Cannot write region to file `%s', command `%s' failed"
-		  filename rcp-program))
+		  filename copy-program))
 	       (tramp-message-for-buffer
 		multi-method method user host
 		6 "Transferring file using `%s'...done"
-		rcp-program)))
+		copy-program)))
 	    ((and rem-enc rem-dec)
 	     ;; Use inline file transfer
 	     (let ((tmpbuf (get-buffer-create " *tramp file transfer*")))
@@ -3505,6 +3431,7 @@
        (fn (apply (cdr fn) args))
        (t (tramp-run-real-handler operation args))))))
 
+;;;###autoload
 (put 'tramp-file-name-handler 'file-remote-p t)	;for file-remote-p
 
 ;;;###autoload
@@ -3520,6 +3447,9 @@
 	(save-match-data (apply (cdr fn) args))
       (tramp-completion-run-real-handler operation args))))
 
+;;;###autoload
+(put 'tramp-completion-file-name-handler 'safe-magic t)
+
 ;; Register in file name handler alist
 ;;;###autoload
 (add-to-list 'file-name-handler-alist
@@ -4608,12 +4538,12 @@
              (p (apply 'start-process
                        (tramp-buffer-name multi-method method user host)
                        (tramp-get-buffer multi-method method user host)
-		       (tramp-get-telnet-program
+		       (tramp-get-login-program
 			multi-method
 			(tramp-find-method multi-method method user host)
 			user host)
                        host
-		       (tramp-get-telnet-args
+		       (tramp-get-login-args
 			multi-method
 			(tramp-find-method multi-method method user host)
 			user host)))
@@ -4665,18 +4595,18 @@
     (let ((process-environment (copy-sequence process-environment))
 	  (bufnam (tramp-buffer-name multi-method method user host))
 	  (buf (tramp-get-buffer multi-method method user host))
-	  (rsh-program (tramp-get-rsh-program
+	  (login-program (tramp-get-login-program
 			multi-method
 			(tramp-find-method multi-method method user host)
 			user host))
-	  (rsh-args (tramp-get-rsh-args
+	  (login-args (tramp-get-login-args
 		     multi-method
 		     (tramp-find-method multi-method method user host)
 		     user host)))
       ;; The following should be changed.  We need a more general
       ;; mechanism to parse extra host args.
       (when (string-match "\\([^#]*\\)#\\(.*\\)" host)
-	(setq rsh-args (cons "-p" (cons (match-string 2 host) rsh-args)))
+	(setq login-args (cons "-p" (cons (match-string 2 host) rsh-args)))
 	(setq host (match-string 1 host)))
       (setenv "TERM" tramp-terminal-type)
       (let* ((default-directory (tramp-temporary-file-directory))
@@ -4687,10 +4617,10 @@
                                                   (> emacs-major-version 20))
                                        tramp-dos-coding-system))
              (p (if (and user (not (string= user "")))
-                    (apply #'start-process bufnam buf rsh-program  
-                           host "-l" user rsh-args)
-                  (apply #'start-process bufnam buf rsh-program 
-                         host rsh-args)))
+                    (apply #'start-process bufnam buf login-program  
+                           host "-l" user login-args)
+                  (apply #'start-process bufnam buf login-program 
+                         host login-args)))
              (found nil))
         (process-kill-without-query p)
 
@@ -4740,14 +4670,14 @@
              (p (apply 'start-process
                        (tramp-buffer-name multi-method method user host)
                        (tramp-get-buffer multi-method method user host)
-		       (tramp-get-su-program
+		       (tramp-get-login-program
 			multi-method
 			(tramp-find-method multi-method method user host)
 			user host)
                        (mapcar
                         (lambda (x)
 			  (format-spec x `((?u . ,(or user "root")))))
-                        (tramp-get-su-args
+                        (tramp-get-login-args
 			 multi-method
 			 (tramp-find-method multi-method method user host)
 			 user host))))
@@ -4951,6 +4881,24 @@
                   "]]"))))
     found))
 
+(defun tramp-wait-for-shell-prompt (proc timeout)
+  "Wait for the shell prompt to appear from process PROC within TIMEOUT seconds.
+See `tramp-wait-for-regexp' for more details.
+Shell prompt pattern is determined by variables `shell-prompt-pattern'
+and `tramp-shell-prompt-pattern'."
+  (tramp-wait-for-regexp
+   proc timeout
+   (format "\\(%s\\|%s\\)\\'"
+	   shell-prompt-pattern tramp-shell-prompt-pattern)))
+
+(defun tramp-barf-if-no-shell-prompt (proc timeout &rest error-args)
+  "Wait for shell prompt and barf if none appears.
+Looks at process PROC to see if a shell prompt appears in TIMEOUT
+seconds.  If not, it produces an error message with the given ERROR-ARGS."
+  (unless (tramp-wait-for-shell-prompt proc timeout)
+    (pop-to-buffer (buffer-name))
+    (apply 'error error-args)))
+
 (defun tramp-enter-password (p prompt)
   "Prompt for a password and send it to the remote end.
 Uses PROMPT as a prompt and sends the password to process P."
@@ -4994,55 +4942,31 @@
   ;; because that is read by some sh implementations (eg, bash when
   ;; called as sh) on startup; this way, we avoid the startup file
   ;; clobbering $PS1.
-  (process-send-string nil (format "exec env 'ENV=' 'PS1=$ ' %s%s"
-                                   (tramp-get-remote-sh
-				    multi-method method user host)
-                                   tramp-rsh-end-of-line))
-  (when tramp-debug-buffer
-    (save-excursion
-      (set-buffer (tramp-get-debug-buffer multi-method method user host))
-      (goto-char (point-max))
-      (tramp-insert-with-face
-       'bold (format "$ exec env PS1='$ ' %s\n"
-		     (tramp-get-remote-sh multi-method method user host)))))
-  (tramp-message 9 "Waiting 30s for remote `%s' to come up..."
-               (tramp-get-remote-sh multi-method method user host))
-  (unless (tramp-wait-for-regexp
-	   p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error "Remote `%s' didn't come up.  See buffer `%s' for details"
-           (tramp-get-remote-sh multi-method method user host)
-	   (buffer-name)))
-  (tramp-message 9 "Setting up remote shell environment")
+  (tramp-send-command-internal
+   multi-method method user host
+   (format "exec env 'ENV=' 'PS1=$ ' %s"
+	   (tramp-get-remote-sh multi-method method user host))
+   (format "remote `%s' to come up"
+	   (tramp-get-remote-sh multi-method method user host)))
+  (tramp-barf-if-no-shell-prompt
+   p 30
+   "Remote `%s' didn't come up.  See buffer `%s' for details"
+   (tramp-get-remote-sh multi-method method user host)
+   (buffer-name))
+  (tramp-message 8 "Setting up remote shell environment")
   (tramp-discard-garbage-erase-buffer p multi-method method user host)
-  (process-send-string
-   nil (format "stty -inlcr -echo kill '^U'%s" tramp-rsh-end-of-line))
-  (unless (tramp-wait-for-regexp
-	   p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error "Couldn't `stty -echo', see buffer `%s'" (buffer-name)))
+  (tramp-send-command-internal multi-method method user host
+			       "stty -inlcr -echo kill '^U'")
   (erase-buffer)
-  (process-send-string nil (format "TERM=dumb; export TERM%s"
-                                   tramp-rsh-end-of-line))
-  (unless (tramp-wait-for-regexp
-	   p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error "Couldn't `TERM=dumb; export TERM', see buffer `%s'" (buffer-name)))
+  (tramp-send-command-internal multi-method method user host
+			       "TERM=dumb; export TERM")
   ;; Try to set up the coding system correctly.
   ;; CCC this can't be the right way to do it.  Hm.
   (save-excursion
     (erase-buffer)
     (tramp-message 9 "Determining coding system")
-    (process-send-string nil (format "echo foo ; echo bar %s"
-                                     tramp-rsh-end-of-line))
-    (unless (tramp-wait-for-regexp
-             p 30 (format "\\(%s\\|%s\\)\\'"
-			  shell-prompt-pattern tramp-shell-prompt-pattern))
-      (pop-to-buffer (buffer-name))
-      (error "Couldn't `echo foo; echo bar' to determine line endings'"))
+    (tramp-send-command-internal multi-method method user host
+				 "echo foo ; echo bar")
     (goto-char (point-min))
     (if (featurep 'mule)
         ;; Use MULE to select the right EOL convention for communicating
@@ -5066,57 +4990,26 @@
         ;; because we're running on a non-MULE Emacs.  Let's try
         ;; stty, instead.
         (tramp-message 9 "Trying `stty -onlcr'")
-        (process-send-string nil (format "stty -onlcr%s" tramp-rsh-end-of-line))
-        (unless (tramp-wait-for-regexp
-                 p 30 (format "\\(%s\\|%s\\)\\'"
-			      shell-prompt-pattern tramp-shell-prompt-pattern))
-          (pop-to-buffer (buffer-name))
-          (error "Couldn't `stty -onlcr', see buffer `%s'" (buffer-name))))))
+	(tramp-send-command-internal multi-method method user host
+				     "stty -onlcr"))))
   (erase-buffer)
   (tramp-message
    9 "Waiting 30s for `HISTFILE=$HOME/.tramp_history; HISTSIZE=1'")
-  (process-send-string
-   nil (format "HISTFILE=$HOME/.tramp_history; HISTSIZE=1%s"
-               tramp-rsh-end-of-line))
-  (unless (tramp-wait-for-regexp
-           p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error (concat "Couldn't `HISTFILE=$HOME/.tramp_history; "
-                   "HISTSIZE=1', see buffer `%s'")
-           (buffer-name)))
+  (tramp-send-command-internal multi-method method user host
+			       "HISTFILE=$HOME/.tramp_history; HISTSIZE=1")
   (erase-buffer)
   (tramp-message 9 "Waiting 30s for `set +o vi +o emacs'")
-  (process-send-string
-   nil (format "set +o vi +o emacs%s"      ;mustn't `>/dev/null' with AIX?
-               tramp-rsh-end-of-line))
-  (unless (tramp-wait-for-regexp
-           p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error "Couldn't `set +o vi +o emacs', see buffer `%s'"
-           (buffer-name)))
+  (tramp-send-command-internal multi-method method user host
+			       "set +o vi +o emacs")
   (erase-buffer)
   (tramp-message 9 "Waiting 30s for `unset MAIL MAILCHECK MAILPATH'")
-  (process-send-string
-   nil (format "unset MAIL MAILCHECK MAILPATH 1>/dev/null 2>/dev/null%s"
-               tramp-rsh-end-of-line))
-  (unless (tramp-wait-for-regexp
-           p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error "Couldn't `unset MAIL MAILCHECK MAILPATH', see buffer `%s'"
-           (buffer-name)))
+  (tramp-send-command-internal
+   multi-method method user host
+   "unset MAIL MAILCHECK MAILPATH 1>/dev/null 2>/dev/null")
   (erase-buffer)
   (tramp-message 9 "Waiting 30s for `unset CDPATH'")
-  (process-send-string
-   nil (format "unset CDPATH%s" tramp-rsh-end-of-line))
-  (unless (tramp-wait-for-regexp
-           p 30 (format "\\(%s\\|%s\\)\\'"
-			shell-prompt-pattern tramp-shell-prompt-pattern))
-    (pop-to-buffer (buffer-name))
-    (error "Couldn't `unset CDPATH', see buffer `%s'"
-           (buffer-name)))
+  (tramp-send-command-internal multi-method method user host
+			       "unset CDPATH")
   (erase-buffer)
   (tramp-message 9 "Setting shell prompt")
   ;; Douglas Gray Stephens <DGrayStephens@slb.com> says that we must
@@ -5240,7 +5133,7 @@
 		 " -e '" tramp-perl-file-attributes "' $1 2>/dev/null\n"
 		 "}"))
 	(tramp-wait-for-output)
-	(unless (tramp-get-rcp-program
+	(unless (tramp-get-copy-program
 		 multi-method
 		 (tramp-find-method multi-method method user host)
 		 user host)
@@ -5282,7 +5175,7 @@
       (tramp-set-connection-property "ln" ln multi-method method user host)))
   (erase-buffer)
   ;; Find the right encoding/decoding commands to use.
-  (unless (tramp-get-rcp-program
+  (unless (tramp-get-copy-program
 	   multi-method
 	   (tramp-find-method multi-method method user host)
 	   user host)
@@ -5527,6 +5420,17 @@
     (process-send-string proc
                          (concat command tramp-rsh-end-of-line))))
 
+(defun tramp-send-command-internal
+  (multi-method method user host command &optional msg)
+  "Send command to remote host and wait for success.
+Sends COMMAND, then waits 30 seconds for shell prompt."
+  (tramp-send-command multi-method method user host command t t)
+  (when msg
+    (tramp-message 9 "Waiting 30s for %s..." msg))
+  (tramp-barf-if-no-shell-prompt
+   nil 30
+   "Couldn't `%s', see buffer `%s'" command (buffer-name)))
+  
 (defun tramp-wait-for-output (&optional timeout)
   "Wait for output from remote rsh command."
   (let ((proc (get-buffer-process (current-buffer)))
@@ -5964,8 +5868,8 @@
         (incf i)))
     (concat prefix hops localname)))
 
-(defun tramp-make-rcp-program-file-name (user host localname)
-  "Create a file name suitable to be passed to `rcp'."
+(defun tramp-make-copy-program-file-name (user host localname)
+  "Create a file name suitable to be passed to `rcp' and workalikes."
   (if user
       (format "%s@%s:%s" user host localname)
     (format "%s:%s" host localname)))
@@ -5973,8 +5877,8 @@
 (defun tramp-method-out-of-band-p (multi-method method user host)
   "Return t if this is an out-of-band method, nil otherwise.
 It is important to check for this condition, since it is not possible
-to enter a password for the `tramp-rcp-program'."
-  (tramp-get-rcp-program
+to enter a password for the `tramp-copy-program'."
+  (tramp-get-copy-program
    multi-method
    (tramp-find-method multi-method method user host)
    user host))
@@ -6072,70 +5976,41 @@
               (error "Method `%s' didn't specify a remote shell"
                      (or multi-method method)))))
 
-(defun tramp-get-rsh-program (multi-method method user host)
-  (second (or (assoc 'tramp-rsh-program
+(defun tramp-get-login-program (multi-method method user host)
+  (second (or (assoc 'tramp-login-program
                      (assoc (tramp-find-method multi-method method user host)
                             tramp-methods))
-              (error "Method `%s' didn't specify an rsh program"
+              (error "Method `%s' didn't specify a login program"
                      (or multi-method method)))))
 
-(defun tramp-get-rsh-args (multi-method method user host)
-  (second (or (assoc 'tramp-rsh-args
+(defun tramp-get-login-args (multi-method method user host)
+  (second (or (assoc 'tramp-login-args
                      (assoc (tramp-find-method multi-method method user host)
                             tramp-methods))
-              (error "Method `%s' didn't specify rsh args"
+              (error "Method `%s' didn't specify login args"
                      (or multi-method method)))))
 
-(defun tramp-get-rcp-program (multi-method method user host)
-  (second (or (assoc 'tramp-rcp-program
+(defun tramp-get-copy-program (multi-method method user host)
+  (second (or (assoc 'tramp-copy-program
                      (assoc (tramp-find-method multi-method method user host)
                             tramp-methods))
-              (error "Method `%s' didn't specify an rcp program"
+              (error "Method `%s' didn't specify a copy program"
                      (or multi-method method)))))
 
-(defun tramp-get-rcp-args (multi-method method user host)
-  (second (or (assoc 'tramp-rcp-args
+(defun tramp-get-copy-args (multi-method method user host)
+  (second (or (assoc 'tramp-copy-args
                      (assoc (tramp-find-method multi-method method user host)
                             tramp-methods))
-              (error "Method `%s' didn't specify rcp args"
+              (error "Method `%s' didn't specify copy args"
                      (or multi-method method)))))
 
-(defun tramp-get-rcp-keep-date-arg (multi-method method user host)
-  (second (or (assoc 'tramp-rcp-keep-date-arg
+(defun tramp-get-copy-keep-date-arg (multi-method method user host)
+  (second (or (assoc 'tramp-copy-keep-date-arg
                      (assoc (tramp-find-method multi-method method user host)
                             tramp-methods))
               (error "Method `%s' didn't specify `keep-date' arg for tramp"
                      (or multi-method method)))))
 
-(defun tramp-get-su-program (multi-method method user host)
-  (second (or (assoc 'tramp-su-program
-                     (assoc (tramp-find-method multi-method method user host)
-                            tramp-methods))
-              (error "Method `%s' didn't specify a su program"
-                     (or multi-method method)))))
-
-(defun tramp-get-su-args (multi-method method user host)
-  (second (or (assoc 'tramp-su-args
-                     (assoc (tramp-find-method multi-method method user host)
-                            tramp-methods))
-              (error "Method `%s' didn't specify su args"
-                     (or multi-method method)))))
-
-(defun tramp-get-telnet-program (multi-method method user host)
-  (second (or (assoc 'tramp-telnet-program
-                     (assoc (tramp-find-method multi-method method user host)
-                            tramp-methods))
-              (error "Method `%s' didn't specify a telnet program"
-                     (or multi-method method)))))
-
-(defun tramp-get-telnet-args (multi-method method user host)
-  (second (or (assoc 'tramp-telnet-args
-                     (assoc (tramp-find-method multi-method method user host)
-                            tramp-methods))
-              (error "Method `%s' didn't specify telnet args"
-                     (or multi-method method)))))
-
-
 ;; Auto saving to a special directory.
 
 (defun tramp-make-auto-save-file-name (fn)