# HG changeset patch # User Michael Albinus # Date 1193080191 0 # Node ID 4ccd437aad2eaf67fd38d31b60e40eb69b48e5a6 # Parent cfd23169cbc0feba601a0901c7de08403f11c0d6 * net/tramp.el (tramp-find-shell) (tramp-open-connection-setup-interactive-shell): Improve sending initial commands. (tramp-action-terminal): Send debug message. (tramp-wait-for-shell-prompt, tramp-send-command-internal): Removed. (tramp-barf-if-no-shell-prompt): Insert code of `tramp-wait-for-shell-prompt'. diff -r cfd23169cbc0 -r 4ccd437aad2e lisp/ChangeLog --- a/lisp/ChangeLog Mon Oct 22 15:25:12 2007 +0000 +++ b/lisp/ChangeLog Mon Oct 22 19:09:51 2007 +0000 @@ -1,3 +1,13 @@ +2007-10-22 Michael Albinus + + * net/tramp.el (tramp-find-shell) + (tramp-open-connection-setup-interactive-shell): Improve sending + initial commands. + (tramp-action-terminal): Send debug message. + (tramp-wait-for-shell-prompt, tramp-send-command-internal): Removed. + (tramp-barf-if-no-shell-prompt): Insert code of + `tramp-wait-for-shell-prompt'. + 2007-10-22 Stefan Monnier * term/AT386.el (terminal-init-AT386): Use input-decode-map. diff -r cfd23169cbc0 -r 4ccd437aad2e lisp/net/tramp.el --- a/lisp/net/tramp.el Mon Oct 22 15:25:12 2007 +0000 +++ b/lisp/net/tramp.el Mon Oct 22 19:09:51 2007 +0000 @@ -5306,7 +5306,7 @@ (unless (tramp-get-connection-property vec "remote-shell" nil) (let (shell) (with-current-buffer (tramp-get-buffer vec) - (tramp-send-command vec "echo ~root") + (tramp-send-command vec "echo ~root" t) (cond ((string-match "^~root$" (buffer-string)) (setq shell @@ -5328,8 +5328,11 @@ (when extra-args (setq shell (concat shell " " extra-args)))) (tramp-message vec 5 "Starting remote shell `%s' for tilde expansion..." shell) - (tramp-send-command-internal - vec (concat "PROMPT_COMMAND='' PS1='$ ' exec " shell)) + (tramp-message + vec 6 (format "PROMPT_COMMAND='' PS1='$ ' exec %s" shell)) + ;; We just send a string only without checking resulting prompt. + (tramp-send-string + vec (format "PROMPT_COMMAND='' PS1='$ ' exec %s" shell)) (tramp-message vec 5 "Setting remote shell prompt...") ;; Douglas Gray Stephens says that we ;; must use "\n" here, not tramp-rsh-end-of-line. Kai left the @@ -5340,7 +5343,8 @@ (format "PROMPT_COMMAND=''; PS1='%s%s%s'; PS2=''; PS3=''" tramp-rsh-end-of-line tramp-end-of-output - tramp-rsh-end-of-line)) + tramp-rsh-end-of-line) + t) (tramp-message vec 5 "Setting remote shell prompt...done")) (t (tramp-message vec 5 "Remote `%s' groks tilde expansion, good" @@ -5417,6 +5421,8 @@ "Tell the remote host which terminal type to use. The terminal type can be configured with `tramp-terminal-type'." (tramp-message vec 5 "Setting `%s' as terminal type." tramp-terminal-type) + (with-current-buffer (tramp-get-connection-buffer vec) + (tramp-message vec 6 "\n%s" (buffer-string))) (tramp-send-string vec tramp-terminal-type)) (defun tramp-action-process-alive (proc vec) @@ -5562,33 +5568,28 @@ (tramp-error proc 'file-error "[[Regexp `%s' not found]]" regexp))) 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) + (unless + (tramp-wait-for-regexp + proc timeout + (format + "\\(%s\\|%s\\)\\'" shell-prompt-pattern tramp-shell-prompt-pattern)) (apply 'tramp-error-with-buffer nil proc 'file-error error-args))) -;; We don't call `tramp-send-string' in order to hide the password from the -;; debug buffer, and because end-of-line handling of the string. -(defun tramp-enter-password (p) +;; We don't call `tramp-send-string' in order to hide the password +;; from the debug buffer, and because end-of-line handling of the +;; string. +(defun tramp-enter-password (proc) "Prompt for a password and send it to the remote end." (process-send-string - p (concat (tramp-read-passwd p) - (or (tramp-get-method-parameter - tramp-current-method - 'tramp-password-end-of-line) - tramp-default-password-end-of-line)))) + proc (concat (tramp-read-passwd proc) + (or (tramp-get-method-parameter + tramp-current-method + 'tramp-password-end-of-line) + tramp-default-password-end-of-line)))) (defun tramp-open-connection-setup-interactive-shell (proc vec) "Set up an interactive shell. @@ -5607,17 +5608,32 @@ ;; called as sh) on startup; this way, we avoid the startup file ;; clobbering $PS1. $PROMP_COMMAND is another way to set the prompt ;; in /bin/bash, it must be discarded as well. - (tramp-send-command-internal + (tramp-message + vec 6 (format "exec env 'ENV=' 'PROMPT_COMMAND=' 'PS1=$ ' %s" + (tramp-get-method-parameter + (tramp-file-name-method vec) 'tramp-remote-sh))) + ;; We just send a string only without checking resulting prompt. + (tramp-send-string vec (format "exec env 'ENV=' 'PROMPT_COMMAND=' 'PS1=$ ' %s" (tramp-get-method-parameter (tramp-file-name-method vec) 'tramp-remote-sh))) + (tramp-message vec 5 "Setting shell prompt") + ;; Douglas Gray Stephens says that we must + ;; use "\n" here, not tramp-rsh-end-of-line. + (tramp-send-command + vec + (format "PROMPT_COMMAND=''; PS1='%s%s%s'; PS2=''; PS3=''" + tramp-rsh-end-of-line + tramp-end-of-output + tramp-rsh-end-of-line) + t) (tramp-message vec 5 "Setting up remote shell environment") - (tramp-send-command-internal vec "stty -inlcr -echo kill '^U' erase '^H'") + (tramp-send-command vec "stty -inlcr -echo kill '^U' erase '^H'" t) ;; Check whether the echo has really been disabled. Some ;; implementations, like busybox of embedded GNU/Linux, don't ;; support disabling. - (tramp-send-command-internal vec "echo foo") + (tramp-send-command vec "echo foo" t) (with-current-buffer (process-buffer proc) (goto-char (point-min)) (when (looking-at "echo foo") @@ -5625,11 +5641,11 @@ (tramp-message vec 5 "Remote echo still on. Ok.") ;; Make sure backspaces and their echo are enabled and no line ;; width magic interferes with them. - (tramp-send-command-internal vec "stty icanon erase ^H cols 32767"))) + (tramp-send-command vec "stty icanon erase ^H cols 32767" t))) ;; Try to set up the coding system correctly. ;; CCC this can't be the right way to do it. Hm. (tramp-message vec 5 "Determining coding system") - (tramp-send-command-internal vec "echo foo ; echo bar") + (tramp-send-command vec "echo foo ; echo bar" t) (with-current-buffer (process-buffer proc) (goto-char (point-min)) (if (featurep 'mule) @@ -5655,17 +5671,8 @@ ;; We have found a ^M but cannot frob the process coding system ;; because we're running on a non-MULE Emacs. Let's try ;; stty, instead. - (tramp-send-command-internal vec "stty -onlcr")))) - (tramp-send-command-internal vec "set +o vi +o emacs") - (tramp-message vec 5 "Setting shell prompt") - ;; Douglas Gray Stephens says that we must - ;; use "\n" here, not tramp-rsh-end-of-line. - (tramp-send-command - vec - (format "PROMPT_COMMAND=''; PS1='%s%s%s'; PS2=''; PS3=''" - tramp-rsh-end-of-line - tramp-end-of-output - tramp-rsh-end-of-line)) + (tramp-send-command vec "stty -onlcr" t)))) + (tramp-send-command vec "set +o vi +o emacs" t) ;; Check whether the remote host suffers from buggy `send-process-string'. ;; This is known for FreeBSD (see comment in `send_process', file process.c). ;; I've tested sending 624 bytes successfully, sending 625 bytes failed. @@ -5695,7 +5702,7 @@ ;; ksh. Whee... (tramp-find-shell vec) ;; Disable unexpected output. - (tramp-send-command vec "mesg n; biff n") + (tramp-send-command vec "mesg n; biff n" t) ;; Set the environment. (tramp-message vec 5 "Setting default environment") (let ((env (copy-sequence tramp-remote-process-environment)) @@ -5704,12 +5711,12 @@ (setq item (split-string (car env) "=")) (if (and (stringp (cadr item)) (not (string-equal (cadr item) ""))) (tramp-send-command - vec (format "%s=%s; export %s" (car item) (cadr item) (car item))) + vec (format "%s=%s; export %s" (car item) (cadr item) (car item)) t) (push (car item) unset)) (setq env (cdr env))) (when unset (tramp-send-command - vec (format "unset %s" (mapconcat 'identity unset " ")))))) + vec (format "unset %s" (mapconcat 'identity unset " "))))) t) ;; CCC: We should either implement a Perl version of base64 encoding ;; and decoding. Then we just use that in the last item. The other @@ -6181,19 +6188,6 @@ (tramp-send-string vec command) (unless nooutput (tramp-wait-for-output p)))) -(defun tramp-send-command-internal (vec command) - "Send command to remote host and wait for success. -Sends COMMAND, then waits 30 seconds for shell prompt." - (let ((p (tramp-get-connection-process vec))) - (when (tramp-get-connection-property vec "remote-echo" nil) - ;; We mark the command string that it can be erased in the output buffer. - (tramp-set-connection-property p "check-remote-echo" t) - (setq command (format "%s%s%s" tramp-echo-mark command tramp-echo-mark))) - (tramp-message vec 6 "%s" command) - (tramp-send-string vec command) - (tramp-barf-if-no-shell-prompt - p 30 "Couldn't `%s', see buffer `%s'" command (buffer-name)))) - (defun tramp-wait-for-output (proc &optional timeout) "Wait for output from remote rsh command." (with-current-buffer (process-buffer proc)