summaryrefslogtreecommitdiff
path: root/lisp/files.el
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2019-09-06 14:30:33 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2019-09-06 14:31:38 -0700
commita59839d7556ef85058e09b005f0ff32e59b20ec3 (patch)
tree7e4eb3909246dde8efdcaecd77cfd41e75b93593 /lisp/files.el
parent5b117511aa1b5c451773891b505a7098a67f9532 (diff)
downloademacs-a59839d7556ef85058e09b005f0ff32e59b20ec3.tar.gz
file-truename now uses realpath for local files
This uses fewer syscalls on GNU/Linux and other GNUish platforms. * lisp/files.el (file-truename): Try fileio--truename if there are no handlers. * src/fileio.c: Include stdlib.h, for realpath. (Ffileio__truename): New function.
Diffstat (limited to 'lisp/files.el')
-rw-r--r--lisp/files.el11
1 files changed, 8 insertions, 3 deletions
diff --git a/lisp/files.el b/lisp/files.el
index ce4dd99bd53..d32c6acb82c 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1307,9 +1307,14 @@ containing it, until no links are left at any level.
(let ((handler (find-file-name-handler filename 'file-truename)))
;; For file name that has a special handler, call handler.
;; This is so that ange-ftp can save time by doing a no-op.
- (if handler
- (setq filename (funcall handler 'file-truename filename)
- done t)
+ (or
+ (if handler
+ (setq filename (funcall handler 'file-truename filename)
+ done t)
+ (condition-case nil
+ (setq filename (fileio--truename filename)
+ done t)
+ (file-missing nil)))
(let ((dir (or (file-name-directory filename) default-directory))
target dirfile)
;; Get the truename of the directory.