Mercurial > emacs
changeset 46752:54b975949d6a
New version 2.0.5.
(tramp-methods): Remove inline encoding method parameters. The
encoding is now autodetected. Also shorten the list of
methods (u/m distinction gone) and rename the remaining methods to
have longer, but more mnemonic, names.
(tramp-login-prompt-regexp, tramp-password-prompt-regexp)
(tramp-wrong-passwd-regexp): Trailing `$' not needed, regexp is
matched at end of buffer anyway.
(tramp-yesno-prompt-regexp): New variable, for questions where the
user should say "yes" or "no".
(tramp-file-name-structure-unified)
(tramp-file-name-structure-separate): Allow dash in method names.
(tramp-actions-before-shell): New variable, contains list of
pattern/action pairs. Output sent by remote end is scanned for
the patterns, then the actions are executed.
(tramp-multi-actions): Like `tramp-actions-before-shell', but
executed for each hop in a multi-hop connection.
(tramp-last-cmd-time): New variable. If nothing has been sent to
remote end for 60 seconds, look to see if the remote end is still
alive.
(tramp-perl-mime-encode, tramp-perl-mime-decode): Remove. It
didn't work.
(tramp-perl-encode, tramp-perl-decode): New variables, these
require the MIME::Base64 module on the remote end.
(tramp-handle-file-attributes): Restructure logic.
(tramp-handle-file-attributes-with-ls)
(tramp-handle-file-attributes-with-perl): More debugging.
(tramp-handle-directory-files): Grok fifth arg `files-only' for
XEmacs.
(tramp-handle-make-directory, tramp-handle-delete-directory)
(tramp-handle-delete-file, tramp-handle-insert-directory): Expand
file name.
(tramp-handle-shell-command): Use `when', not `if'.
(tramp-handle-file-local-copy, tramp-handle-write-region): Adapt
to autodetection of inline encoding.
(tramp-invoke-ange-ftp): Require ange-ftp to make sure that
variable ange-ftp-name-format is defined before binding it.
(tramp-action-login, tramp-action-password, tramp-action-succeed)
(tramp-action-permission-denied, tramp-action-yesno): Functions
called from `tramp-actions-before-shell'.
(tramp-multi-action-login, tramp-multi-action-password)
(tramp-multi-action-succeed)
(tramp-multi-action-permission-denied): Functions called from
`tramp-multi-actions'.
(tramp-process-one-action, tramp-process-actions): Pattern
matching and action invocation code for
`tramp-actions-before-shell'.
(tramp-process-one-multi-action, tramp-process-multi-actions):
Same for `tramp-multi-actions'.
(tramp-open-connection-telnet, tramp-open-connection-rsh)
(tramp-open-connection-su): Process actions instead of hardwired
logic.
(tramp-multi-connect-telnet, tramp-multi-connect-rlogin)
(tramp-multi-connect-su): Ditto.
(tramp-post-connection): New method for tramp_encode and
tramp_decode scripts.
(tramp-post-connection): Invoke inline autodetection code.
(tramp-coding-commands): List of inline codings.
(tramp-find-inline-encoding): This is the inline autodetection
code.
(tramp-maybe-open-connection): If nothing was sent to connection
for 60 seconds, look if it connection is still alive.
(tramp-send-command): Remember that something was sent to the
connection.
(tramp-make-tramp-file-name, tramp-make-tramp-multi-file-name):
Use backticks for constructing alist.
(tramp-get-encoding-command, tramp-set-encoding-command)
(tramp-get-decoding-command, tramp-set-decoding-command)
(tramp-get-encoding-function, tramp-set-encoding-function)
(tramp-get-decoding-function, tramp-set-decoding-function): Use
for results of inline autodetection.
(tramp-get-encoding-command, tramp-get-decoding-command)
(tramp-get-encoding-function, tramp-get-decoding-function):
Remove these old functions.
author | Kai Großjohann <kgrossjo@eu.uu.net> |
---|---|
date | Tue, 30 Jul 2002 20:24:27 +0000 |
parents | 01bd8c67a47a |
children | 5e95e401d481 |
files | lisp/ChangeLog lisp/net/tramp.el |
diffstat | 2 files changed, 896 insertions(+), 704 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Tue Jul 30 18:56:52 2002 +0000 +++ b/lisp/ChangeLog Tue Jul 30 20:24:27 2002 +0000 @@ -1,3 +1,80 @@ +2002-07-30 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> + + * net/tramp.el: New version 2.0.5. + (tramp-methods): Remove inline encoding method parameters. The + encoding is now autodetected. Also shorten the list of + methods (u/m distinction gone) and rename the remaining methods to + have longer, but more mnemonic, names. + (tramp-login-prompt-regexp, tramp-password-prompt-regexp) + (tramp-wrong-passwd-regexp): Trailing `$' not needed, regexp is + matched at end of buffer anyway. + (tramp-yesno-prompt-regexp): New variable, for questions where the + user should say "yes" or "no". + (tramp-file-name-structure-unified) + (tramp-file-name-structure-separate): Allow dash in method names. + (tramp-actions-before-shell): New variable, contains list of + pattern/action pairs. Output sent by remote end is scanned for + the patterns, then the actions are executed. + (tramp-multi-actions): Like `tramp-actions-before-shell', but + executed for each hop in a multi-hop connection. + (tramp-last-cmd-time): New variable. If nothing has been sent to + remote end for 60 seconds, look to see if the remote end is still + alive. + (tramp-perl-mime-encode, tramp-perl-mime-decode): Remove. It + didn't work. + (tramp-perl-encode, tramp-perl-decode): New variables, these + require the MIME::Base64 module on the remote end. + (tramp-handle-file-attributes): Restructure logic. + (tramp-handle-file-attributes-with-ls) + (tramp-handle-file-attributes-with-perl): More debugging. + (tramp-handle-directory-files): Grok fifth arg `files-only' for + XEmacs. + (tramp-handle-make-directory, tramp-handle-delete-directory) + (tramp-handle-delete-file, tramp-handle-insert-directory): Expand + file name. + (tramp-handle-shell-command): Use `when', not `if'. + (tramp-handle-file-local-copy, tramp-handle-write-region): Adapt + to autodetection of inline encoding. + (tramp-invoke-ange-ftp): Require ange-ftp to make sure that + variable ange-ftp-name-format is defined before binding it. + (tramp-action-login, tramp-action-password, tramp-action-succeed) + (tramp-action-permission-denied, tramp-action-yesno): Functions + called from `tramp-actions-before-shell'. + (tramp-multi-action-login, tramp-multi-action-password) + (tramp-multi-action-succeed) + (tramp-multi-action-permission-denied): Functions called from + `tramp-multi-actions'. + (tramp-process-one-action, tramp-process-actions): Pattern + matching and action invocation code for + `tramp-actions-before-shell'. + (tramp-process-one-multi-action, tramp-process-multi-actions): + Same for `tramp-multi-actions'. + (tramp-open-connection-telnet, tramp-open-connection-rsh) + (tramp-open-connection-su): Process actions instead of hardwired + logic. + (tramp-multi-connect-telnet, tramp-multi-connect-rlogin) + (tramp-multi-connect-su): Ditto. + (tramp-post-connection): New method for tramp_encode and + tramp_decode scripts. + (tramp-post-connection): Invoke inline autodetection code. + (tramp-coding-commands): List of inline codings. + (tramp-find-inline-encoding): This is the inline autodetection + code. + (tramp-maybe-open-connection): If nothing was sent to connection + for 60 seconds, look if it connection is still alive. + (tramp-send-command): Remember that something was sent to the + connection. + (tramp-make-tramp-file-name, tramp-make-tramp-multi-file-name): + Use backticks for constructing alist. + (tramp-get-encoding-command, tramp-set-encoding-command) + (tramp-get-decoding-command, tramp-set-decoding-command) + (tramp-get-encoding-function, tramp-set-encoding-function) + (tramp-get-decoding-function, tramp-set-decoding-function): Use + for results of inline autodetection. + (tramp-get-encoding-command, tramp-get-decoding-command) + (tramp-get-encoding-function, tramp-get-decoding-function): + Remove these old functions. + 2002-07-30 Kenichi Handa <handa@etl.go.jp> * language/indian.el (in-is13194): Give correct `safe-chars' property.
--- a/lisp/net/tramp.el Tue Jul 30 18:56:52 2002 +0000 +++ b/lisp/net/tramp.el Tue Jul 30 20:24:27 2002 +0000 @@ -69,8 +69,9 @@ ;;; Code: -(defconst tramp-version "2.0.2" +(defconst tramp-version "2.0.5" "This version of tramp.") + (defconst tramp-bug-report-address "tramp-devel@mail.freesoftware.fsf.org" "Email address to send bug reports to.") @@ -175,10 +176,6 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("scp" (tramp-connection-function tramp-open-connection-rsh) @@ -190,10 +187,6 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("scp1" (tramp-connection-function tramp-open-connection-rsh) @@ -205,10 +198,6 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("scp2" (tramp-connection-function tramp-open-connection-rsh) @@ -220,13 +209,10 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("scp-ssh1" (tramp-connection-function tramp-open-connection-rsh) + ("scp1-old" + (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh1") (tramp-rcp-program "scp1") (tramp-remote-sh "/bin/sh") @@ -235,13 +221,10 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("scp-ssh2" (tramp-connection-function tramp-open-connection-rsh) + ("scp2-old" + (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh2") (tramp-rcp-program "scp2") (tramp-remote-sh "/bin/sh") @@ -250,10 +233,6 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("rsync" (tramp-connection-function tramp-open-connection-rsh) @@ -265,13 +244,9 @@ (tramp-rcp-keep-date-arg "-t") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("ru" (tramp-connection-function tramp-open-connection-rsh) + ("rsh" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "rsh") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -280,124 +255,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("su" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "ssh") - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("su1" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "ssh") - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("su2" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "ssh") - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("su-ssh1" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "ssh1") - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("su-ssh2" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "ssh2") - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("rm" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "rsh") - (tramp-rcp-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-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("sm" (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "ssh") - (tramp-rcp-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-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("smp" (tramp-connection-function tramp-open-connection-rsh) + ("ssh" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -406,12 +266,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "tramp_mimencode") - (tramp-decoding-command "tramp_mimedecode") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) - (tramp-telnet-program nil)) - ("sm1" (tramp-connection-function tramp-open-connection-rsh) + (tramp-telnet-program nil) + (tramp-telnet-args nil)) + ("ssh1" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -420,13 +277,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("sm2" (tramp-connection-function tramp-open-connection-rsh) + ("ssh2" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -435,13 +288,10 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("sm-ssh1" (tramp-connection-function tramp-open-connection-rsh) + ("ssh1-old" + (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh1") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -450,13 +300,10 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("sm-ssh2" (tramp-connection-function tramp-open-connection-rsh) + ("ssh2-old" + (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh2") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -465,13 +312,34 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) + (tramp-telnet-program nil) + (tramp-telnet-args nil)) + ("ssh1-old" + (tramp-connection-function tramp-open-connection-rsh) + (tramp-rsh-program "ssh1") + (tramp-rcp-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)) - ("tm" (tramp-connection-function tramp-open-connection-telnet) + ("ssh2-old" + (tramp-connection-function tramp-open-connection-rsh) + (tramp-rsh-program "ssh2") + (tramp-rcp-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)) + ("telnet" + (tramp-connection-function tramp-open-connection-telnet) (tramp-rsh-program nil) (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -480,29 +348,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program "telnet") (tramp-telnet-args nil)) - ("tu" (tramp-connection-function tramp-open-connection-telnet) - (tramp-rsh-program nil) - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program "telnet") - (tramp-telnet-args nil)) - ("sum" (tramp-connection-function tramp-open-connection-su) + ("su" (tramp-connection-function tramp-open-connection-su) (tramp-rsh-program nil) (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -511,29 +359,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program "su") (tramp-su-args ("-" "%u")) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("suu" (tramp-connection-function tramp-open-connection-su) - (tramp-rsh-program nil) - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("sudm" (tramp-connection-function tramp-open-connection-su) + ("sudo" (tramp-connection-function tramp-open-connection-su) (tramp-rsh-program nil) (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -542,26 +370,6 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program "sudo") (tramp-su-args ("-u" "%u" "-s")) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("sudu" (tramp-connection-function tramp-open-connection-su) - (tramp-rsh-program nil) - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("multi" (tramp-connection-function tramp-open-connection-multi) @@ -573,26 +381,6 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("multiu" (tramp-connection-function tramp-open-connection-multi) - (tramp-rsh-program nil) - (tramp-rcp-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-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("scpx" (tramp-connection-function tramp-open-connection-rsh) @@ -602,13 +390,9 @@ (tramp-rsh-args ("-e" "none" "-t" "-t" "/bin/sh")) (tramp-rcp-args nil) (tramp-rcp-keep-date-arg "-p") - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("smx" (tramp-connection-function tramp-open-connection-rsh) + ("sshx" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "ssh") (tramp-rcp-program nil) (tramp-remote-sh "/bin/sh") @@ -617,13 +401,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("km" + ("krlogin" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "krlogin") (tramp-rcp-program nil) @@ -633,13 +413,9 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) - ("plinku" + ("plink" (tramp-connection-function tramp-open-connection-rsh) (tramp-rsh-program "plink") (tramp-rcp-program nil) @@ -649,27 +425,6 @@ (tramp-rcp-keep-date-arg nil) (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command "uuencode xxx") - (tramp-decoding-command - "( uudecode -o - 2>/dev/null || uudecode -p 2>/dev/null )") - (tramp-encoding-function nil) - (tramp-decoding-function uudecode-decode-region) - (tramp-telnet-program nil) - (tramp-telnet-args nil)) - ("plinkm" - (tramp-connection-function tramp-open-connection-rsh) - (tramp-rsh-program "plink") - (tramp-rcp-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-encoding-command "mimencode -b") - (tramp-decoding-command "mimencode -u -b") - (tramp-encoding-function base64-encode-region) - (tramp-decoding-function base64-decode-region) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("pscp" @@ -682,10 +437,6 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) ("fcp" @@ -698,10 +449,6 @@ (tramp-rcp-keep-date-arg "-p") (tramp-su-program nil) (tramp-su-args nil) - (tramp-encoding-command nil) - (tramp-decoding-command nil) - (tramp-encoding-function nil) - (tramp-decoding-function nil) (tramp-telnet-program nil) (tramp-telnet-args nil)) ) @@ -944,16 +691,16 @@ :type '(repeat string)) (defcustom tramp-login-prompt-regexp - ".*ogin: *$" + ".*ogin: *" "*Regexp matching login-like prompts. -The regexp should match the whole line." +The regexp should match at end of buffer." :group 'tramp :type 'regexp) (defcustom tramp-password-prompt-regexp - "^.*\\([pP]assword\\|passphrase.*\\):\^@? *$" + "^.*\\([pP]assword\\|passphrase.*\\):\^@? *" "*Regexp matching password-like prompts. -The regexp should match the whole line. +The regexp should match at end of buffer. The `sudo' program appears to insert a `^@' character into the prompt." :group 'tramp @@ -962,9 +709,17 @@ (defcustom tramp-wrong-passwd-regexp (concat "^.*\\(Permission denied.\\|Login [Ii]ncorrect\\|" "Received signal [0-9]+\\|Connection \\(refused\\|closed\\)\\|" - "Sorry, try again.\\|Name or service not known\\).*$") + "Sorry, try again.\\|Name or service not known\\).*") "*Regexp matching a `login failed' message. -The regexp should match the whole line." +The regexp should match at end of buffer." + :group 'tramp + :type 'regexp) + +(defcustom tramp-yesno-prompt-regexp + "Are you sure you want to continue connecting (yes/no)\\? *" + "Regular expression matching all queries which need to be confirmed. +The confirmation should be done with yes or no. +The regexp should match at end of buffer." :group 'tramp :type 'regexp) @@ -999,7 +754,7 @@ ;; File name format. (defconst tramp-file-name-structure-unified - (list (concat "\\`/\\(\\([a-zA-Z0-9]+\\):\\)?" ;method + (list (concat "\\`/\\(\\([a-zA-Z0-9-]+\\):\\)?" ;method "\\(\\([^:@/]+\\)@\\)?" ;user "\\([^:/]+\\):" ;host "\\(.*\\)\\'") ;path @@ -1009,7 +764,7 @@ filename space. This value is used for this unified namespace.") (defconst tramp-file-name-structure-separate - (list (concat "\\`/\\[\\(\\([a-zA-Z0-9]+\\)/\\)?" ;method + (list (concat "\\`/\\[\\(\\([a-zA-Z0-9-]+\\)/\\)?" ;method "\\(\\([-a-zA-Z0-9_#/:]+\\)@\\)?" ;user "\\([-a-zA-Z0-9_#/:@.]+\\)\\]" ;host "\\(.*\\)\\'") ;path @@ -1282,6 +1037,37 @@ :group 'tramp :type 'boolean) +(defcustom tramp-actions-before-shell + '((tramp-password-prompt-regexp tramp-action-password) + (tramp-login-prompt-regexp tramp-action-login) + (shell-prompt-pattern tramp-action-succeed) + (tramp-wrong-passwd-regexp tramp-action-permission-denied) + (tramp-yesno-prompt-regexp tramp-action-yesno)) + "List of pattern/action pairs. +Whenever a pattern matches, the corresponding action is performed. +Each item looks like (PATTERN ACTION). + +The PATTERN should be a symbol, a variable. The value of this +variable gives the regular expression to search for. Note that the +regexp must match at the end of the buffer, \"\\'\" is implicitly +appended to it. + +The ACTION should also be a symbol, but a function. When the +corresponding PATTERN matches, the ACTION function is called." + :group 'tramp + :type '(repeat (list variable function))) + +(defcustom tramp-multi-actions + '((tramp-password-prompt-regexp tramp-multi-action-password) + (tramp-login-prompt-regexp tramp-multi-action-login) + (shell-prompt-pattern tramp-multi-action-succeed) + (tramp-wrong-passwd-regexp tramp-multi-action-permission-denied)) + "List of pattern/action pairs. +This list is used for each hop in multi-hop connections. +See `tramp-actions-before-shell' for more info." + :group 'tramp + :type '(repeat (list variable function))) + ;;; Internal Variables: (defvar tramp-buffer-file-attributes nil @@ -1413,51 +1199,36 @@ "Perl script to produce output suitable for use with `file-attributes' on the remote file system.") -;; Perl script to implement `mime-encode' -(defvar tramp-perl-mime-encode (concat - "sub encode_base64 ($); - my $buf; - while(read(STDIN, $buf, 60*57)) { print encode_base64($buf) } - sub encode_base64 ($) { - my $res = \"\"; - my $eol = \"\n\"; - pos($_[0]) = 0; # ensure start at the beginning - while ($_[0] =~ /(.{1,45})/gs) { - $res .= substr(pack(\"u\", $1), 1); - chop($res); - } - $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs - # fix padding at the end - my $padding = (3 - length($_[0]) % 3) % 3; - $res =~ s/.{$padding}$/\"=\" x $padding/e if $padding; - # break encoded string into lines of no more than 76 characters each - if (length $eol) { - $res =~ s/(.{1,76})/$1$eol/g; - } - $res;}")) - -;; Perl script to implement `mime-decode' -(defvar tramp-perl-mime-decode (concat - "sub decode_base64 ($); - my $buf; - while(read(STDIN, $buf, 60*57)) { print decode_base64($buf) } - sub decode_base64 ($) { - local($^W) = 0; # unpack(\"u\",...) gives bogus warning in 5.00[123] - - my $str = shift; - my $res = \"\"; - - $str =~ tr|A-Za-z0-9+=/||cd; # remove non-base64 chars - if (length($str) % 4) { - warn(\"Length of base64 data not a multiple of 4\") - } - $str =~ s/=+$//; # remove padding - $str =~ tr|A-Za-z0-9+/| -_|; # convert to uuencoded format - while ($str =~ /(.{1,60})/gs) { - my $len = chr(32 + length($1)*3/4); # compute length byte - $res .= unpack(\"u\", $len . $1 ); # uudecode - } - $res;}")) +;; ;; These two use uu encoding. +;; (defvar tramp-perl-encode "%s -e'\ +;; print qq(begin 644 xxx\n); +;; my $s = q(); +;; my $res = q(); +;; while (read(STDIN, $s, 45)) { +;; print pack(q(u), $s); +;; } +;; print qq(`\n); +;; print qq(end\n); +;; '" +;; "Perl program to use for encoding a file. +;; Escape sequence %s is replaced with name of Perl binary.") + +;; (defvar tramp-perl-decode "%s -ne ' +;; print unpack q(u), $_; +;; '" +;; "Perl program to use for decoding a file. +;; Escape sequence %s is replaced with name of Perl binary.") + +;; These two use base64 encoding. +(defvar tramp-perl-encode + "perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'" + "Perl program to use for encoding a file. +Escape sequence %s is replaced with name of Perl binary.") + +(defvar tramp-perl-decode + "perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)'" + "Perl program to use for decoding a file. +Escape sequence %s is replaced with name of Perl binary.") ; These values conform to `file-attributes' from XEmacs 21.2. ; GNU Emacs and other tools not checked. @@ -1486,6 +1257,10 @@ 'undecided-dos) "Some Emacsen know the `dos' coding system, others need `undecided-dos'.") +(defvar tramp-last-cmd-time nil + "Internal Tramp variable recording the time when the last cmd was sent. +This variable is buffer-local in every buffer.") +(make-variable-buffer-local 'tramp-last-cmd-time) ;; New handlers should be added here. The following operations can be ;; handled using the normal primitives: file-name-as-directory, @@ -1537,13 +1312,6 @@ "Alist of handler functions. Operations not mentioned here will be handled by the normal Emacs functions.") -;;; For better error reporting. - -(defun tramp-version (arg) - "Print version number of tramp.el in minibuffer or current buffer." - (interactive "P") - (if arg (insert tramp-version) (message tramp-version))) - ;;; Internal functions which must come first. (defsubst tramp-message (level fmt-string &rest args) @@ -1833,18 +1601,21 @@ "Like `file-attributes' for tramp files. Optional argument NONNUMERIC means return user and group name rather than as numbers." - (if (tramp-handle-file-exists-p filename) - ;; file exists, find out stuff - (save-excursion - (with-parsed-tramp-file-name filename nil - (when (tramp-ange-ftp-file-name-p multi-method method) - (tramp-invoke-ange-ftp 'file-attributes file)) + (let (result) + (with-parsed-tramp-file-name filename nil + (when (tramp-ange-ftp-file-name-p multi-method method) + (tramp-invoke-ange-ftp 'file-attributes filename)) + (when (tramp-handle-file-exists-p filename) + ;; file exists, find out stuff + (save-excursion (if (tramp-get-remote-perl multi-method method user host) - (tramp-handle-file-attributes-with-perl - multi-method method user host path nonnumeric) - (tramp-handle-file-attributes-with-ls - multi-method method user host path nonnumeric)))) - nil)) ; no file + (setq result + (tramp-handle-file-attributes-with-perl + multi-method method user host path nonnumeric)) + (setq result + (tramp-handle-file-attributes-with-ls + multi-method method user host path nonnumeric)))))) + result)) (defun tramp-handle-file-attributes-with-ls @@ -1853,6 +1624,10 @@ (let (symlinkp dirp res-inode res-filemodes res-numlinks res-uid res-gid res-size res-symlink-target) + (tramp-message-for-buffer multi-method method user host 10 + "file attributes with ls: %s" + (tramp-make-tramp-file-name + multi-method method user host path)) (tramp-send-command multi-method method user host (format "%s %s %s" @@ -1934,6 +1709,10 @@ The Perl command is sent to the remote machine when the connection is initially created and is kept cached by the remote shell." + (tramp-message-for-buffer multi-method method user host 10 + "file attributes with perl: %s" + (tramp-make-tramp-file-name + multi-method method user host path)) (tramp-send-command multi-method method user host (format "tramp_file_attributes %s" @@ -2204,12 +1983,13 @@ ;; Directory listings. -(defun tramp-handle-directory-files (directory &optional full match nosort) +(defun tramp-handle-directory-files (directory + &optional full match nosort files-only) "Like `directory-files' for tramp files." (with-parsed-tramp-file-name directory nil (when (tramp-ange-ftp-file-name-p multi-method method) (tramp-invoke-ange-ftp 'directory-files - directory full match nosort)) + directory full match nosort files-only)) (let (result x) (save-excursion (tramp-barf-unless-okay @@ -2235,7 +2015,26 @@ result) (push x result)))) (tramp-send-command multi-method method user host "cd") - (tramp-wait-for-output)) + (tramp-wait-for-output) + ;; Remove non-files or non-directories if necessary. Using + ;; the remote shell for this would probably be way faster. + ;; Maybe something could be adapted from + ;; tramp-handle-file-name-all-completions. + (when files-only + (let ((temp (nreverse result)) + item) + (setq result nil) + (if (equal files-only t) + ;; files only + (while temp + (setq item (pop temp)) + (when (file-regular-p item) + (push item result))) + ;; directories only + (while temp + (setq item (pop temp)) + (when (file-directory-p item) + (push item result))))))) result))) ;; This function should return "foo/" for directories and "bar" for @@ -2494,6 +2293,7 @@ ;; mkdir (defun tramp-handle-make-directory (dir &optional parents) "Like `make-directory' for tramp files." + (setq dir (expand-file-name dir)) (with-parsed-tramp-file-name dir nil (when (tramp-ange-ftp-file-name-p multi-method method) (tramp-invoke-ange-ftp 'make-directory dir parents)) @@ -2508,6 +2308,7 @@ ;; CCC error checking? (defun tramp-handle-delete-directory (directory) "Like `delete-directory' for tramp files." + (setq directory (expand-file-name directory)) (with-parsed-tramp-file-name directory nil (when (tramp-ange-ftp-file-name-p multi-method method) (tramp-invoke-ange-ftp 'delete-directory directory)) @@ -2520,6 +2321,7 @@ (defun tramp-handle-delete-file (filename) "Like `delete-file' for tramp files." + (setq filename (expand-file-name filename)) (with-parsed-tramp-file-name filename nil (when (tramp-ange-ftp-file-name-p multi-method method) (tramp-invoke-ange-ftp 'delete-file filename)) @@ -2601,6 +2403,7 @@ (defun tramp-handle-insert-directory (filename switches &optional wildcard full-directory-p) "Like `insert-directory' for tramp files." + (setq filename (expand-file-name filename)) (with-parsed-tramp-file-name filename nil (when (tramp-ange-ftp-file-name-p multi-method method) (tramp-invoke-ange-ftp 'insert-directory @@ -2754,54 +2557,54 @@ "Like `shell-command' for tramp files. This will break if COMMAND prints a newline, followed by the value of `tramp-end-of-output', followed by another newline." - (if (tramp-tramp-file-p default-directory) - (with-parsed-tramp-file-name default-directory nil - (when (tramp-ange-ftp-file-name-p multi-method method) - (let ((default-directory (tramp-make-ange-ftp-file-name - user host path))) - (tramp-invoke-ange-ftp 'shell-command - command output-buffer error-buffer))) - (let (status) - (when (string-match "&[ \t]*\\'" command) - (error "Tramp doesn't grok asynchronous shell commands, yet")) - (when error-buffer - (error "Tramp doesn't grok optional third arg ERROR-BUFFER, yet")) - (save-excursion - (tramp-barf-unless-okay - multi-method method user host - (format "cd %s" (tramp-shell-quote-argument path)) - nil 'file-error - "tramp-handle-shell-command: Couldn't `cd %s'" - (tramp-shell-quote-argument path)) - (tramp-send-command multi-method method user host - (concat command "; tramp_old_status=$?")) - ;; This will break if the shell command prints "/////" - ;; somewhere. Let's just hope for the best... - (tramp-wait-for-output)) - (unless output-buffer - (setq output-buffer (get-buffer-create "*Shell Command Output*")) - (set-buffer output-buffer) - (erase-buffer)) - (unless (bufferp output-buffer) - (setq output-buffer (current-buffer))) + (when (tramp-tramp-file-p default-directory) + (with-parsed-tramp-file-name default-directory nil + (when (tramp-ange-ftp-file-name-p multi-method method) + (let ((default-directory (tramp-make-ange-ftp-file-name + user host path))) + (tramp-invoke-ange-ftp 'shell-command + command output-buffer error-buffer))) + (let (status) + (when (string-match "&[ \t]*\\'" command) + (error "Tramp doesn't grok asynchronous shell commands, yet")) + (when error-buffer + (error "Tramp doesn't grok optional third arg ERROR-BUFFER, yet")) + (save-excursion + (tramp-barf-unless-okay + multi-method method user host + (format "cd %s" (tramp-shell-quote-argument path)) + nil 'file-error + "tramp-handle-shell-command: Couldn't `cd %s'" + (tramp-shell-quote-argument path)) + (tramp-send-command multi-method method user host + (concat command "; tramp_old_status=$?")) + ;; This will break if the shell command prints "/////" + ;; somewhere. Let's just hope for the best... + (tramp-wait-for-output)) + (unless output-buffer + (setq output-buffer (get-buffer-create "*Shell Command Output*")) (set-buffer output-buffer) - (insert-buffer (tramp-get-buffer multi-method method user host)) - (save-excursion - (tramp-send-command multi-method method user host "cd") - (tramp-wait-for-output) - (tramp-send-command - multi-method method user host - (concat "tramp_set_exit_status $tramp_old_status;" - " echo tramp_exit_status $?")) - (tramp-wait-for-output) - (goto-char (point-max)) - (unless (search-backward "tramp_exit_status " nil t) - (error "Couldn't find exit status of `%s'" command)) - (skip-chars-forward "^ ") - (setq status (read (current-buffer)))) - (unless (zerop (buffer-size)) - (pop-to-buffer output-buffer)) - status))) + (erase-buffer)) + (unless (bufferp output-buffer) + (setq output-buffer (current-buffer))) + (set-buffer output-buffer) + (insert-buffer (tramp-get-buffer multi-method method user host)) + (save-excursion + (tramp-send-command multi-method method user host "cd") + (tramp-wait-for-output) + (tramp-send-command + multi-method method user host + (concat "tramp_set_exit_status $tramp_old_status;" + " echo tramp_exit_status $?")) + (tramp-wait-for-output) + (goto-char (point-max)) + (unless (search-backward "tramp_exit_status " nil t) + (error "Couldn't find exit status of `%s'" command)) + (skip-chars-forward "^ ") + (setq status (read (current-buffer)))) + (unless (zerop (buffer-size)) + (pop-to-buffer output-buffer)) + status))) ;; The following is only executed if something strange was ;; happening. Emit a helpful message and do it anyway. (message "tramp-handle-shell-command called with non-tramp directory: `%s'" @@ -2828,7 +2631,7 @@ filename)) (setq tmpfil (tramp-make-temp-file)) (cond ((tramp-get-rcp-program multi-method method) - ;; Use tramp-like program for file transfer. + ;; Use rcp-like program for file transfer. (tramp-message-for-buffer multi-method method user host 5 "Fetching %s to tmp file %s..." filename tmpfil) @@ -2852,8 +2655,8 @@ (tramp-message-for-buffer multi-method method user host 5 "Fetching %s to tmp file %s...done" filename tmpfil)) - ((and (tramp-get-encoding-command multi-method method) - (tramp-get-decoding-command multi-method method)) + ((and (tramp-get-encoding-command multi-method method user host) + (tramp-get-decoding-command multi-method method user host)) ;; Use inline encoding for file transfer. (save-excursion ;; Following line for setting tramp-current-method, @@ -2862,7 +2665,7 @@ (tramp-message 5 "Encoding remote file %s..." filename) (tramp-barf-unless-okay multi-method method user host - (concat (tramp-get-encoding-command multi-method method) + (concat (tramp-get-encoding-command multi-method method user host) " < " (tramp-shell-quote-argument path)) nil 'file-error "Encoding remote file failed, see buffer `%s' for details" @@ -2872,9 +2675,9 @@ (delete-region (point) (progn (forward-line -1) (point))) (tramp-message 5 "Decoding remote file %s..." filename) - (if (and (tramp-get-decoding-function multi-method method) + (if (and (tramp-get-decoding-function multi-method method user host) (fboundp (tramp-get-decoding-function - multi-method method))) + multi-method method user host))) ;; If tramp-decoding-function is defined for this ;; method, we call it. (let ((tmpbuf (get-buffer-create " *tramp tmp*"))) @@ -2886,11 +2689,11 @@ multi-method method user host 6 "Decoding remote file %s with function %s..." filename - (tramp-get-decoding-function multi-method method)) + (tramp-get-decoding-function multi-method method user host)) (set-buffer tmpbuf) (let ((coding-system-for-write 'no-conversion)) (funcall (tramp-get-decoding-function - multi-method method) + multi-method method user host) (point-min) (point-max)) (write-region (point-min) (point-max) tmpfil)) @@ -2902,14 +2705,14 @@ (tramp-message 6 "Decoding remote file %s with command %s..." filename - (tramp-get-decoding-command multi-method method)) + (tramp-get-decoding-command multi-method method user host)) (call-process tramp-sh-program tmpfil2 ;input nil ;output nil ;display "-c" (concat (tramp-get-decoding-command - multi-method method) + multi-method method user host) " > " tmpfil)) (delete-file tmpfil2))) (tramp-message-for-buffer @@ -2990,10 +2793,12 @@ (let ((curbuf (current-buffer)) (rcp-program (tramp-get-rcp-program multi-method method)) (rcp-args (tramp-get-rcp-args multi-method method)) - (encoding-command (tramp-get-encoding-command multi-method method)) + (encoding-command + (tramp-get-encoding-command multi-method method user host)) (encoding-function - (tramp-get-encoding-function multi-method method)) - (decoding-command (tramp-get-decoding-command multi-method method)) + (tramp-get-encoding-function multi-method method user host)) + (decoding-command + (tramp-get-decoding-command multi-method method user host)) (trampbuf (get-buffer-create "*tramp output*")) ;; We use this to save the value of `last-coding-system-used' ;; after writing the tmp file. At the end of the function, @@ -3253,6 +3058,7 @@ (defun tramp-invoke-ange-ftp (operation &rest args) "Invoke the Ange-FTP handler function and throw." + (or ange-ftp-name-format (require 'ange-ftp)) (let ((ange-ftp-name-format (list (nth 0 tramp-file-name-structure) (nth 3 tramp-file-name-structure) @@ -3650,13 +3456,145 @@ ;; -- Functions for establishing connection -- ;; ------------------------------------------------------------ -(defun tramp-process-actions - (multi-method method user host actions &optional timeout) - "Process given ACTIONS for login specified via first four args. -ACTIONS is a list of items (REGEXP FUN), where REGEXP specifies what -output from the remote end to look for, and FUN specifies the action -to take when the regexp matches." - nil) +;; The following functions are actions to be taken when seeing certain +;; prompts from the remote host. See the variable +;; `tramp-actions-before-shell' for usage of these functions. + +(defun tramp-action-login (p multi-method method user host) + "Send the login name." + (tramp-message 9 "Sending login name `%s'" + (or user (user-login-name))) + (erase-buffer) + (process-send-string nil (concat (or user (user-login-name)) + tramp-rsh-end-of-line))) + +(defun tramp-action-password (p multi-method method user host) + "Query the user for a password." + (when (tramp-method-out-of-band-p multi-method method) + (kill-process (get-buffer-process (current-buffer))) + (error (concat "Out of band method `%s' not applicable " + "for remote shell asking for a password") + method)) + (tramp-enter-password p (match-string 0))) + +(defun tramp-action-succeed (p multi-method method user host) + "Signal success in finding shell prompt." + (tramp-message 9 "Found remote shell prompt.") + (erase-buffer) + (throw 'tramp-action 'ok)) + +(defun tramp-action-permission-denied (p multi-method method user host) + "Signal permission denied." + (tramp-message 9 "Permission denied by remote host.") + (kill-process p) + (erase-buffer) + (throw 'tramp-action 'permission-denied)) + +(defun tramp-action-yesno (p multi-method method user host) + "Ask the user if he is sure." + (save-window-excursion + (pop-to-buffer (tramp-get-buffer multi-method method user host)) + (unless (yes-or-no-p (match-string 0)) + (kill-process p) + (erase-buffer) + (throw 'tramp-action 'permission-denied)) + (process-send-string p (concat "yes" tramp-rsh-end-of-line)) + (erase-buffer))) + +;; The following functions are specifically for multi connections. + +(defun tramp-multi-action-login (p method user host) + "Send the login name." + (tramp-message 9 "Sending login name `%s'" user) + (erase-buffer) + (process-send-string p (concat user tramp-rsh-end-of-line))) + +(defun tramp-multi-action-password (p method user host) + "Query the user for a password." + (tramp-enter-password p (match-string 0))) + +(defun tramp-multi-action-succeed (p method user host) + "Signal success in finding shell prompt." + (tramp-message 9 "Found shell prompt on `%s'" host) + (erase-buffer) + (throw 'tramp-action 'ok)) + +(defun tramp-multi-action-permission-denied (p method user host) + "Signal permission denied." + (tramp-message 9 "Permission denied by remote host `%s'" host) + (kill-process p) + (erase-buffer) + (throw 'tramp-action 'permission-denied)) + +;; Functions for processing the actions. + +(defun tramp-process-one-action (p multi-method method user host actions) + "Wait for output from the shell and perform one action." + (let (found item pattern action todo) + (erase-buffer) + (tramp-message 9 "Waiting 60s for prompt from remote shell") + (with-timeout (60 (throw 'tramp-action 'timeout)) + (while (not found) + (accept-process-output p 1) + (goto-char (point-min)) + (setq todo actions) + (while todo + (goto-char (point-min)) + (setq item (pop todo)) + (setq pattern (symbol-value (nth 0 item))) + (setq action (nth 1 item)) + (tramp-message 10 "Looking for pattern %s" pattern) + (when (re-search-forward (concat pattern "\\'") nil t) + (setq found (funcall action p multi-method method user host))))) + found))) + +(defun tramp-process-actions (p multi-method method user host actions) + "Perform actions until success." + (let (exit) + (while (not exit) + (tramp-message 10 "Processing actions") + (setq exit + (catch 'tramp-action + (tramp-process-one-action + p multi-method method user host actions) + nil))) + (unless (eq exit 'ok) + (error "Login failed")))) + +;; For multi-actions. + +(defun tramp-process-one-multi-action (p method user host actions) + "Wait for output from the shell and perform one action." + (let (found item pattern action todo) + (erase-buffer) + (tramp-message 9 "Waiting 60s for prompt from remote shell") + (with-timeout (60 (throw 'tramp-action 'timeout)) + (while (not found) + (accept-process-output p 1) + (setq todo actions) + (goto-char (point-min)) + (while todo + (goto-char (point-min)) + (setq item (pop todo)) + (setq pattern (symbol-value (nth 0 item))) + (setq action (nth 1 item)) + (tramp-message 10 "Looking for pattern %s" pattern) + (when (re-search-forward (concat pattern "\\'") nil t) + (setq found (funcall action p method user host))))) + found))) + +(defun tramp-process-multi-actions (p method user host actions) + "Perform actions until success." + (let (exit) + (while (not exit) + (setq exit + (catch 'tramp-action + (tramp-process-one-multi-action p method user host actions) + nil))) + (unless (eq exit 'ok) + (error "Login failed")))) + +;; The actual functions for opening connections. (defun tramp-open-connection-telnet (multi-method method user host) "Open a connection using a telnet METHOD. @@ -3702,44 +3640,50 @@ (found nil) (pw nil)) (process-kill-without-query p) - (tramp-message 9 "Waiting for login prompt...") - (unless (tramp-wait-for-regexp p nil tramp-login-prompt-regexp) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote login prompt")) - (erase-buffer) - ;; Remote login defaults to local one. - (tramp-message 9 "Sending login name %s" (or user (user-login-name))) - (process-send-string p (concat (or user (user-login-name)) - tramp-rsh-end-of-line)) - (tramp-message 9 "Waiting for password prompt...") - (unless (setq found (tramp-wait-for-regexp - p nil tramp-password-prompt-regexp)) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote password prompt")) - (erase-buffer) - (setq pw (tramp-read-passwd (car found))) - (tramp-message 9 "Sending password") - (process-send-string p (concat pw tramp-rsh-end-of-line)) - (tramp-message 9 "Waiting 30s for remote shell to come up...") - (unless (setq found - (tramp-wait-for-regexp - p 30 (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-wrong-passwd-regexp - shell-prompt-pattern))) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell prompt")) - (when (nth 1 found) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Login failed: %s" (nth 1 found))) + (set-buffer (tramp-get-buffer multi-method method user host)) + (erase-buffer) + (tramp-process-actions p multi-method method user host + tramp-actions-before-shell) + +;; (tramp-message 9 "Waiting for login prompt...") +;; (unless (tramp-wait-for-regexp p nil tramp-login-prompt-regexp) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote login prompt")) +;; (erase-buffer) +;; ;; Remote login defaults to local one. +;; (tramp-message 9 "Sending login name %s" (or user (user-login-name))) +;; (process-send-string p (concat (or user (user-login-name)) +;; tramp-rsh-end-of-line)) +;; (tramp-message 9 "Waiting for password prompt...") +;; (unless (setq found (tramp-wait-for-regexp +;; p nil tramp-password-prompt-regexp)) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote password prompt")) +;; (erase-buffer) +;; (setq pw (tramp-read-passwd (car found))) +;; (tramp-message 9 "Sending password") +;; (process-send-string p (concat pw tramp-rsh-end-of-line)) +;; (tramp-message 9 "Waiting 30s for remote shell to come up...") +;; (unless (setq found +;; (tramp-wait-for-regexp +;; p 30 (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-wrong-passwd-regexp +;; shell-prompt-pattern))) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell prompt")) +;; (when (nth 1 found) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Login failed: %s" (nth 1 found))) + (tramp-open-connection-setup-interactive-shell p multi-method method user host) (tramp-post-connection multi-method method user host))))) -;; HHH: Changed to handle the case when USER is nil. + (defun tramp-open-connection-rsh (multi-method method user host) "Open a connection using an rsh METHOD. This starts the command `rsh HOST -l USER'[*], then waits for a remote @@ -3794,47 +3738,52 @@ host rsh-args))) (found nil)) (process-kill-without-query p) - (tramp-message 9 "Waiting 60s for shell or passwd prompt from %s" host) - (setq found - (tramp-wait-for-regexp - p 60 - (format - "\\(%s\\)\\|\\(%s\\)\\'" - tramp-password-prompt-regexp - shell-prompt-pattern))) - (unless found - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell or passwd prompt")) - (when (nth 1 found) - (when (tramp-method-out-of-band-p multi-method method) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error (concat "Out of band method `%s' not applicable" - " for remote shell asking for a password") - method)) - (erase-buffer) - (tramp-message 9 "Sending password...") - (tramp-enter-password p (nth 1 found)) - (tramp-message 9 "Sent password, waiting 60s for remote shell prompt") - (setq found (tramp-wait-for-regexp p 60 - (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-wrong-passwd-regexp - shell-prompt-pattern)))) - (unless found - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell prompt")) - (when (nth 1 found) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Login failed: %s" (nth 1 found))) + + (set-buffer buf) + (tramp-process-actions p multi-method method user host + tramp-actions-before-shell) + +;; (tramp-message 9 "Waiting 60s for shell or passwd prompt from %s" host) +;; (setq found +;; (tramp-wait-for-regexp +;; p 60 +;; (format +;; "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-password-prompt-regexp +;; shell-prompt-pattern))) +;; (unless found +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell or passwd prompt")) +;; (when (nth 1 found) +;; (when (tramp-method-out-of-band-p multi-method method) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error (concat "Out of band method `%s' not applicable" +;; " for remote shell asking for a password") +;; method)) +;; (erase-buffer) +;; (tramp-message 9 "Sending password...") +;; (tramp-enter-password p (nth 1 found)) +;; (tramp-message 9 "Sent password, waiting 60s for remote shell prompt") +;; (setq found (tramp-wait-for-regexp p 60 +;; (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-wrong-passwd-regexp +;; shell-prompt-pattern)))) +;; (unless found +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell prompt")) +;; (when (nth 1 found) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Login failed: %s" (nth 1 found))) + (tramp-message 7 "Initializing remote shell") (tramp-open-connection-setup-interactive-shell p multi-method method user host) (tramp-post-connection multi-method method user host))))) -;; HHH: Changed. Now utilizes (or user (user-login-name)) instead of USER. (defun tramp-open-connection-su (multi-method method user host) "Open a connection using the `su' program with METHOD. This starts `su - USER', then waits for a password prompt. The HOST @@ -3868,45 +3817,48 @@ (> emacs-major-version 20)) tramp-dos-coding-system)) (p (apply 'start-process - (tramp-buffer-name multi-method method - user host) - (tramp-get-buffer multi-method method - user host) + (tramp-buffer-name multi-method method user host) + (tramp-get-buffer multi-method method user host) (tramp-get-su-program multi-method method) (mapcar '(lambda (x) - (format-spec x `((?u ,user)))) + (format-spec x `((?u . ,user)))) (tramp-get-su-args multi-method method)))) (found nil) (pw nil)) (process-kill-without-query p) - (tramp-message 9 "Waiting 30s for shell or password prompt...") - (unless (setq found (tramp-wait-for-regexp - p 30 - (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-password-prompt-regexp - shell-prompt-pattern))) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find shell or password prompt")) - (when (nth 1 found) - (erase-buffer) - (setq pw (tramp-read-passwd (car found))) - (tramp-message 9 "Sending password") - (process-send-string p (concat pw tramp-rsh-end-of-line)) - (tramp-message 9 "Waiting 30s for remote shell to come up...") - (unless (setq found - (tramp-wait-for-regexp - p 30 (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-wrong-passwd-regexp - shell-prompt-pattern))) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell prompt")) - (when (nth 1 found) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "`su' failed: %s" (nth 1 found)))) + (set-buffer (tramp-get-buffer multi-method method user host)) + (tramp-process-actions p multi-method method user host + tramp-actions-before-shell) + +;; (tramp-message 9 "Waiting 30s for shell or password prompt...") +;; (unless (setq found (tramp-wait-for-regexp +;; p 30 +;; (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-password-prompt-regexp +;; shell-prompt-pattern))) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find shell or password prompt")) +;; (when (nth 1 found) +;; (erase-buffer) +;; (setq pw (tramp-read-passwd (car found))) +;; (tramp-message 9 "Sending password") +;; (process-send-string p (concat pw tramp-rsh-end-of-line)) +;; (tramp-message 9 "Waiting 30s for remote shell to come up...") +;; (unless (setq found +;; (tramp-wait-for-regexp +;; p 30 (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-wrong-passwd-regexp +;; shell-prompt-pattern))) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell prompt")) +;; (when (nth 1 found) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "`su' failed: %s" (nth 1 found)))) + (tramp-open-connection-setup-interactive-shell p multi-method method user host) (tramp-post-connection multi-method method @@ -3990,42 +3942,47 @@ character. If USER is nil, uses the return value of (user-login-name) instead." - (let ((cmd (format-spec command `((?h ,host) (?n ,tramp-rsh-end-of-line)))) - (cmd1 (format-spec command `((?h ,host) (?n "")))) + (let ((cmd (format-spec command + `((?h . ,host) (?n . ,tramp-rsh-end-of-line)))) + (cmd1 (format-spec command `((?h . ,host) (?n . "")))) found pw) (erase-buffer) (tramp-message 9 "Sending telnet command `%s'" cmd1) (process-send-string p cmd) - (tramp-message 9 "Waiting 30s for login prompt from %s" host) - (unless (tramp-wait-for-regexp p 30 tramp-login-prompt-regexp) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find login prompt from host %s" host)) - (erase-buffer) - (tramp-message 9 "Sending login name %s" (or user (user-login-name))) - (process-send-string p (concat (or user (user-login-name)) tramp-rsh-end-of-line)) - (tramp-message 9 "Waiting for password prompt") - (unless (setq found (tramp-wait-for-regexp p nil tramp-password-prompt-regexp)) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find password prompt from host %s" host)) - (erase-buffer) - (setq pw (tramp-read-passwd - (format "Password for %s@%s, %s" (or user (user-login-name)) host found))) - (tramp-message 9 "Sending password") - (process-send-string p (concat pw tramp-rsh-end-of-line)) - (tramp-message 9 "Waiting 60s for remote shell to come up...") - (unless (setq found (tramp-wait-for-regexp - p 60 (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-wrong-passwd-regexp - shell-prompt-pattern))) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find shell prompt from host %s" host)) - (when (nth 1 found) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Login to %s failed: %s" (nth 2 found))))) + (tramp-process-multi-actions p method user host + tramp-multi-actions) + +;; (tramp-message 9 "Waiting 30s for login prompt from %s" host) +;; (unless (tramp-wait-for-regexp p 30 tramp-login-prompt-regexp) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find login prompt from host %s" host)) +;; (erase-buffer) +;; (tramp-message 9 "Sending login name %s" (or user (user-login-name))) +;; (process-send-string p (concat (or user (user-login-name)) tramp-rsh-end-of-line)) +;; (tramp-message 9 "Waiting for password prompt") +;; (unless (setq found (tramp-wait-for-regexp p nil tramp-password-prompt-regexp)) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find password prompt from host %s" host)) +;; (erase-buffer) +;; (setq pw (tramp-read-passwd +;; (format "Password for %s@%s, %s" (or user (user-login-name)) host found))) +;; (tramp-message 9 "Sending password") +;; (process-send-string p (concat pw tramp-rsh-end-of-line)) +;; (tramp-message 9 "Waiting 60s for remote shell to come up...") +;; (unless (setq found (tramp-wait-for-regexp +;; p 60 (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-wrong-passwd-regexp +;; shell-prompt-pattern))) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find shell prompt from host %s" host)) +;; (when (nth 1 found) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Login to %s failed: %s" (nth 2 found))) + )) ;; HHH: Changed. Multi method. Don't know how to handle this in the case ;; of no user name provided. Hack to make it work as it did before: @@ -4040,42 +3997,45 @@ `%%' if you want to use a literal percent character. If USER is nil, uses the return value of (user-login-name) instead." - (let ((cmd (format-spec command `((?h ,host) - (?u ,(or user (user-login-name))) - (?n ,tramp-rsh-end-of-line)))) - (cmd1 (format-spec command `((?h ,host) - (?u ,(or user (user-login-name))) - (?n "")))) + (let ((cmd (format-spec command `((?h . ,host) + (?u . ,(or user (user-login-name))) + (?n . ,tramp-rsh-end-of-line)))) + (cmd1 (format-spec command `((?h . ,host) + (?u . ,(or user (user-login-name))) + (?n . "")))) found) (erase-buffer) (tramp-message 9 "Sending rlogin command `%s'" cmd1) (process-send-string p cmd) - (tramp-message 9 "Waiting 60s for shell or passwd prompt from %s" host) - (unless (setq found - (tramp-wait-for-regexp p 60 - (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-password-prompt-regexp - shell-prompt-pattern))) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell or passwd prompt")) - (when (nth 1 found) - (erase-buffer) - (tramp-message 9 "Sending password...") - (tramp-enter-password p (nth 1 found)) - (tramp-message 9 "Sent password, waiting 60s for remote shell prompt") - (setq found (tramp-wait-for-regexp p 60 - (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-wrong-passwd-regexp - shell-prompt-pattern)))) - (unless found - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell prompt")) - (when (nth 1 found) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Login failed: %s" (nth 1 found))))) + (tramp-process-multi-actions p method user host + tramp-multi-actions) +;; (tramp-message 9 "Waiting 60s for shell or passwd prompt from %s" host) +;; (unless (setq found +;; (tramp-wait-for-regexp p 60 +;; (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-password-prompt-regexp +;; shell-prompt-pattern))) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell or passwd prompt")) +;; (when (nth 1 found) +;; (erase-buffer) +;; (tramp-message 9 "Sending password...") +;; (tramp-enter-password p (nth 1 found)) +;; (tramp-message 9 "Sent password, waiting 60s for remote shell prompt") +;; (setq found (tramp-wait-for-regexp p 60 +;; (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-wrong-passwd-regexp +;; shell-prompt-pattern)))) +;; (unless found +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell prompt")) +;; (when (nth 1 found) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Login failed: %s" (nth 1 found))) + )) ;; HHH: Changed. Multi method. Don't know how to handle this in the case ;; of no user name provided. Hack to make it work as it did before: @@ -4093,40 +4053,43 @@ user name, and `%n' is replaced with the value of `tramp-rsh-end-of-line'. Use `%%' if you want a literal percent character." - (let ((cmd (format-spec command `((?u ,(or user (user-login-name))) - (?n ,tramp-rsh-end-of-line)))) - (cmd1 (format-spec command `((?u ,(or user (user-login-name))) - (?n "")))) + (let ((cmd (format-spec command `((?u . ,(or user (user-login-name))) + (?n . ,tramp-rsh-end-of-line)))) + (cmd1 (format-spec command `((?u . ,(or user (user-login-name))) + (?n . "")))) found) (erase-buffer) (tramp-message 9 "Sending su command `%s'" cmd1) (process-send-string p cmd) - (tramp-message 9 "Waiting 60s for shell or passwd prompt for %s" (or user (user-login-name))) - (unless (setq found (tramp-wait-for-regexp - p 60 (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-password-prompt-regexp - shell-prompt-pattern))) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find shell or passwd prompt for %s" - (or user (user-login-name)))) - (when (nth 1 found) - (tramp-message 9 "Sending password...") - (tramp-enter-password p (nth 1 found)) - (erase-buffer) - (tramp-message 9 "Sent password, waiting 60s for remote shell prompt") - (setq found (tramp-wait-for-regexp p 60 - (format "\\(%s\\)\\|\\(%s\\)\\'" - tramp-wrong-passwd-regexp - shell-prompt-pattern)))) - (unless found - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Couldn't find remote shell prompt")) - (when (nth 1 found) - (pop-to-buffer (buffer-name)) - (kill-process p) - (error "Login failed: %s" (nth 1 found))))) + (tramp-process-multi-actions p method user host + tramp-multi-actions) +;; (tramp-message 9 "Waiting 60s for shell or passwd prompt for %s" (or user (user-login-name))) +;; (unless (setq found (tramp-wait-for-regexp +;; p 60 (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-password-prompt-regexp +;; shell-prompt-pattern))) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find shell or passwd prompt for %s" +;; (or user (user-login-name)))) +;; (when (nth 1 found) +;; (tramp-message 9 "Sending password...") +;; (tramp-enter-password p (nth 1 found)) +;; (erase-buffer) +;; (tramp-message 9 "Sent password, waiting 60s for remote shell prompt") +;; (setq found (tramp-wait-for-regexp p 60 +;; (format "\\(%s\\)\\|\\(%s\\)\\'" +;; tramp-wrong-passwd-regexp +;; shell-prompt-pattern)))) +;; (unless found +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Couldn't find remote shell prompt")) +;; (when (nth 1 found) +;; (pop-to-buffer (buffer-name)) +;; (kill-process p) +;; (error "Login failed: %s" (nth 1 found))) + )) ;; Utility functions. @@ -4176,6 +4139,7 @@ "Prompt for a password and send it to the remote end. Uses PROMPT as a prompt and sends the password to process P." (let ((pw (tramp-read-passwd prompt))) + (erase-buffer) (process-send-string p (concat pw tramp-rsh-end-of-line)))) ;; HHH: Not Changed. This might handle the case where USER is not @@ -4435,32 +4399,22 @@ " -e '" tramp-perl-file-attributes "' $1 2>/dev/null\n" "}")) (tramp-wait-for-output) - (when (string= (tramp-get-encoding-command multi-method method) - "tramp_mimencode") - (tramp-message 5 "Sending the Perl `mime-encode' implementation.") - (tramp-send-linewise - multi-method method user host - (concat "tramp_mimencode () {\n" - (if (tramp-find-executable multi-method method user host - "mimencode" tramp-remote-path t) - "mimencode -b $1" - (concat tramp-remote-perl - " -e '" tramp-perl-mime-encode "' $1 2>/dev/null")) - "\n}")) - (tramp-wait-for-output)) - (when (string= (tramp-get-decoding-command multi-method method) - "tramp_mimedecode") - (tramp-message 5 "Sending the Perl `mime-decode' implementation.") - (tramp-send-linewise - multi-method method user host - (concat "tramp_mimedecode () {\n" - (if (tramp-find-executable multi-method method user host - "mimencode" tramp-remote-path t) - "mimencode -u -b $1" - (concat tramp-remote-perl - " -e '" tramp-perl-mime-decode "' $1 2>/dev/null")) - "\n}")) - (tramp-wait-for-output))))) + (tramp-message 5 "Sending the Perl `mime-encode' implementation.") + (tramp-send-linewise + multi-method method user host + (concat "tramp_encode () {\n" + (format tramp-perl-encode tramp-remote-perl) + " 2>/dev/null" + "\n}")) + (tramp-wait-for-output) + (tramp-message 5 "Sending the Perl `mime-decode' implementation.") + (tramp-send-linewise + multi-method method user host + (concat "tramp_decode () {\n" + (format tramp-perl-decode tramp-remote-perl) + " 2>/dev/null" + "\n}")) + (tramp-wait-for-output)))) ;; Find ln(1) (erase-buffer) (let ((ln (tramp-find-executable multi-method method user host @@ -4468,11 +4422,14 @@ (when ln (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 multi-method method) + (tramp-find-inline-encoding multi-method method user host)) ;; If encoding/decoding command are given, test to see if they work. ;; CCC: Maybe it would be useful to run the encoder both locally and ;; remotely to see if they produce the same result. - (let ((decoding (tramp-get-decoding-command multi-method method)) - (encoding (tramp-get-encoding-command multi-method method)) + (let ((decoding (tramp-get-decoding-command multi-method method user host)) + (encoding (tramp-get-encoding-command multi-method method user host)) (magic-string "xyzzy")) (when (and (or decoding encoding) (not (and decoding encoding))) (tramp-kill-process multi-method method user host) @@ -4495,15 +4452,138 @@ (tramp-message 5 "Checking to see if encoding/decoding commands work on remote host...done")))) +;; CCC: We should either implement a Perl version of base64 encoding +;; and decoding. Then we just use that in the last item. The other +;; alternative is to use the Perl version of UU encoding. But then +;; we need a Lisp version of uuencode. +(defvar tramp-coding-commands + '(("mimencode -b" "mimencode -u -b" + base64-encode-region base64-decode-region) + ("mmencode -b" "mmencode -u -b" + base64-encode-region base64-decode-region) + ("recode data..base64" "recode base64..data" + base64-encode-region base64-decode-region) + ("uuencode xxx" "uudecode -o -" + nil uudecode-decode-region) + ("uuencode xxx" "uudecode -p" + nil uudecode-decode-region) + ("tramp_encode" "tramp_decode" + base64-encode-region base64-decode-region)) + "List of coding commands for inline transfer. +Each item is a list (ENCODING-COMMAND DECODING-COMMAND +ENCODING-FUNCTION DECODING-FUNCTION). + +Each item can be a string, giving a command, or a symbol, giving +a function. + +The ENCODING-COMMAND should be a command accepting a plain file on +standard input and writing the encoded file to standard output. The +DECODING-COMMAND should be a command accepting an encoded file on +standard input and writing the decoded file to standard output. + +The ENCODING-FUNCTION and DECODING-FUNCTION functions will be called +with two arguments, start and end of region, and are expected to +replace the region contents with the encoded or decoded results, +respectively.") + +(defun tramp-find-inline-encoding (multi-method method user host) + "Find an inline transfer encoding that works. +Goes through the list `tramp-coding-commands'." + (let ((commands tramp-coding-commands) + item found) + (while (and commands (null found)) + (setq item (pop commands)) + (catch 'wont-work + (let ((ec (nth 0 item)) + (dc (nth 1 item)) + (ef (nth 2 item)) + (df (nth 3 item))) + ;; Check if encoding and decoding commands can be called + ;; remotely with null input and output. This makes sure there + ;; are no syntax errors and the command is really found. + (tramp-message-for-buffer + multi-method method user host 10 + "Checking remote encoding command `%s' for sanity" ec) + (unless (zerop (tramp-send-command-and-check + multi-method method user host + (format "%s </dev/null >/dev/null" ec) t)) + (throw 'wont-work nil)) + (tramp-message-for-buffer + multi-method method user host 10 + "Checking remote decoding command `%s' for sanity" dc) + (unless (zerop (tramp-send-command-and-check + multi-method method user host + (format "%s </dev/null >/dev/null" dc) t)) + (throw 'wont-work nil)) + ;; If no encoding/decoding function is given, the + ;; corresponding encoding/decoding command also has to work + ;; locally. + (when (not (fboundp ef)) + (tramp-message-for-buffer + multi-method method user host 10 + "Checking local encoding command `%s' for sanity" ec) + (unless (zerop (call-process + tramp-sh-program ;program + nil ;input + nil ;output buffer + nil ;redisplay + "-c" + (format "%s </dev/null >/dev/null" ec))) + (throw 'wont-work nil))) + (when (not (fboundp df)) + (tramp-message-for-buffer + multi-method method user host 10 + "Checking local decoding command `%s' for sanity" dc) + (unless (zerop (call-process + tramp-sh-program ;program + nil ;input file + nil ;output buffer + nil ;redisplay + "-c" + (format "%s </dev/null >/dev/null" dc))) + (throw 'wont-work nil))) + ;; CCC: At this point, maybe we should check that the output + ;; of the commands is correct. But for the moment we will + ;; assume that commands working on empty input will also + ;; work in practice. + (setq found item)))) + ;; Did we find something? If not, issue error. If so, + ;; set connection properties. + (unless found + (error "Couldn't find an inline transfer encoding")) + (let ((ec (nth 0 found)) + (dc (nth 1 found)) + (ef (nth 2 found)) + (df (nth 3 found))) + (tramp-set-encoding-command multi-method method user host ec) + (tramp-set-decoding-command multi-method method user host dc) + (tramp-set-encoding-function multi-method method user host ef) + (tramp-set-decoding-function multi-method method user host df)))) + (defun tramp-maybe-open-connection (multi-method method user host) "Maybe open a connection to HOST, logging in as USER, using METHOD. Does not do anything if a connection is already open, but re-opens the connection if a previous connection has died for some reason." - (let ((p (get-buffer-process (tramp-get-buffer multi-method method user host)))) - (unless (and p - (processp p) - (memq (process-status p) '(run open))) + (let ((p (get-buffer-process (tramp-get-buffer multi-method method user host))) + last-cmd-time) + ;; If too much time has passed since last command was sent, look + ;; whether process is still alive. If it isn't, kill it. When + ;; using ssh, it can sometimes happen that the remote end has hung + ;; up but the local ssh client doesn't recognize this until it + ;; tries to send some data to the remote end. So that's why we + ;; try to send a command from time to time, then look again + ;; whether the process is really alive. + (save-excursion + (set-buffer (tramp-get-buffer multi-method method user host)) + (when (and tramp-last-cmd-time + (> (tramp-time-diff tramp-last-cmd-time (current-time)) 60)) + (process-send-string p (concat "echo hello" tramp-rsh-end-of-line)) + (unless (accept-process-output p 2) + (delete-process p) + (setq p nil)) + (erase-buffer))) + (unless (and p (processp p) (memq (process-status p) '(run open))) (when (and p (processp p)) (delete-process p)) (funcall (tramp-get-connection-function multi-method method) @@ -4515,6 +4595,7 @@ Erases temporary buffer before sending the command (unless NOERASE is true)." (tramp-maybe-open-connection multi-method method user host) + (setq tramp-last-cmd-time (current-time)) (when tramp-debug-buffer (save-excursion (set-buffer (tramp-get-debug-buffer multi-method method user host)) @@ -4927,9 +5008,9 @@ (tramp-make-tramp-multi-file-name multi-method method user host path) (if user (format-spec tramp-make-tramp-file-format - `((?m ,method) (?u ,user) (?h ,host) (?p ,path))) + `((?m . ,method) (?u . ,user) (?h . ,host) (?p . ,path))) (format-spec tramp-make-tramp-file-user-nil-format - `((?m ,method) (?h ,host) (?p ,path)))))) + `((?m . ,method) (?h . ,host) (?p . ,path)))))) ;; CCC: Henrik Holm: Not Changed. Multi Method. What should be done ;; with this when USER is nil? @@ -4940,15 +5021,15 @@ (let* ((prefix-format (nth 0 tramp-make-multi-tramp-file-format)) (hop-format (nth 1 tramp-make-multi-tramp-file-format)) (path-format (nth 2 tramp-make-multi-tramp-file-format)) - (prefix (format-spec prefix-format `((?m ,multi-method)))) + (prefix (format-spec prefix-format `((?m . ,multi-method)))) (hops "") - (path (format-spec path-format `((?p ,path)))) + (path (format-spec path-format `((?p . ,path)))) (i 0) (len (length method))) (while (< i len) (let ((m (aref method i)) (u (aref user i)) (h (aref host i))) (setq hops (concat hops (format-spec hop-format - `((?m ,m) (?u ,u) (?h ,h))))) + `((?m . ,m) (?u . ,u) (?h . ,h))))) (incf i))) (concat prefix hops path))) @@ -4997,7 +5078,8 @@ (tramp-get-connection-property "ln" nil multi-method method user host)) ;; Get a property of a TRAMP connection. -(defun tramp-get-connection-property (property default multi-method method user host) +(defun tramp-get-connection-property + (property default multi-method method user host) "Get the named property for the connection. If the value is not set for the connection, return `default'" (tramp-maybe-open-connection multi-method method user host) @@ -5008,7 +5090,8 @@ (error default))))) ;; Set a property of a TRAMP connection. -(defun tramp-set-connection-property (property value multi-method method user host) +(defun tramp-set-connection-property + (property value multi-method method user host) "Set the named property of a TRAMP connection." (tramp-maybe-open-connection multi-method method user host) (with-current-buffer (tramp-get-buffer multi-method method user host) @@ -5016,6 +5099,31 @@ (intern (concat "tramp-connection-property-" property))) value))) +;; Some predefined connection properties. +(defun tramp-get-encoding-command (multi-method method user host) + (tramp-get-connection-property "encoding-command" nil + multi-method method user host)) +(defun tramp-set-encoding-command (multi-method method user host command) + (tramp-set-connection-property "encoding-command" command + multi-method method user host)) +(defun tramp-get-decoding-command (multi-method method user host) + (tramp-get-connection-property "decoding-command" nil + multi-method method user host)) +(defun tramp-set-decoding-command (multi-method method user host command) + (tramp-set-connection-property "decoding-command" command + multi-method method user host)) +(defun tramp-get-encoding-function (multi-method method user host) + (tramp-get-connection-property "encoding-function" nil + multi-method method user host)) +(defun tramp-set-encoding-function (multi-method method user host func) + (tramp-set-connection-property "encoding-function" func + multi-method method user host)) +(defun tramp-get-decoding-function (multi-method method user host) + (tramp-get-connection-property "decoding-function" nil + multi-method method user host)) +(defun tramp-set-decoding-function (multi-method method user host func) + (tramp-set-connection-property "decoding-function" func + multi-method method user host)) (defun tramp-get-connection-function (multi-method method) @@ -5081,34 +5189,6 @@ (error "Method `%s' didn't specify su args" (or multi-method method))))) -(defun tramp-get-encoding-command (multi-method method) - (second (or (assoc 'tramp-encoding-command - (assoc (or multi-method method tramp-default-method) - tramp-methods)) - (error "Method `%s' didn't specify an encoding command" - (or multi-method method))))) - -(defun tramp-get-decoding-command (multi-method method) - (second (or (assoc 'tramp-decoding-command - (assoc (or multi-method method tramp-default-method) - tramp-methods)) - (error "Method `%s' didn't specify a decoding command" - (or multi-method method))))) - -(defun tramp-get-encoding-function (multi-method method) - (second (or (assoc 'tramp-encoding-function - (assoc (or multi-method method tramp-default-method) - tramp-methods)) - (error "Method `%s' didn't specify an encoding function" - (or multi-method method))))) - -(defun tramp-get-decoding-function (multi-method method) - (second (or (assoc 'tramp-decoding-function - (assoc (or multi-method method tramp-default-method) - tramp-methods)) - (error "Method `%s' didn't specify a decoding function" - (or multi-method method))))) - (defun tramp-get-telnet-program (multi-method method) (second (or (assoc 'tramp-telnet-program (assoc (or multi-method method tramp-default-method) @@ -5123,6 +5203,34 @@ (error "Method `%s' didn't specify telnet args" (or multi-method method))))) +;; (defun tramp-get-encoding-command (multi-method method) +;; (second (or (assoc 'tramp-encoding-command +;; (assoc (or multi-method method tramp-default-method) +;; tramp-methods)) +;; (error "Method `%s' didn't specify an encoding command" +;; (or multi-method method))))) + +;; (defun tramp-get-decoding-command (multi-method method) +;; (second (or (assoc 'tramp-decoding-command +;; (assoc (or multi-method method tramp-default-method) +;; tramp-methods)) +;; (error "Method `%s' didn't specify a decoding command" +;; (or multi-method method))))) + +;; (defun tramp-get-encoding-function (multi-method method) +;; (second (or (assoc 'tramp-encoding-function +;; (assoc (or multi-method method tramp-default-method) +;; tramp-methods)) +;; (error "Method `%s' didn't specify an encoding function" +;; (or multi-method method))))) + +;; (defun tramp-get-decoding-function (multi-method method) +;; (second (or (assoc 'tramp-decoding-function +;; (assoc (or multi-method method tramp-default-method) +;; tramp-methods)) +;; (error "Method `%s' didn't specify a decoding function" +;; (or multi-method method))))) + ;; Auto saving to a special directory. (defun tramp-make-auto-save-file-name (fn) @@ -5348,6 +5456,13 @@ (setq ad-return-value (or res (list name))))))) ;; ) +;; Tramp version is useful in a number of situations. + +(defun tramp-version (arg) + "Print version number of tramp.el in minibuffer or current buffer." + (interactive "P") + (if arg (insert tramp-version) (message tramp-version))) + ;; Make the `reporter` functionality available for making bug reports about ;; the package. A most useful piece of code.