1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-30 04:10:54 -08:00

Fix subprocess creation in directories managed by tramp-androidsu

* lisp/net/tramp-androidsu.el
(tramp-androidsu-maybe-open-connection): Set connection property
remote-namespace to t or nil subject to whether su runs in the
global mount namespace.
(tramp-androidsu-adb-handle-make-process): Delete function.
(tramp-androidsu-make-process): New function.
(tramp-androidsu-file-name-handler-alist): Switch to
tramp-androidsu-make-process.
This commit is contained in:
Po Lu 2024-02-29 10:59:09 +08:00
parent 05195e129f
commit 15ed441fd5

View file

@ -118,11 +118,10 @@ multibyte mode and waits for the shell prompt to appear."
;; Set sentinel. Initialize variables.
(set-process-sentinel p #'tramp-process-sentinel)
(tramp-post-process-creation p vec)
;; Replace `login-args' place holders.
(setq command (format "exec su - %s || exit"
(or user "root")))
(tramp-set-connection-property vec "remote-namespace" nil)
;; Attempt to execute the shell inside the global mount
;; namespace if requested.
(when tramp-androidsu-mount-global-namespace
@ -140,6 +139,8 @@ multibyte mode and waits for the shell prompt to appear."
(tramp-adb-send-command-and-check
vec "su -mm -c 'exit 24'" 24)))
(when tramp-androidsu-su-mm-supported
(tramp-set-connection-property
vec "remote-namespace" t)
(setq command (format "exec su -mm - %s || exit"
(or user "root"))))))
;; Send the command.
@ -156,27 +157,21 @@ multibyte mode and waits for the shell prompt to appear."
;; Set connection-local variables.
(tramp-set-connection-local-variables vec)
;; Change prompt.
(tramp-adb-send-command
vec (format "PS1=%s"
(tramp-shell-quote-argument tramp-end-of-output)))
;; Disable line editing.
(tramp-adb-send-command
vec "set +o vi +o vi-esccomplete +o vi-tabcomplete +o emacs")
;; Dump option settings in the traces.
(when (>= tramp-verbose 9)
(tramp-adb-send-command vec "set -o"))
;; Disable Unicode.
(tramp-adb-send-command vec "set +U")
;; Disable echo expansion.
(tramp-adb-send-command
vec "stty -inlcr -onlcr -echo kill '^U' erase '^H'" t)
;; Check whether the echo has really been disabled.
;; Some implementations, like busybox, don't support
;; disabling.
@ -191,14 +186,12 @@ multibyte mode and waits for the shell prompt to appear."
(tramp-adb-send-command vec
"stty icanon erase ^H cols 32767"
t)))
;; Set the remote PATH to a suitable value.
(tramp-set-connection-property vec "remote-path"
"/system/bin:/system/xbin")
'("/system/bin"
"/system/xbin"))
;; Mark it as connected.
(tramp-set-connection-property p "connected" t))))
;; Cleanup, and propagate the signal.
((error quit)
(tramp-cleanup-connection vec t)
@ -386,8 +379,119 @@ FUNCTION."
(defalias 'tramp-androidsu-handle-make-nearby-temp-file
(tramp-androidsu-generate-wrapper #'tramp-handle-make-nearby-temp-file))
(defalias 'tramp-androidsu-adb-handle-make-process
(tramp-androidsu-generate-wrapper #'tramp-adb-handle-make-process))
(defun tramp-androidsu-make-process (&rest args)
"Like `tramp-handle-make-process', but modified for Android."
(when args
(with-parsed-tramp-file-name (expand-file-name default-directory) nil
(let ((default-directory tramp-compat-temporary-file-directory)
(name (plist-get args :name))
(buffer (plist-get args :buffer))
(command (plist-get args :command))
(coding (plist-get args :coding))
(noquery (plist-get args :noquery))
(connection-type
(or (plist-get args :connection-type) process-connection-type))
(filter (plist-get args :filter))
(sentinel (plist-get args :sentinel))
(stderr (plist-get args :stderr)))
(unless (stringp name)
(signal 'wrong-type-argument (list #'stringp name)))
(unless (or (bufferp buffer) (string-or-null-p buffer))
(signal 'wrong-type-argument (list #'bufferp buffer)))
(unless (consp command)
(signal 'wrong-type-argument (list #'consp command)))
(unless (or (null coding)
(and (symbolp coding) (memq coding coding-system-list))
(and (consp coding)
(memq (car coding) coding-system-list)
(memq (cdr coding) coding-system-list)))
(signal 'wrong-type-argument (list #'symbolp coding)))
(when (eq connection-type t)
(setq connection-type 'pty))
(unless (or (and (consp connection-type)
(memq (car connection-type) '(nil pipe pty))
(memq (cdr connection-type) '(nil pipe pty)))
(memq connection-type '(nil pipe pty)))
(signal 'wrong-type-argument (list #'symbolp connection-type)))
(unless (or (null filter) (eq filter t) (functionp filter))
(signal 'wrong-type-argument (list #'functionp filter)))
(unless (or (null sentinel) (functionp sentinel))
(signal 'wrong-type-argument (list #'functionp sentinel)))
(unless (or (null stderr) (bufferp stderr))
(signal 'wrong-type-argument (list #'bufferp stderr)))
(let* ((buffer
(if buffer
(get-buffer-create buffer)
;; BUFFER can be nil. We use a temporary buffer.
(generate-new-buffer tramp-temp-buffer-name)))
(orig-command command)
(env (mapcar
(lambda (elt)
(when (tramp-compat-string-search "=" elt) elt))
tramp-remote-process-environment))
;; We use as environment the difference to toplevel
;; `process-environment'.
(env (dolist (elt process-environment env)
(when
(and
(tramp-compat-string-search "=" elt)
(not
(member
elt (default-toplevel-value 'process-environment))))
(setq env (cons elt env)))))
;; Add remote path if exists.
(env (let ((remote-path
(string-join (tramp-get-remote-path v) ":")))
(setenv-internal env "PATH" remote-path 'keep)))
(env (setenv-internal
env "INSIDE_EMACS" (tramp-inside-emacs) 'keep))
(env (mapcar #'tramp-shell-quote-argument (delq nil env)))
;; Quote command.
(command (mapconcat #'tramp-shell-quote-argument command " "))
;; Set cwd and environment variables.
(command
(append
`("cd" ,(tramp-shell-quote-argument localname) "&&" "(" "env")
env `(,command ")")))
;; Add remote shell if needed.
(command
(if (consp (tramp-get-method-parameter v 'tramp-direct-async))
(append
(tramp-get-method-parameter v 'tramp-direct-async)
`(,(string-join command " ")))
command))
p)
;; Generate a command to start the process using `su' with
;; suitable options for specifying the mount namespace and
;; suchlike.
(setq
p (make-process
:name name :buffer buffer
:command (if (tramp-get-connection-property v "remote-namespace")
(append (list "su" "-mm" "-" (or user "root") "-c")
command)
(append (list "su" "-" (or user "root") "-c")
command))
:coding coding :noquery noquery :connection-type connection-type
:sentinel sentinel :stderr stderr))
;; Set filter. Prior Emacs 29.1, it doesn't work reliably
;; to provide it as `make-process' argument when filter is
;; t. See Bug#51177.
(when filter
(set-process-filter p filter))
(tramp-post-process-creation p v)
;; Query flag is overwritten in `tramp-post-process-creation',
;; so we reset it.
(set-process-query-on-exit-flag p (null noquery))
;; This is needed for ssh or PuTTY based processes, and
;; only if the respective options are set. Perhaps, the
;; setting could be more fine-grained.
;; (process-put p 'tramp-shared-socket t)
(process-put p 'remote-command orig-command)
(tramp-set-connection-property p "remote-command" orig-command)
(when (bufferp stderr)
(tramp-taint-remote-process-buffer stderr))
p)))))
(defalias 'tramp-androidsu-sh-handle-make-symbolic-link
(tramp-androidsu-generate-wrapper
@ -508,7 +612,7 @@ FUNCTION."
(make-directory-internal . ignore)
(make-lock-file-name . tramp-androidsu-handle-make-lock-file-name)
(make-nearby-temp-file . tramp-androidsu-handle-make-nearby-temp-file)
(make-process . tramp-androidsu-adb-handle-make-process)
(make-process . tramp-androidsu-make-process)
(make-symbolic-link . tramp-androidsu-sh-handle-make-symbolic-link)
(memory-info . tramp-androidsu-handle-memory-info)
(process-attributes . tramp-androidsu-handle-process-attributes)