Fix Bug#24698

* lisp/net/tramp-sh.el (tramp-open-connection-setup-interactive-shell):
Don't send "stty tab0" to *BSD and Darwin machines.  (Bug#24698)
This commit is contained in:
Michael Albinus 2016-10-18 20:41:19 +02:00
parent baa8ba4ed4
commit 9a758b4ccc

View file

@ -4186,10 +4186,10 @@ process to set up. VEC specifies the connection."
(case-fold-search t))
(tramp-open-shell vec (tramp-get-method-parameter vec 'tramp-remote-shell))
;; Disable tab and echo expansion.
;; Disable echo expansion.
(tramp-message vec 5 "Setting up remote shell environment")
(tramp-send-command
vec "stty tab0 -inlcr -onlcr -echo kill '^U' erase '^H'" t)
vec "stty -inlcr -onlcr -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.
@ -4206,7 +4206,8 @@ process to set up. VEC specifies the connection."
(tramp-message vec 5 "Setting shell prompt")
(tramp-send-command
vec (format "PS1=%s PS2='' PS3='' PROMPT_COMMAND=''"
(tramp-shell-quote-argument tramp-end-of-output)) t)
(tramp-shell-quote-argument tramp-end-of-output))
t)
;; Check whether the output of "uname -sr" has been changed. If
;; yes, this is a strong indication that we must expire all
@ -4214,26 +4215,26 @@ process to set up. VEC specifies the connection."
;; `tramp-maybe-open-connection', it will be caught there.
(tramp-message vec 5 "Checking system information")
(let ((old-uname (tramp-get-connection-property vec "uname" nil))
(new-uname
(uname
(tramp-set-connection-property
vec "uname"
(tramp-send-command-and-read vec "echo \\\"`uname -sr`\\\""))))
(when (and (stringp old-uname) (not (string-equal old-uname new-uname)))
(when (and (stringp old-uname) (not (string-equal old-uname uname)))
(tramp-message
vec 3
"Connection reset, because remote host changed from `%s' to `%s'"
old-uname new-uname)
old-uname uname)
;; We want to keep the password.
(tramp-cleanup-connection vec t t)
(throw 'uname-changed (tramp-maybe-open-connection vec))))
(throw 'uname-changed (tramp-maybe-open-connection vec)))
;; 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")
(with-current-buffer (process-buffer proc)
(if (featurep 'mule)
;; Use MULE to select the right EOL convention for communicating
;; with the process.
;; Use MULE to select the right EOL convention for
;; communicating with the process.
(let ((cs (or (and (memq 'utf-8 (coding-system-list))
(string-match "utf-?8" (tramp-get-remote-locale vec))
(cons 'utf-8 'utf-8))
@ -4245,18 +4246,14 @@ process to set up. VEC specifies the connection."
cs-encode (or (cdr cs) 'undecided))
(setq cs-encode
(tramp-compat-coding-system-change-eol-conversion
cs-encode
(if (string-match
"^Darwin" (tramp-get-connection-property vec "uname" ""))
'mac 'unix)))
cs-encode (if (string-match "^Darwin" uname) 'mac 'unix)))
(tramp-send-command vec "echo foo ; echo bar" t)
(goto-char (point-min))
(when (search-forward "\r" nil t)
(setq cs-decode (tramp-compat-coding-system-change-eol-conversion
cs-decode 'dos)))
;; Special setting for Mac OS X.
(when (and (string-match
"^Darwin" (tramp-get-connection-property vec "uname" ""))
(when (and (string-match "^Darwin" uname)
(memq 'utf-8-hfs (coding-system-list)))
(setq cs-decode 'utf-8-hfs
cs-encode 'utf-8-hfs))
@ -4266,19 +4263,19 @@ process to set up. VEC specifies the connection."
vec 5 "Setting coding system to `%s' and `%s'" cs-decode cs-encode))
;; Look for ^M and do something useful if found.
(when (search-forward "\r" nil t)
;; 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.
;; 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 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. Emacs makes a hack when
;; this host type is detected locally. It cannot handle remote
;; hosts, though.
;; `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. Emacs makes a
;; hack when this host type is detected locally. It cannot handle
;; remote hosts, though.
(with-tramp-connection-property proc "chunksize"
(cond
((and (integerp tramp-chunksize) (> tramp-chunksize 0))
@ -4286,23 +4283,21 @@ process to set up. VEC specifies the connection."
(t
(tramp-message
vec 5 "Checking remote host type for `send-process-string' bug")
(if (string-match
"^FreeBSD" (tramp-get-connection-property vec "uname" ""))
500 0))))
(if (string-match "^FreeBSD" uname) 500 0))))
;; Set remote PATH variable.
(tramp-set-remote-path vec)
;; Search for a good shell before searching for a command which
;; checks if a file exists. This is done because Tramp wants to use
;; "test foo; echo $?" to check if various conditions hold, and
;; there are buggy /bin/sh implementations which don't execute the
;; "echo $?" part if the "test" part has an error. In particular,
;; the OpenSolaris /bin/sh is a problem. There are also other
;; problems with /bin/sh of OpenSolaris, like redirection of stderr
;; in function declarations, or changing HISTFILE in place.
;; Therefore, OpenSolaris' /bin/sh is replaced by bash, when
;; detected.
;; checks if a file exists. This is done because Tramp wants to
;; use "test foo; echo $?" to check if various conditions hold,
;; and there are buggy /bin/sh implementations which don't execute
;; the "echo $?" part if the "test" part has an error. In
;; particular, the OpenSolaris /bin/sh is a problem. There are
;; also other problems with /bin/sh of OpenSolaris, like
;; redirection of stderr in function declarations, or changing
;; HISTFILE in place. Therefore, OpenSolaris' /bin/sh is replaced
;; by bash, when detected.
(tramp-find-shell vec)
;; Disable unexpected output.
@ -4311,13 +4306,13 @@ process to set up. VEC specifies the connection."
;; IRIX64 bash expands "!" even when in single quotes. This
;; destroys our shell functions, we must disable it. See
;; <http://stackoverflow.com/questions/3291692/irix-bash-shell-expands-expression-in-single-quotes-yet-shouldnt>.
(when (string-match "^IRIX64" (tramp-get-connection-property vec "uname" ""))
(when (string-match "^IRIX64" uname)
(tramp-send-command vec "set +H" t))
;; On BSD-like systems, ?\t is expanded to spaces. Suppress this.
(when (string-match "BSD\\|Darwin"
(tramp-get-connection-property vec "uname" ""))
(tramp-send-command vec "stty -oxtabs" t))
;; Disable tab expansion.
(if (string-match "BSD\\|Darwin" uname)
(tramp-send-command vec "stty tabs" t)
(tramp-send-command vec "stty tab0" t))
;; Set utf8 encoding. Needed for Mac OS X, for example. This is
;; non-POSIX, so we must expect errors on some systems.
@ -4355,7 +4350,7 @@ process to set up. VEC specifies the connection."
t))
(when unset
(tramp-send-command
vec (format "unset %s" (mapconcat 'identity unset " ")) t))))
vec (format "unset %s" (mapconcat 'identity unset " ")) t)))))
;; Old text from documentation of tramp-methods:
;; Using a uuencode/uudecode inline method is discouraged, please use one