Hi tramp-devel,
Cirling back to remote command execution command line length issue
seen with tramp upon connection to Solaris host. Michael Albinus
observed the issue was due to a max line length of 256 characters.
- [Re: tramp hangs opening a file, Emacs 30.1 tramp-version
"2.7.1.30.1" an]
Today I was wanting to use [Man-support-remote-systems] to see
Solaris
manual page within emacs running on Darmin (sequoia 15.4.1). From
the
debug buffer I could once again see the command being executed was
much longer than 256 characters, and the I/O buffer showing many ^G
characters. Which is what was also observed with the loooongish file
names issues.
Searching tramp-devel archive I came across [Re: tramp 2.26 emacs
24.3
plink] which included a link to [Solaris limitation on command line -
Oracle Forums]
Their testing showed that it wasn't down to shell input length, but
instead the setting of `MAX_CANON' (from limits.h):
,----
| #define MAX_CANON 256 /* max bytes in line for canonical processing
*/
`----
With a suggestion that `expect' script should include
,----
| set stty_init raw
`----
To which expect(1) states
will cause further spawned processes's terminals to start
in raw mode.
Looking at stty(1) *raw* on Solaris is:
,----
| stty cs8 -icanon min 1 time 0 -isig -xcase -inpck -opost
`----
Looking in tramp I see that `tramp-sh.el' runs `stty' a few times,
and
nicely captures current settings to debug buffer too. Of particular
note is `tramp-pipe-stty-setting':
,----
| (defcustom tramp-pipe-stty-settings "-icanon min 1 time 0"
| "How to prevent blocking read in pipeline processes.
| This is used in `make-process' with `connection-type' `pipe'."
| :group 'tramp
| :version "29.3"
| :type '(choice (const :tag "Use size limit" "-icanon min 1 time
0")
| (const :tag "Use timeout" "-icanon min 0 time 1")
| string))
`----
For a simple test then I modified `tramp-sh-handle-make-process' to
always apply it:
,----
| $ git diff
| diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
| index 618fc386e58..3ecf92f7d28 100644
| --- a/lisp/net/tramp-sh.el
| +++ b/lisp/net/tramp-sh.el
| @@ -3115,7 +3115,7 @@ tramp-sh-handle-make-process
| (let ((pid (tramp-send-command-and-read v
"echo $$")))
| (setq p (tramp-get-connection-process v))
| (process-put p 'remote-pid pid))
| - (when (meme connection-type '(nil pipe))
| +; (when (memq connection-type '(nil pipe))
| ;; Disable carriage return to newline
| ;; translation. This does not work on
| ;; macOS, see Bug#50748.
| @@ -3137,7 +3137,8 @@ tramp-sh-handle-make-process
| "stty %s %s"
| (if (tramp-check-remote-uname v
"Darwin")
| "" "-icrnl")
| - tramp-pipe-stty-settings)))
| + tramp-pipe-stty-settings))
| +;)
| ;; `tramp-maybe-open-connection' and
| ;; `tramp-send-command-and-read' could have
| ;; trashed the connection buffer. Remove
`----
Evaluated that function, cleaned connections, accessed remote buffer
and ran man again, and it worked.
Clearly this is a limited test and I may well have broken something
else with these settings. Which from the manual page are:
-icrnl
do not map CR to NL on input.
-icanon
Disable canonical input (ERASE and KILL processing). Does not
set MIN or TIME.
`min number' / `time number'
Set the value of min or time to number. MIN and TIME are used
in
Non-Canonical mode input processing (-icanon).
For the moment I shall carry-on and see what breaks, but hopefully
more of what works now!
References:
[Re: tramp hangs opening a file, Emacs 30.1 tramp-version "2.7.1.30.1"
an]
<https://lists.gnu.org/archive/html/tramp-devel/2025-04/msg00001.html>
[Man-support-remote-systems]
<https://www.gnu.org/software/emacs/manual/html_node/emacs/Man-Page.html>
[Re: tramp 2.26 emacs 24.3 plink]
<https://lists.gnu.org/archive/html/tramp-devel/2014-09/msg00041.html>
[Solaris limitation on command line - Oracle Forums]
<https://forums.oracle.com/ords/apexds/post/solaris-limitation-on-command-line-9450>
--
Stace