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:
parent
05195e129f
commit
15ed441fd5
1 changed files with 119 additions and 15 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue