]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix subprocess creation in directories managed by tramp-androidsu
authorPo Lu <luangruo@yahoo.com>
Thu, 29 Feb 2024 02:59:09 +0000 (10:59 +0800)
committerEshel Yaron <me@eshelyaron.com>
Sat, 2 Mar 2024 06:30:07 +0000 (07:30 +0100)
* 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.

(cherry picked from commit 15ed441fd53ddb476a2a21c8717697a74cf094e1)

lisp/net/tramp-androidsu.el

index fd9edb6a92e64c457681b0020b56ecf3dc487bcd..1623a0341b2cce86eb9d3b9932ae84569e2b073c 100644 (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)