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

  (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 ?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)))))
	    (tramp-message
	     vec 6 "%s" (string-join (process-command p) " "))
	    ;; 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 sentinel and query flag.  Initialize variables.
	    (set-process-sentinel p #'tramp-process-sentinel)
	    (process-put p 'tramp-vector vec)
	    (process-put p 'adjust-window-size-function #'ignore)
	    (set-process-query-on-exit-flag p nil)

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

	    ;; Change prompt.
	    (tramp-set-connection-property
	     p "prompt" (tramp-compat-rx "///" (literal prompt) "#$"))
	    (tramp-adb-send-command
	     vec (format "PS1=\"///\"\"%s\"\"#$\"" 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
		 "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)))))))