Function: tramp-smb-handle-start-file-process

tramp-smb-handle-start-file-process is a byte-compiled function defined in tramp-smb.el.gz.

Signature

(tramp-smb-handle-start-file-process NAME BUFFER PROGRAM &rest ARGS)

Documentation

Like start-file-process for Tramp files.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-smb.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.
(defun tramp-smb-handle-start-file-process (name buffer program &rest args)
  "Like `start-file-process' for Tramp files."
  (with-parsed-tramp-file-name default-directory nil
    (let* ((buffer
	    (if buffer
		(get-buffer-create buffer)
	      ;; BUFFER can be nil.  We use a temporary buffer.
	      (generate-new-buffer tramp-temp-buffer-name)))
	   (command (string-join (cons program args) " "))
	   (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
	   (name1 name)
	   (i 0)
	   p)
      (unwind-protect
	  (with-tramp-saved-connection-properties
	      v '("process-name" "process-buffer")
	    (save-excursion
	      (save-restriction
		(while (get-process name1)
		  ;; NAME must be unique as process name.
		  (setq i (1+ i)
			name1 (format "%s<%d>" name i)))
		;; Set the new process properties.
		(tramp-set-connection-property v "process-name" name1)
		(tramp-set-connection-property v "process-buffer" buffer)
		;; Activate narrowing in order to save BUFFER contents.
		(with-current-buffer (tramp-get-connection-buffer v)
		  (let ((buffer-undo-list t))
		    (narrow-to-region (point-max) (point-max))
		    (tramp-smb-call-winexe v)
		    (when (tramp-smb-get-share v)
		      (tramp-smb-send-command
		       v (format
			  "cd //%s%s"
			  host
			  (tramp-smb-shell-quote-argument
			   (file-name-directory localname)))))
		    (tramp-message v 6 "(%s); exit" command)
		    (tramp-send-string v command)))
		(setq p (tramp-get-connection-process v))
		(when program
		  (process-put p 'remote-command (cons program args))
		  (tramp-set-connection-property
		   p "remote-command" (cons program args)))
		;; Return value.
		p)))

	;; Save exit.
	;; FIXME: Does `tramp-get-connection-buffer' return the proper value?
	(with-current-buffer (tramp-get-connection-buffer v)
	  (if (tramp-compat-string-search tramp-temp-buffer-name (buffer-name))
	      (progn
		(set-process-buffer (tramp-get-connection-process v) nil)
		(kill-buffer (current-buffer)))
	    (set-buffer-modified-p bmp)))))))