Function: tramp-adb-maybe-open-connection

tramp-adb-maybe-open-connection is a byte-compiled function defined in tramp-adb.el.gz.

Signature

(tramp-adb-maybe-open-connection VEC)

Documentation

Maybe open a connection VEC.

Does not do anything if a connection is already open, but re-opens the connection if a previous connection has died for some reason.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-adb.el.gz
(defun tramp-adb-maybe-open-connection (vec)
  "Maybe open a connection VEC.
Does not do anything if a connection is already open, but re-opens the
connection if a previous connection has died for some reason."
  ;; During completion, don't reopen a new connection.
  (unless (tramp-connectable-p vec)
    (throw 'non-essential 'non-essential))

  (with-tramp-debug-message vec "Opening connection"
    (let* ((buf (tramp-get-connection-buffer vec))
	   (p (get-buffer-process buf))
	   (host (tramp-file-name-host vec))
	   (user (tramp-file-name-user vec))
           (device (tramp-adb-get-device vec)))

      ;; Maybe we know already that "su" is not supported.  We cannot
      ;; use a connection property, because we have not checked yet
      ;; whether it is still the same device.
      (when (and user (not (tramp-get-file-property vec "/" "su-command-p" t)))
	(tramp-error vec 'file-error "Cannot switch to user `%s'" user))

      (unless (process-live-p p)
	(save-match-data
	  (when (and p (processp p)) (delete-process p))
	  (if (tramp-string-empty-or-nil-p device)
	      (tramp-error vec 'file-error "Device %s not connected" host))
	  (with-tramp-progress-reporter vec 3 "Opening adb shell connection"
	    (let* ((coding-system-for-read 'utf-8-dos) ; Is this correct?
		   (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)))
		   (prompt (md5 (concat (prin1-to-string process-environment)
					(current-time-string)))))

	      ;; Set sentinel.  Initialize variables.
	      (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.
              (sleep-for 0.1)
	      (tramp-send-string vec tramp-rsh-end-of-line)
	      (tramp-adb-wait-for-output p 30)
	      (unless (process-live-p p)
		(tramp-error vec 'file-error "Terminated!"))

	      ;; Set connection-local variables.
	      (tramp-set-connection-local-variables vec)

	      ;; Change prompt.
	      (tramp-set-connection-property
	       p "prompt" (rx "///" (literal prompt) "#$"))
	      (tramp-adb-send-command
	       vec (format "PS1=\"///\"\"%s\"\"#$\" PS2=''" prompt))

	      ;; 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"))

	      ;; Check whether the properties have been changed.  If
	      ;; yes, this is a strong indication that we must expire
	      ;; all connection properties.  We start again.
	      (tramp-message vec 5 "Checking system information")
	      (tramp-adb-send-command
	       vec
	       (concat
		"echo \\\"`getprop ro.product.model` "
		"`getprop ro.product.version` "
		"`getprop ro.build.version.release`\\\""))
	      (let ((old-getprop (tramp-get-connection-property vec "getprop"))
		    (new-getprop
		     (tramp-set-connection-property
		      vec "getprop"
		      (with-current-buffer (tramp-get-connection-buffer vec)
			;; Read the expression.
			(goto-char (point-min))
			(read (current-buffer))))))
		(when (and (stringp old-getprop)
			   (not (string-equal old-getprop new-getprop)))
		  (tramp-message
		   vec 3
		   (concat
		    "Connection reset, because remote host changed "
		    "from `%s' to `%s'")
		   old-getprop new-getprop)
		  (tramp-cleanup-connection vec t)
		  (tramp-adb-maybe-open-connection vec)))

	      ;; Change user if indicated.
	      (when user
		(tramp-adb-send-command vec (format "su %s" user))
		(unless (tramp-adb-send-command-and-check vec nil)
		  (delete-process p)
		  ;; Do not flush, we need the nil value.
		  (tramp-set-file-property vec "/" "su-command-p" nil)
		  (tramp-error
		   vec 'file-error "Cannot switch to user `%s'" user)))

	      ;; Mark it as connected.
	      (tramp-set-connection-property p "connected" t))))))))