1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-05 22:20:24 -08:00

Add consistent environment for local process calls in Tramp

* lisp/net/tramp-adb.el (tramp-adb-maybe-open-connection):
* lisp/net/tramp-androidsu.el (tramp-androidsu-maybe-open-connection):
* lisp/net/tramp-gvfs.el (tramp-gvfs-handle-file-notify-add-watch):
* lisp/net/tramp-sh.el (tramp-do-copy-or-rename-file-out-of-band)
(tramp-maybe-open-connection):
* lisp/net/tramp-smb.el (tramp-smb-handle-copy-directory)
(tramp-smb-handle-file-acl)
(tramp-smb-handle-file-notify-add-watch)
(tramp-smb-handle-set-file-acl, tramp-smb-maybe-open-connection):
* lisp/net/tramp-sudoedit.el (tramp-sudoedit-send-command):
Use `tramp-start-process'.  Do not call	`tramp-post-process-creation'.

* lisp/net/tramp.el (with-tramp-local-environment): New defmacro.
(tramp-start-process): New defun.
(tramp-call-process, tramp-call-process-region)
(tramp-process-lines): Use `with-tramp-local-environment'.
This commit is contained in:
Michael Albinus 2025-07-23 16:22:26 +02:00
parent 2d1d1f31df
commit c142f0d246
7 changed files with 92 additions and 97 deletions

View file

@ -1117,17 +1117,14 @@ connection if a previous connection has died for some reason."
(process-connection-type tramp-process-connection-type)
(args (tramp-expand-args
vec 'tramp-login-args nil ?d (or device "")))
(p (let ((default-directory
tramp-compat-temporary-file-directory))
(apply
#'start-process (tramp-get-connection-name vec) buf
tramp-adb-program args)))
(p (apply
#'tramp-start-process vec (tramp-get-connection-name vec)
buf tramp-adb-program args))
(prompt (md5 (concat (prin1-to-string process-environment)
(current-time-string)))))
;; Set sentinel. Initialize variables.
;; Set sentinel.
(set-process-sentinel p #'tramp-process-sentinel)
(tramp-post-process-creation p vec)
;; Wait for initial prompt. On some devices, it needs
;; an initial RET, in order to get it.

View file

@ -131,19 +131,18 @@ multibyte mode and waits for the shell prompt to appear."
;; The executable loader cannot execute setuid
;; binaries, such as su.
(android-use-exec-loader nil)
(p (start-process (tramp-get-connection-name vec)
(tramp-get-connection-buffer vec)
;; Disregard
;; `tramp-encoding-shell', as
;; there's no guarantee that it's
;; possible to execute it with
;; `android-use-exec-loader' off.
tramp-androidsu-local-shell-name "-i"))
(p (tramp-start-process
vec (tramp-get-connection-name vec)
(tramp-get-connection-buffer vec)
;; Disregard `tramp-encoding-shell', as
;; there's no guarantee that it's possible to
;; execute it with `android-use-exec-loader'
;; off.
tramp-androidsu-local-shell-name "-i"))
(user (tramp-file-name-user vec))
su-binary path command)
;; Set sentinel. Initialize variables.
;; Set sentinel.
(set-process-sentinel p #'tramp-process-sentinel)
(tramp-post-process-creation p vec)
;; Replace `login-args' place holders. `PATH' must be
;; set to `tramp-androidsu-remote-path', as some `su'
;; implementations propagate their callers' environments

View file

@ -1510,7 +1510,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
'(created changed changes-done-hint moved deleted unmounted))
((memq 'attribute-change flags) '(attribute-changed unmounted))))
(p (apply
#'start-process
#'tramp-start-process v
"gvfs-monitor" (generate-new-buffer " *gvfs-monitor*")
`("gio" "monitor" ,(tramp-gvfs-url-file-name file-name)))))
(if (not (processp p))
@ -1521,7 +1521,6 @@ If FILE-SYSTEM is non-nil, return file system attributes."
(process-put p 'tramp-watch-name localname)
(set-process-filter p #'tramp-gvfs-monitor-process-filter)
(set-process-sentinel p #'tramp-file-notify-process-sentinel)
(tramp-post-process-creation p v)
;; There might be an error if the monitor is not supported.
;; Give the filter a chance to read the output.
(while (tramp-accept-process-output p))

View file

@ -2618,14 +2618,11 @@ The method used must be an out-of-band method."
;; can be handled. We don't set a timeout, because
;; the copying of large files can last longer than 60
;; secs.
p (let ((default-directory
tramp-compat-temporary-file-directory))
(apply
#'start-process
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
copy-program copy-args)))
(tramp-post-process-creation p v)
p (apply
#'tramp-start-process v
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
copy-program copy-args))
;; We must adapt `tramp-local-end-of-line' for sending
;; the password. Also, we indicate that perhaps
@ -3915,7 +3912,7 @@ Fall back to normal file name handler if no Tramp handler exists."
bol (+ (not ":")) ":" blank
(group (+ (not ":"))) ":" blank
(group (regexp (regexp-opt tramp-gio-events)))
(? blank (group (+ (not ":")))) eol)
(? blank (group (+ (not (any "\r\n:"))))) eol)
string)
(let* ((file (match-string 1 string))
@ -5242,21 +5239,18 @@ connection if a previous connection has died for some reason."
(extra-args (tramp-get-sh-extra-args tramp-encoding-shell))
;; This must be done in order to avoid our file
;; name handler.
(p (let ((default-directory
tramp-compat-temporary-file-directory))
(apply
#'start-process
(tramp-get-connection-name vec)
(tramp-get-connection-buffer vec)
(append
`(,tramp-encoding-shell)
(and extra-args (split-string extra-args))
(and tramp-encoding-command-interactive
`(,tramp-encoding-command-interactive)))))))
(p (apply
#'tramp-start-process vec
(tramp-get-connection-name vec)
(tramp-get-connection-buffer vec)
(append
`(,tramp-encoding-shell)
(and extra-args (split-string extra-args))
(and tramp-encoding-command-interactive
`(,tramp-encoding-command-interactive))))))
;; Set sentinel. Initialize variables.
(set-process-sentinel p #'tramp-process-sentinel)
(tramp-post-process-creation p vec)
(setq tramp-current-connection (cons vec (current-time)))
;; Set connection-local variables.

View file

@ -552,13 +552,11 @@ arguments to pass to the OPERATION."
;; Use an asynchronous processes. By this,
;; password can be handled.
(let* ((default-directory tmpdir)
(p (apply
#'start-process
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
tramp-smb-program args)))
(tramp-post-process-creation p v)
(let ((p (apply
#'tramp-start-process v
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
tramp-smb-program args)))
(tramp-process-actions
p v nil tramp-smb-actions-with-tar)
@ -813,11 +811,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
;; Use an asynchronous process. By this, password
;; can be handled.
(let ((p (apply
#'start-process
#'tramp-start-process v
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
tramp-smb-acl-program args)))
(tramp-post-process-creation p v)
(tramp-process-actions p v nil tramp-smb-actions-get-acl)
(when (> (point-max) (point-min))
(substring-no-properties (buffer-string))))))))))))
@ -1000,7 +997,6 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
(process-put p 'tramp-watch-name localname)
(set-process-filter p #'tramp-smb-notify-process-filter)
(set-process-sentinel p #'tramp-file-notify-process-sentinel)
(tramp-post-process-creation p v)
;; There might be an error if the monitor is not supported.
;; Give the filter a chance to read the output.
(while (tramp-accept-process-output p))
@ -1505,11 +1501,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
;; Use an asynchronous process. By this, password
;; can be handled.
(let ((p (apply
#'start-process
#'tramp-start-process v
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
tramp-smb-acl-program args)))
(tramp-post-process-creation p v)
(tramp-process-actions p v nil tramp-smb-actions-set-acl)
;; This is meant for traces, and returning from
;; the function. No error is propagated outside,
@ -2042,23 +2037,12 @@ If ARGUMENT is non-nil, use it as argument for
(let* (coding-system-for-read
(process-connection-type tramp-process-connection-type)
(p (let ((default-directory
tramp-compat-temporary-file-directory)
(process-environment
(cons (concat "TERM=" tramp-terminal-type)
process-environment))
;; There might be some unfortune values of
;; `tramp-smb-connection-local-default-system-variables'.
(path-separator (default-value 'path-separator))
(null-device (default-value 'null-device))
(exec-suffixes (default-value 'exec-suffixes)))
(apply #'start-process
(tramp-get-connection-name vec)
(tramp-get-connection-buffer vec)
(if argument
tramp-smb-winexe-program tramp-smb-program)
args))))
(tramp-post-process-creation p vec)
(p (apply #'tramp-start-process vec
(tramp-get-connection-name vec)
(tramp-get-connection-buffer vec)
(if argument
tramp-smb-winexe-program tramp-smb-program)
args)))
;; Set connection-local variables.
(tramp-set-connection-local-variables vec)

View file

@ -769,14 +769,15 @@ in case of error, t otherwise."
(erase-buffer)
(let* ((delete-exited-processes t)
(process-connection-type tramp-process-connection-type)
(p (apply #'start-process
(tramp-get-connection-name vec) (current-buffer)
(append
(tramp-expand-args
vec 'tramp-sudo-login nil
?h (or (tramp-file-name-host vec) "")
?u (or (tramp-file-name-user vec) ""))
(flatten-tree args))))
(p (apply
#'tramp-start-process vec
(tramp-get-connection-name vec) (current-buffer)
(append
(tramp-expand-args
vec 'tramp-sudo-login nil
?h (or (tramp-file-name-host vec) "")
?u (or (tramp-file-name-user vec) ""))
(flatten-tree args))))
;; We suppress the messages `Waiting for prompts from remote shell'.
(tramp-verbose (if (= tramp-verbose 3) 2 tramp-verbose))
;; The password shall be cached also in case of "emacs -Q".
@ -786,7 +787,6 @@ in case of error, t otherwise."
auth-source-save-behavior)
;; Avoid process status message in output buffer.
(set-process-sentinel p #'ignore)
(tramp-post-process-creation p vec)
(tramp-set-connection-property p "pw-vector" tramp-sudoedit-null-hop)
(tramp-process-actions p vec nil tramp-sudoedit-sudo-actions)
(tramp-message vec 6 "%s\n%s" (process-exit-status p) (buffer-string))

View file

@ -6867,16 +6867,41 @@ ALIST is of the form ((FROM . TO) ...)."
;;; Compatibility functions section:
(defmacro with-tramp-local-environment (&rest body)
"Set environment for local processes and run BODY.
Beside some global variables, it let-binds also the connection-local
variables defined in `tramp-connection-local-default-system-variables'.
If the current buffer is a remote one, these connection-local variables
might have improper values."
(declare (debug t))
(let ((bindings
(mapcar
(lambda (elem) `(,elem (default-value ',elem)))
(mapcar #'car tramp-connection-local-default-system-variables))))
`(let* ((default-directory tramp-compat-temporary-file-directory)
(temporary-file-directory tramp-compat-temporary-file-directory)
(process-environment
(cons "TERM=dumb" (default-toplevel-value 'process-environment)))
,@bindings)
,@body)))
(defun tramp-start-process (vec name buffer program &rest args)
"Call `start-process' on the local host.
Run post process creation actions. Traces are written with verbosity of 6."
(let ((vec (or vec (car tramp-current-connection)))
(p (with-tramp-local-environment
(apply #'start-process name buffer program args))))
;; Initialize variables.
(tramp-post-process-creation p vec)
p))
(defun tramp-call-process
(vec program &optional infile destination display &rest args)
"Call `call-process' on the local host.
It always returns a return code. The Lisp error raised when
PROGRAM is nil is trapped also, returning 1. Furthermore, traces
are written with verbosity of 6."
(let ((default-directory tramp-compat-temporary-file-directory)
(temporary-file-directory tramp-compat-temporary-file-directory)
(process-environment (default-toplevel-value 'process-environment))
(destination (if (eq destination t) (current-buffer) destination))
(let ((destination (if (eq destination t) (current-buffer) destination))
(vec (or vec (car tramp-current-connection)))
output error result)
(tramp-message
@ -6885,8 +6910,9 @@ are written with verbosity of 6."
(condition-case err
(with-temp-buffer
(setq result
(apply
#'call-process program infile (or destination t) display args)
(with-tramp-local-environment
(apply
#'call-process program infile (or destination t) display args))
output (tramp-get-buffer-string destination))
;; `result' could also be an error string.
(when (stringp result)
@ -6906,10 +6932,7 @@ are written with verbosity of 6."
It always returns a return code. The Lisp error raised when
PROGRAM is nil is trapped also, returning 1. Furthermore, traces
are written with verbosity of 6."
(let ((default-directory tramp-compat-temporary-file-directory)
(temporary-file-directory tramp-compat-temporary-file-directory)
(process-environment (default-toplevel-value 'process-environment))
(buffer (if (eq buffer t) (current-buffer) buffer))
(let ((buffer (if (eq buffer t) (current-buffer) buffer))
(vec (or vec (car tramp-current-connection)))
result)
(tramp-message
@ -6918,9 +6941,10 @@ are written with verbosity of 6."
(condition-case err
(progn
(setq result
(apply
#'call-process-region
start end program delete buffer display args))
(with-tramp-local-environment
(apply
#'call-process-region
start end program delete buffer display args)))
;; `result' could also be an error string.
(when (stringp result)
(signal 'file-error (list result)))
@ -6933,21 +6957,19 @@ are written with verbosity of 6."
(tramp-message vec 6 "%d\n%s" result (error-message-string err))))
result))
(defun tramp-process-lines
(vec program &rest args)
(defun tramp-process-lines (vec program &rest args)
"Call `process-lines' on the local host.
If an error occurs, it returns nil. Traces are written with
verbosity of 6."
(let ((default-directory tramp-compat-temporary-file-directory)
(process-environment (default-toplevel-value 'process-environment))
(vec (or vec (car tramp-current-connection)))
(let ((vec (or vec (car tramp-current-connection)))
result)
(if args
(tramp-message vec 6 "%s %s" program (string-join args " "))
(tramp-message vec 6 "%s" program))
(setq result
(condition-case err
(apply #'process-lines program args)
(with-tramp-local-environment
(apply #'process-lines program args))
(error
(tramp-error vec (car err) (cdr err)))))
(tramp-message vec 6 "\n%s" (string-join result "\n"))