Function: tramp-adb-handle-make-process

tramp-adb-handle-make-process is a byte-compiled function defined in tramp-adb.el.gz.

Signature

(tramp-adb-handle-make-process &rest ARGS)

Documentation

Like make-process for Tramp files.

STDERR can also be a remote file name. If method parameter tramp-direct-async and connection-local variable tramp-direct-async-process are non-nil, an alternative implementation will be used.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-adb.el.gz
;; We use BUFFER also as connection buffer during setup.  Because of
;; this, its original contents must be saved, and restored once
;; connection has been setup.
;; The complete STDERR buffer is available only when the process has
;; terminated.
(defun tramp-adb-handle-make-process (&rest args)
  "Like `make-process' for Tramp files.
STDERR can also be a remote file name.  If method parameter
`tramp-direct-async' and connection-local variable
`tramp-direct-async-process' are non-nil, an alternative implementation
will be used."
  (if (tramp-direct-async-process-p args)
      (apply #'tramp-handle-make-process args)
    (tramp-skeleton-make-process args nil t
      (let* ((program (car command))
	     (args (cdr command))
	     ;; STDERR can also be a file name.
	     (tmpstderr
	      (and stderr
		   (if (and (stringp stderr) (tramp-tramp-file-p stderr))
		       (tramp-unquote-file-local-name stderr)
		     (tramp-make-tramp-temp-file v))))
	     (remote-tmpstderr
	      (and tmpstderr (tramp-make-tramp-file-name v tmpstderr)))
	     (command
	      (format "cd %s && exec %s %s"
		      (tramp-shell-quote-argument localname)
		      (if tmpstderr (format "2>'%s'" tmpstderr) "")
		      (mapconcat #'tramp-shell-quote-argument
				 (cons program args) " ")))
	     (tramp-process-connection-type
	      (or (null program) tramp-process-connection-type))
	     (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
	     p)

	(when (string-match-p (rx multibyte) command)
	  (tramp-error
	   v 'file-error "Cannot apply multibyte command `%s'" command))

	(with-tramp-saved-connection-properties
	    v '("process-name" "process-buffer")
	  ;; Set the new process properties.
	  (tramp-set-connection-property v "process-name" name)
	  (tramp-set-connection-property v "process-buffer" buffer)
	  (with-current-buffer (tramp-get-connection-buffer v)
	    (unwind-protect
		;; We catch this event.  Otherwise, `make-process'
		;; could be called on the local host.
		(save-excursion
		  (save-restriction
		    ;; Activate narrowing in order to save BUFFER
		    ;; contents.  Clear also the modification time;
		    ;; otherwise we might be interrupted by
		    ;; `verify-visited-file-modtime'.
		    (let ((buffer-undo-list t)
			  (inhibit-read-only t)
			  (coding-system-for-write
			   (if (symbolp coding) coding (car coding)))
			  (coding-system-for-read
			   (if (symbolp coding) coding (cdr coding))))
		      (clear-visited-file-modtime)
		      (narrow-to-region (point-max) (point-max))
		      ;; We call `tramp-adb-maybe-open-connection', in
		      ;; order to cleanup the prompt afterwards.
		      (tramp-adb-maybe-open-connection v)
		      (delete-region (point-min) (point-max))
		      ;; Send the command.
		      (setq p (tramp-get-connection-process v))
                      (tramp-adb-send-command v command nil t) ; nooutput
		      ;; Set sentinel and filter.
		      (when sentinel
			(set-process-sentinel p sentinel))
		      (when filter
			(set-process-filter p filter))
		      (process-put p 'remote-command orig-command)
		      (tramp-set-connection-property
		       p "remote-command" orig-command)
		      ;; Set query flag and process marker for this
		      ;; process.  We ignore errors, because the
		      ;; process could have finished already.
		      (ignore-errors
			(set-process-query-on-exit-flag p (null noquery))
			(set-marker (process-mark p) (point))
			;; We must flush them here already;
			;; otherwise `rename-file', `delete-file'
			;; or `insert-file-contents' will fail.
			(tramp-flush-connection-property v "process-name")
			(tramp-flush-connection-property v "process-buffer")
			;; Copy tmpstderr file.
			(when (and (stringp stderr)
				   (not (tramp-tramp-file-p stderr)))
			  (add-function
			   :after (process-sentinel p)
			   (lambda (_proc _msg)
			     (rename-file remote-tmpstderr stderr))))
			;; Read initial output.  Remove the first
			;; line, which is the command echo.
			(unless (eq filter t)
			  (while (progn
				   (goto-char (point-min))
				   (not (search-forward "\n" nil t)))
			    (tramp-accept-process-output p))
			  (delete-region (point-min) (point)))
			;; Provide error buffer.  This shows only
			;; initial error messages; messages arriving
			;; later on will be inserted when the process
			;; is deleted.  The temporary file will exist
			;; until the process is deleted.
			(when (bufferp stderr)
			  (ignore-errors
			    (tramp-taint-remote-process-buffer stderr)
			    (with-current-buffer stderr
			      (insert-file-contents-literally
			       remote-tmpstderr 'visit)))
			  ;; Delete tmpstderr file.
			  (add-function
			   :after (process-sentinel p)
			   (lambda (_proc _msg)
			     (ignore-errors
			       (with-current-buffer stderr
				 (insert-file-contents-literally
				  remote-tmpstderr 'visit nil nil 'replace))
			       (delete-file remote-tmpstderr)))))
			;; Return process.
			p))))

	      ;; Save exit.
	      (if (string-prefix-p tramp-temp-buffer-name (buffer-name))
		  (ignore-errors
		    (set-process-buffer p nil)
		    (kill-buffer (current-buffer)))
		(set-buffer-modified-p bmp)))))))))