;;; tramp.el --- Transparent Remote Access, Multiple Protocol
-;; Copyright (C) 1998-2015 Free Software Foundation, Inc.
+;; Copyright (C) 1998-2016 Free Software Foundation, Inc.
;; Author: Kai Großjohann <kai.grossjohann@gmx.net>
;; Michael Albinus <michael.albinus@gmx.de>
:type '(file :must-match t))
(defcustom tramp-encoding-command-switch
- (if (string-match "cmd\\.exe" tramp-encoding-shell)
+ (if (string-match "cmd\\.exe" (or tramp-encoding-shell ""))
"/c"
"-c")
"Use this switch together with `tramp-encoding-shell' for local commands.
:type 'string)
(defcustom tramp-encoding-command-interactive
- (unless (string-match "cmd\\.exe" tramp-encoding-shell) "-i")
+ (unless (string-match "cmd\\.exe" (or tramp-encoding-shell "")) "-i")
"Use this switch together with `tramp-encoding-shell' for interactive shells.
See the variable `tramp-encoding-shell' for more information."
:version "24.1"
* `tramp-parse-netrc' for \"~/.netrc\" like files.
* `tramp-parse-putty' for PuTTY registered sessions.
-FUNCTION can also be a customer defined function. For more details see
+FUNCTION can also be a user defined function. For more details see
the info pages.")
(defconst tramp-echo-mark-marker "_echo"
It can have the following values:
- 'ftp -- Ange-FTP respective EFS like syntax (GNU Emacs default)
- 'sep -- Syntax as defined for XEmacs."
+ `ftp' -- Ange-FTP respective EFS like syntax (GNU Emacs default)
+ `sep' -- Syntax as defined for XEmacs."
:group 'tramp
:version "24.4"
:type `(choice (const :tag ,(if (featurep 'xemacs) "EFS" "Ange-FTP") ftp)
(defun tramp-dissect-file-name (name &optional nodefault)
"Return a `tramp-file-name' structure.
-The structure consists of remote method, remote user, remote host
-and localname (file name on remote host). If NODEFAULT is
+The structure consists of remote method, remote user, remote host,
+localname (file name on remote host) and hop. If NODEFAULT is
non-nil, the file name parts are not expanded to their default
values."
(save-match-data
(setcdr v (delete (car v) (cdr v))))
;; Check for function and file or registry key.
(unless (and (functionp (nth 0 (car v)))
- (if (string-match "^HKEY_CURRENT_USER" (nth 1 (car v)))
- ;; Windows registry.
- (and (memq system-type '(cygwin windows-nt))
- (zerop
- (tramp-call-process
- v "reg" nil nil nil "query" (nth 1 (car v)))))
- ;; Configuration file.
- (file-exists-p (nth 1 (car v)))))
+ (cond
+ ;; Windows registry.
+ ((string-match "^HKEY_CURRENT_USER" (nth 1 (car v)))
+ (and (memq system-type '(cygwin windows-nt))
+ (zerop
+ (tramp-call-process
+ v "reg" nil nil nil "query" (nth 1 (car v))))))
+ ;; Zeroconf service type.
+ ((string-match
+ "^_[[:alpha:]]+\\._[[:alpha:]]+$" (nth 1 (car v))))
+ ;; Configuration file.
+ (t (file-exists-p (nth 1 (car v))))))
(setq r (delete (car v) r)))
(setq v (cdr v)))
(and (file-directory-p filename)
(file-readable-p filename)))
+(defun tramp-handle-file-equal-p (filename1 filename2)
+ "Like `file-equalp-p' for Tramp files."
+ ;; Native `file-equalp-p' calls `file-truename', which requires a
+ ;; remote connection. This can be avoided, if FILENAME1 and
+ ;; FILENAME2 are not located on the same remote host.
+ (when (string-equal
+ (file-remote-p (expand-file-name filename1))
+ (file-remote-p (expand-file-name filename2)))
+ (tramp-run-real-handler 'file-equal-p (list filename1 filename2))))
+
(defun tramp-handle-file-exists-p (filename)
"Like `file-exists-p' for Tramp files."
(not (null (file-attributes filename))))
+(defun tramp-handle-file-in-directory-p (filename directory)
+ "Like `file-in-directory-p' for Tramp files."
+ ;; Native `file-in-directory-p' calls `file-truename', which
+ ;; requires a remote connection. This can be avoided, if FILENAME
+ ;; and DIRECTORY are not located on the same remote host.
+ (when (string-equal
+ (file-remote-p (expand-file-name filename))
+ (file-remote-p (expand-file-name directory)))
+ (tramp-run-real-handler 'file-in-directory-p (list filename directory))))
+
(defun tramp-handle-file-modes (filename)
"Like `file-modes' for Tramp files."
(let ((truename (or (file-truename filename) filename)))
(when (tramp-tramp-file-p filename)
(let* ((v (tramp-dissect-file-name filename))
(p (tramp-get-connection-process v))
- (c (and p (processp p) (memq (process-status p) '(run open)))))
+ (c (and p (processp p) (memq (process-status p) '(run open))
+ (tramp-get-connection-property p "connected" nil))))
;; We expand the file name only, if there is already a connection.
(with-parsed-tramp-file-name
(if c (expand-file-name filename) filename) nil
(tramp-compat-funcall 'group-gid)
(nth 3 (tramp-compat-file-attributes "~/" id-format))))
+(defun tramp-get-local-locale (&optional vec)
+ ;; We use key nil for local connection properties.
+ (with-tramp-connection-property nil "locale"
+ (let ((candidates '("en_US.utf8" "C.utf8" "en_US.UTF-8"))
+ locale)
+ (with-temp-buffer
+ (unless (or (memq system-type '(windows-nt))
+ (not (zerop (tramp-call-process
+ nil "locale" nil t nil "-a"))))
+ (while candidates
+ (goto-char (point-min))
+ (if (string-match (format "^%s\r?$" (regexp-quote (car candidates)))
+ (buffer-string))
+ (setq locale (car candidates)
+ candidates nil)
+ (setq candidates (cdr candidates))))))
+ ;; Return value.
+ (when vec (tramp-message vec 7 "locale %s" (or locale "C")))
+ (or locale "C"))))
+
;;;###tramp-autoload
(defun tramp-check-cached-permissions (vec access)
"Check `file-attributes' caches for VEC.
(or (tramp-get-method-parameter vec 'tramp-tmpdir) "/tmp"))))
(with-tramp-connection-property vec "tmpdir"
(or (and (file-directory-p dir) (file-writable-p dir)
- (file-remote-p dir 'localname))
+ (tramp-file-name-handler 'file-remote-p dir 'localname))
(tramp-error vec 'file-error "Directory %s not accessible" dir)))
dir))
'tramp-delete-temp-file-function)))
;;; Auto saving to a special directory:
+(defvar auto-save-file-name-transforms)
(defun tramp-handle-make-auto-save-file-name ()
"Like `make-auto-save-file-name' for Tramp files.
Returns a file name in `tramp-auto-save-directory' for autosaving
this file, if that variable is non-nil."
+ (when (stringp tramp-auto-save-directory)
+ (setq tramp-auto-save-directory
+ (expand-file-name tramp-auto-save-directory)))
;; Create directory.
(unless (or (null tramp-auto-save-directory)
(file-exists-p tramp-auto-save-directory))
;;; TODO:
-;; * Rewrite `tramp-shell-quote-argument' to abstain from using
-;; `shell-quote-argument'.
;; * In Emacs 21, `insert-directory' shows total number of bytes used
;; by the files in that directory. Add this here.
;; * Avoid screen blanking when hitting `g' in dired. (Eli Tziperman)