> On Jan 28, 2025, at 5:17 AM, Michael Albinus <michael.albi...@gmx.de> wrote:
> 
> JD Smith <jdtsm...@gmail.com> writes:
> 
> Hi,
> 
>> In developing an application that uses APC codes (like
>> "\x1b_...\x1b/") to communicate with an external process, I noticed
>> that when I try this with remote processes, TRAMP does not faithfully
>> pass binary sequences on to the process.  I tracked it down to the use
>> of the flags "-t -t" in the ssh call (the backend I am using).
> 
> Not so easy to change in general. The "-t -t" for ssh/scp direct async
> connections was added by intention, due to bug#71050 and bug#71259.

Thanks for your help.  I am on TRAMP version: 2.7.2.0.20250101.91903.

>> I was
>> able to lift that restriction with:
>> 
>>  (setf (alist-get 'tramp-direct-async (alist-get "ssh" tramp-methods nil nil 
>> #'equal)) '(("")))
>> 
>> But this feels rather hackish.
> 
> The Tramp manual describes how to change arguments in tramp-methods, see
> (info "(tramp) Predefined connection information") . In your case, I
> recommend to add to your init file
> 
> --8<---------------cut here---------------start------------->8---
> (add-to-list 'tramp-connection-properties (list "/ssh:" "direct-async" t))
> --8<---------------cut here---------------end--------------->8---
> 
> Could you pls confirm that this works for you?

Unfortunately this does not work for me.  I had formerly used:

(connection-local-set-profile-variables
 'remote-direct-async-process
 '((tramp-direct-async-process . t)))

(connection-local-set-profiles
 '(:application tramp :protocol "ssh")
 'remote-direct-async-process)

These settings appear to work.  I can see via  `M-x list-processes' the direct 
call to `ssh -q -e ...' for the remote process, and binary data are passed to 
the remote process without interference.  These settings also seem to persist 
across Emacs sessions, possibly via .emacs.d/tramp.

If I remove that file, and try your recommend settings, it does not work.  The 
process remains `/bin/sh -i', and binary data do not get sent correctly to the 
process.  Neither does setting `tramp-direct-async-process=t' work.  So I'm 
unsure of which settings to use.  

BTW, I'd prefer to enable direct-async _only_ for the processes my package 
creates, not for _all_ SSH processes, leaving that to the user.  

But even with direct-async enabled (with connection-local-set-profiles), I'm 
confronted with another problem.  My application sends binary data (APC 
commands) AND also sends signals (SIGUSR2) to communicate with the remote 
process.  The situation appears to be as follows:

With direct-async-process:  binary data ✓; signals ⨉ [1]
Without direct-async-process: binary data ⨉; signals ✓ [2]

[1] The process is a direct `ssh -q -e` command, binary data is correctly 
passed, but any signals from Emacs (even C-c C-c) result in the process dying 
with, e.g.:

:   C-c C-c

  Process X exited abnormally with code 255

[2] The process is `/bin/sh -i`, binary data get mangled when sent to the 
process, but signals are correctly propagated and received by the remote 
process.

To summarize, it appears I have quite specific needs here.  I'm looking for a 
combination of settings that:

Apply only to the processes my package creates.
Allow faithful delivery of binary data to the process (a la direct-async).
Allow signals from emacs to correctly reach the remote process (a la a 
/bin/sh-wrapped remote process).

Any ideas to try?  Thanks again for your assistance.


Reply via email to