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))
      (unwind-protect
	  (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 (file-name-directory localname))))
		  (tramp-message v 6 "(%s); exit" command)
		  (tramp-send-string v command)))
	      ;; Return value.
	      (tramp-get-connection-process v)))

	;; Save exit.
	(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)))
	(tramp-flush-connection-property v "process-name")
	(tramp-flush-connection-property v "process-buffer")))))