aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Großjohann2004-02-29 17:52:17 +0000
committerKai Großjohann2004-02-29 17:52:17 +0000
commit5ec2cc41db095268a8597af7705bfc3d156b99db (patch)
tree0dcf5f2e73da2e610f04417e80290c58f314e814
parentcc86f83f38c5c9ffbe8ac6a2a5ba35b9e9080a93 (diff)
downloademacs-5ec2cc41db095268a8597af7705bfc3d156b99db.tar.gz
emacs-5ec2cc41db095268a8597af7705bfc3d156b99db.zip
Tramp: sync with upstream version 2.0.39.
-rw-r--r--lisp/ChangeLog99
-rw-r--r--lisp/net/tramp-ftp.el17
-rw-r--r--lisp/net/tramp-smb.el137
-rw-r--r--lisp/net/tramp.el766
-rw-r--r--lisp/net/trampver.el2
-rw-r--r--man/ChangeLog17
-rw-r--r--man/tramp.texi269
-rw-r--r--man/trampver.texi5
8 files changed, 913 insertions, 399 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 6bb5012c332..d112071c5be 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,102 @@
12004-02-29 Kai Grossjohann <kai.grossjohann@gmx.net>
2 Version 2.0.39 of Tramp released.
3
4 * net/tramp.el (tramp-handle-file-local-copy)
5 (tramp-handle-write-region, tramp-open-connection-rsh): Variable
6 name typo. Small change. From Patrick Tullmann
7 <tullmann@flux.utah.edu>.
8 (tramp-process-connection-type): New variable.
9 (tramp-maybe-open-connection): Use it.
10 (tramp-do-copy-or-rename-via-buffer): Handle KEEP-DATE arg, if
11 possible.
12 (tramp-touch): Set last-modified time of a remote file.
13 (tramp-handle-write-region): Say which function is used when
14 encoding.
15
16
172004-02-29 Michael Albinus <Michael.Albinus@alcatel.de>
18
19 * net/tramp-smb.el (tramp-smb-handle-file-writable-p): Handle the
20 case of non-existing filename, too. Reported by Christoph Bauer
21 <c_bauer@informatik.uni-kl.de>.
22 (tramp-smb-get-file-entries): The directory in question should
23 have permissions "drwxrwxrwx". Just virtual, because we don't
24 know the real permissions. Don't we know?
25 (tramp-smb-prompt): Add virtual prompt from listing shares, too.
26 (tramp-smb-errors): Add "NT_STATUS_ACCOUNT_LOCKED_OUT".
27 (tramp-smb-wait-for-output): Optimize algorithm getting pending
28 output. If it was received chunkwise, there have been problems.
29 Remove the "prompt not found" error message; it is obvious.
30 Simplify algorithm.
31 (tramp-smb-process-running): Removed. Since we acknowledge the
32 virtual prompt for shares, there's no need for distinction of
33 reading shares (process ends afterwards) and interactive mode of
34 smblient.
35 (tramp-smb-open-connection): Setting process sentinel removed.
36 (tramp-smb-errors): Add "NT_STATUS_WRONG_PASSWORD" and
37 "NT_STATUS_NETWORK_ACCESS_DENIED".
38 (tramp-smb-maybe-open-connection): Set `process-connection-type'
39 to 'pty. Suggested by Piet van Oostrum <piet@cs.uu.nl>.
40 (top-level): Setting default value in `tramp-default-method-alist'
41 corrected. Order of USER and HOST have been wrong. Nobody
42 claimed for months ...
43 (tramp-smb-maybe-open-connection): Use
44 `tramp-process-connection-type'.
45 (tramp-smb-open-connection): Clear password cache if login has
46 failed.
47
48 * net/tramp.el (tramp-completion-mode) Don't check for 'xemacs but
49 `tramp-unified-filenames'.
50 (tramp-completion-mode): Make test for XEmacs explicitely.
51 `event-to-character' can exists in Emacs packages too. Reported
52 by Matt Swift <swift@alum.mit.edu>.
53 (tramp-buffer-name): Buffer name must contain the user if exists.
54 Reported by Adrian Phillips <a.phillips@met.no>.
55 (tramp-do-copy-or-rename-file): Handle out-of-band methods. Call
56 `tramp-do-copy-or-rename-file-out-of-band' this case.
57 (tramp-do-copy-or-rename-file-out-of-band): Renamed from
58 `tramp-do-copy-or-rename-file-one-local', because it handles also
59 the case both files use the same out-of-band method.
60 Implementation added.
61 (tramp-handle-file-local-copy, tramp-handle-write-region):
62 Out-of-band handling removed. `copy-file' called instead, which
63 calls `tramp-do-copy-or-rename-file-out-of-band'.
64 (tramp-action-password): Check for out-of-band method removed.
65 This function is used for 'login-program.
66 (tramp-post-connection): Use `tramp-method-out-of-band-p' when
67 appropriate.
68 (tramp-completion-function-alist-ssh): Add `tramp-parse-shostkeys'
69 and `tramp-parse-sknownhosts'.
70 (tramp-completion-function-alist): It's a defvar now, because we
71 want to apply the optimized `tramp-set-completion-function'
72 instead of a static list.
73 (tramp-set-completion-function): Implementation tuned. Avoid
74 double entries, and entries where the function or the
75 file/directory doesn't exist.
76 (tramp-parse-shostkeys, tramp-parse-sknownhosts): New functions
77 for SSH2.
78 (tramp-file-name-handler-alist): Add `dired-compress-file' entry.
79 (tramp-handle-dired-compress-file): New function.
80 (tramp-async-proc): New variable.
81 (tramp-handle-shell-command): Adding asynchronous processes. They
82 are far from being perfect, but it works at least for
83 `find-grep-dired' and `find-name-dired' in Emacs 21.4.
84 (top-level): Require password.el if visible. Should be mandatory
85 once No Gnus has found its way into (X)Emacs.
86 (tramp-read-passwd): Invoke `password-read' if available,
87 `read-passwd' otherwise. `ange-ftp-read-passwd' isn't used as
88 fallback any longer.
89 (tramp-clear-passwd): New function.
90 (tramp-process-actions, tramp-process-multi-actions): Clear
91 password cache if login has failed.
92
93 * net/tramp-ftp.el (Commentary): Remove pointer to EFS. It has
94 its own module.
95 (tramp-ftp-file-name-handler): Unset `ange-ftp-ftp-name-arg' and
96 `ange-ftp-ftp-name-res'. There could be incorrect values from
97 previous calls in case the "ftp" method is used in the Tramp file
98 name. Reported by Katsumi Yamaoka <yamaoka@jpl.org>.
99
12004-02-28 Richard M. Stallman <rms@gnu.org> 1002004-02-28 Richard M. Stallman <rms@gnu.org>
2 101
3 * term.el (term-mouse-paste): Call mouse-set-point. 102 * term.el (term-mouse-paste): Call mouse-set-point.
diff --git a/lisp/net/tramp-ftp.el b/lisp/net/tramp-ftp.el
index c81e49bf77c..3be891a49f8 100644
--- a/lisp/net/tramp-ftp.el
+++ b/lisp/net/tramp-ftp.el
@@ -1,6 +1,6 @@
1;;; tramp-ftp.el --- Tramp convenience functions for Ange-FTP and EFS -*- coding: iso-8859-1; -*- 1;;; tramp-ftp.el --- Tramp convenience functions for Ange-FTP and EFS -*- coding: iso-8859-1; -*-
2 2
3;; Copyright (C) 2002, 2003 Free Software Foundation, Inc. 3;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4 4
5;; Author: Michael Albinus <Michael.Albinus@alcatel.de> 5;; Author: Michael Albinus <Michael.Albinus@alcatel.de>
6;; Keywords: comm, processes 6;; Keywords: comm, processes
@@ -24,8 +24,8 @@
24 24
25;;; Commentary: 25;;; Commentary:
26 26
27;; Convenience functions for calling Ange-FTP (and maybe EFS, later on) 27;; Convenience functions for calling Ange-FTP from Tramp.
28;; from Tramp. Most of them are displaced from tramp.el. 28;; Most of them are displaced from tramp.el.
29 29
30;;; Code: 30;;; Code:
31 31
@@ -98,9 +98,16 @@ pass to the OPERATION."
98 (list (nth 0 tramp-file-name-structure) 98 (list (nth 0 tramp-file-name-structure)
99 (nth 3 tramp-file-name-structure) 99 (nth 3 tramp-file-name-structure)
100 (nth 2 tramp-file-name-structure) 100 (nth 2 tramp-file-name-structure)
101 (nth 4 tramp-file-name-structure)))) 101 (nth 4 tramp-file-name-structure)))
102 ;; ange-ftp uses `ange-ftp-ftp-name-arg' and `ange-ftp-ftp-name-res'
103 ;; for optimization in `ange-ftp-ftp-name'. If Tramp wasn't active,
104 ;; there could be incorrect values from previous calls in case the
105 ;; "ftp" method is used in the Tramp file name. So we unset
106 ;; those values.
107 (ange-ftp-ftp-name-arg "")
108 (ange-ftp-ftp-name-res nil))
102 (cond 109 (cond
103 ;; If argument is a symlink, 'file-directory-p` and 'file-exists-p` 110 ;; If argument is a symlink, `file-directory-p' and `file-exists-p'
104 ;; call the traversed file recursively. So we cannot disable the 111 ;; call the traversed file recursively. So we cannot disable the
105 ;; file-name-handler this case. 112 ;; file-name-handler this case.
106 ((memq operation '(file-directory-p file-exists-p)) 113 ((memq operation '(file-directory-p file-exists-p))
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 95f3fb330c4..ab6ad3310c1 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -1,6 +1,6 @@
1;;; tramp-smb.el --- Tramp access functions for SMB servers -*- coding: iso-8859-1; -*- 1;;; tramp-smb.el --- Tramp access functions for SMB servers -*- coding: iso-8859-1; -*-
2 2
3;; Copyright (C) 2002, 2003 Free Software Foundation, Inc. 3;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4 4
5;; Author: Michael Albinus <Michael.Albinus@alcatel.de> 5;; Author: Michael Albinus <Michael.Albinus@alcatel.de>
6;; Keywords: comm, processes 6;; Keywords: comm, processes
@@ -50,7 +50,7 @@
50;; Add a default for `tramp-default-method-alist'. Rule: If there is 50;; Add a default for `tramp-default-method-alist'. Rule: If there is
51;; a domain in USER, it must be the SMB method. 51;; a domain in USER, it must be the SMB method.
52(add-to-list 'tramp-default-method-alist 52(add-to-list 'tramp-default-method-alist
53 (list "%" "" tramp-smb-method)) 53 (list "" "%" tramp-smb-method))
54 54
55;; Add completion function for SMB method. 55;; Add completion function for SMB method.
56(tramp-set-completion-function 56(tramp-set-completion-function
@@ -62,7 +62,7 @@
62 :group 'tramp 62 :group 'tramp
63 :type 'string) 63 :type 'string)
64 64
65(defconst tramp-smb-prompt "^smb: \\S-+> " 65(defconst tramp-smb-prompt "^smb: \\S-+> \\|^\\s-+Server\\s-+Comment$"
66 "Regexp used as prompt in smbclient.") 66 "Regexp used as prompt in smbclient.")
67 67
68(defconst tramp-smb-errors 68(defconst tramp-smb-errors
@@ -71,8 +71,8 @@
71 '(; Connection error 71 '(; Connection error
72 "Connection to \\S-+ failed" 72 "Connection to \\S-+ failed"
73 ; Samba 73 ; Samba
74 "ERRSRV"
75 "ERRDOS" 74 "ERRDOS"
75 "ERRSRV"
76 "ERRbadfile" 76 "ERRbadfile"
77 "ERRbadpw" 77 "ERRbadpw"
78 "ERRfilexists" 78 "ERRfilexists"
@@ -81,13 +81,16 @@
81 "ERRnosuchshare" 81 "ERRnosuchshare"
82 ; Windows NT 4.0, Windows 5.0 (Windows 2000), Windows 5.1 (Windows XP) 82 ; Windows NT 4.0, Windows 5.0 (Windows 2000), Windows 5.1 (Windows XP)
83 "NT_STATUS_ACCESS_DENIED" 83 "NT_STATUS_ACCESS_DENIED"
84 "NT_STATUS_ACCOUNT_LOCKED_OUT"
84 "NT_STATUS_BAD_NETWORK_NAME" 85 "NT_STATUS_BAD_NETWORK_NAME"
85 "NT_STATUS_CANNOT_DELETE" 86 "NT_STATUS_CANNOT_DELETE"
86 "NT_STATUS_LOGON_FAILURE" 87 "NT_STATUS_LOGON_FAILURE"
88 "NT_STATUS_NETWORK_ACCESS_DENIED"
87 "NT_STATUS_NO_SUCH_FILE" 89 "NT_STATUS_NO_SUCH_FILE"
88 "NT_STATUS_OBJECT_NAME_INVALID" 90 "NT_STATUS_OBJECT_NAME_INVALID"
89 "NT_STATUS_OBJECT_NAME_NOT_FOUND" 91 "NT_STATUS_OBJECT_NAME_NOT_FOUND"
90 "NT_STATUS_SHARING_VIOLATION") 92 "NT_STATUS_SHARING_VIOLATION"
93 "NT_STATUS_WRONG_PASSWORD")
91 "\\|") 94 "\\|")
92 "Regexp for possible error strings of SMB servers. 95 "Regexp for possible error strings of SMB servers.
93Used instead of analyzing error codes of commands.") 96Used instead of analyzing error codes of commands.")
@@ -102,12 +105,6 @@ This variable is local to each buffer.")
102This variable is local to each buffer.") 105This variable is local to each buffer.")
103(make-variable-buffer-local 'tramp-smb-share-cache) 106(make-variable-buffer-local 'tramp-smb-share-cache)
104 107
105(defvar tramp-smb-process-running nil
106 "Flag whether a corresponding process is still running.
107Will be changed by corresponding `process-sentinel'.
108This variable is local to each buffer.")
109(make-variable-buffer-local 'tramp-smb-process-running)
110
111(defvar tramp-smb-inodes nil 108(defvar tramp-smb-inodes nil
112 "Keeps virtual inodes numbers for SMB files.") 109 "Keeps virtual inodes numbers for SMB files.")
113 110
@@ -452,19 +449,23 @@ KEEP-DATE is not handled in case NEWNAME resides on an SMB server."
452 449
453(defun tramp-smb-handle-file-writable-p (filename) 450(defun tramp-smb-handle-file-writable-p (filename)
454 "Like `file-writable-p' for tramp files." 451 "Like `file-writable-p' for tramp files."
455; (with-parsed-tramp-file-name filename nil 452 (if (not (file-exists-p filename))
456 (let (user host localname) 453 (let ((dir (file-name-directory filename)))
457 (with-parsed-tramp-file-name filename l 454 (and (file-exists-p dir)
458 (setq user l-user host l-host localname l-localname)) 455 (file-writable-p dir)))
459 (save-excursion 456; (with-parsed-tramp-file-name filename nil
460 (let* ((share (tramp-smb-get-share localname)) 457 (let (user host localname)
461 (file (tramp-smb-get-localname localname nil)) 458 (with-parsed-tramp-file-name filename l
462 (entries (tramp-smb-get-file-entries user host share file)) 459 (setq user l-user host l-host localname l-localname))
463 (entry (and entries 460 (save-excursion
464 (assoc (file-name-nondirectory file) entries)))) 461 (let* ((share (tramp-smb-get-share localname))
465 (and entry 462 (file (tramp-smb-get-localname localname nil))
466 (string-match "w" (nth 1 entry)) 463 (entries (tramp-smb-get-file-entries user host share file))
467 t))))) 464 (entry (and entries
465 (assoc (file-name-nondirectory file) entries))))
466 (and share entry
467 (string-match "w" (nth 1 entry))
468 t))))))
468 469
469(defun tramp-smb-handle-insert-directory 470(defun tramp-smb-handle-insert-directory
470 (filename switches &optional wildcard full-directory-p) 471 (filename switches &optional wildcard full-directory-p)
@@ -733,9 +734,12 @@ Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME YEAR)."
733 ;; Cache share entries 734 ;; Cache share entries
734 (setq tramp-smb-share-cache res))) 735 (setq tramp-smb-share-cache res)))
735 736
736
737 ;; Add directory itself 737 ;; Add directory itself
738 (add-to-list 'res '("" "dr-xr-xr-x" 0 (0 0))) 738 (add-to-list 'res '("" "drwxrwxrwx" 0 (0 0)))
739
740 ;; There's a very strange error (debugged with XEmacs 21.4.14)
741 ;; If there's no short delay, it returns nil. No idea about
742 (when (featurep 'xemacs) (sleep-for 0.01))
739 743
740 ;; Check for matching entries 744 ;; Check for matching entries
741 (delq nil (mapcar 745 (delq nil (mapcar
@@ -913,7 +917,8 @@ there has been an error message from smbclient."
913 "Maybe open a connection to HOST, logging in as USER, using `tramp-smb-program'. 917 "Maybe open a connection to HOST, logging in as USER, using `tramp-smb-program'.
914Does not do anything if a connection is already open, but re-opens the 918Does not do anything if a connection is already open, but re-opens the
915connection if a previous connection has died for some reason." 919connection if a previous connection has died for some reason."
916 (let ((p (get-buffer-process 920 (let ((process-connection-type tramp-process-connection-type)
921 (p (get-buffer-process
917 (tramp-get-buffer nil tramp-smb-method user host)))) 922 (tramp-get-buffer nil tramp-smb-method user host))))
918 (save-excursion 923 (save-excursion
919 (set-buffer (tramp-get-buffer nil tramp-smb-method user host)) 924 (set-buffer (tramp-get-buffer nil tramp-smb-method user host))
@@ -987,11 +992,7 @@ Domain names in USER and port numbers in HOST are acknowledged."
987 (tramp-message 9 "Started process %s" (process-command p)) 992 (tramp-message 9 "Started process %s" (process-command p))
988 (process-kill-without-query p) 993 (process-kill-without-query p)
989 (set-buffer buffer) 994 (set-buffer buffer)
990 (set-process-sentinel 995 (setq tramp-smb-share share)
991 p (lambda (proc str) (setq tramp-smb-process-running nil)))
992 ; If no share is given, the process will terminate
993 (setq tramp-smb-process-running share
994 tramp-smb-share share)
995 996
996 ; send password 997 ; send password
997 (when real-user 998 (when real-user
@@ -1000,54 +1001,44 @@ Domain names in USER and port numbers in HOST are acknowledged."
1000 (tramp-enter-password p pw-prompt))) 1001 (tramp-enter-password p pw-prompt)))
1001 1002
1002 (unless (tramp-smb-wait-for-output user host) 1003 (unless (tramp-smb-wait-for-output user host)
1004 (tramp-clear-passwd user host)
1003 (error "Cannot open connection //%s@%s/%s" 1005 (error "Cannot open connection //%s@%s/%s"
1004 user host (or share ""))))))) 1006 user host (or share "")))))))
1005 1007
1006;; We don't use timeouts. If needed, the caller shall wrap around. 1008;; We don't use timeouts. If needed, the caller shall wrap around.
1007(defun tramp-smb-wait-for-output (user host) 1009(defun tramp-smb-wait-for-output (user host)
1008 "Wait for output from smbclient command. 1010 "Wait for output from smbclient command.
1009Sets position to begin of buffer.
1010Returns nil if an error message has appeared." 1011Returns nil if an error message has appeared."
1011 (save-excursion 1012 (let ((proc (get-buffer-process (current-buffer)))
1012 (let ((proc (get-buffer-process (current-buffer))) 1013 (found (progn (goto-char (point-min))
1013 (found (progn (goto-char (point-max)) 1014 (re-search-forward tramp-smb-prompt nil t)))
1014 (beginning-of-line) 1015 (err (progn (goto-char (point-min))
1015 (looking-at tramp-smb-prompt))) 1016 (re-search-forward tramp-smb-errors nil t))))
1016 err) 1017
1017 (save-match-data 1018 ;; Algorithm: get waiting output. See if last line contains
1018 ;; Algorithm: get waiting output. See if last line contains 1019 ;; tramp-smb-prompt sentinel or tramp-smb-errors strings.
1019 ;; tramp-smb-prompt sentinel, or process has exited. 1020 ;; If not, wait a bit and again get waiting output.
1020 ;; If not, wait a bit and again get waiting output. 1021 (while (and (not found) (not err))
1021 (while (and (not found) tramp-smb-process-running) 1022
1022 (accept-process-output proc) 1023 ;; Accept pending output.
1023 (goto-char (point-max)) 1024 (accept-process-output proc)
1024 (beginning-of-line) 1025
1025 (setq found (looking-at tramp-smb-prompt))) 1026 ;; Search for prompt.
1026
1027 ;; There might be pending output. If tramp-smb-prompt sentinel
1028 ;; hasn't been found, the process has died already. We should
1029 ;; give it a chance.
1030 (when (not found) (accept-process-output nil 1))
1031
1032 ;; Search for errors.
1033 (goto-char (point-min))
1034 (setq err (re-search-forward tramp-smb-errors nil t)))
1035
1036 ;; Add output to debug buffer if appropriate.
1037 (when tramp-debug-buffer
1038 (append-to-buffer
1039 (tramp-get-debug-buffer nil tramp-smb-method user host)
1040 (point-min) (point-max))
1041 (when (and (not found) tramp-smb-process-running)
1042 (save-excursion
1043 (set-buffer
1044 (tramp-get-debug-buffer nil tramp-smb-method user host))
1045 (goto-char (point-max))
1046 (insert (format "[[Remote prompt `%s' not found]]\n"
1047 tramp-smb-prompt)))))
1048 (goto-char (point-min)) 1027 (goto-char (point-min))
1049 ;; Return value is whether no error message has appeared. 1028 (setq found (re-search-forward tramp-smb-prompt nil t))
1050 (not err)))) 1029
1030 ;; Search for errors.
1031 (goto-char (point-min))
1032 (setq err (re-search-forward tramp-smb-errors nil t)))
1033
1034 ;; Add output to debug buffer if appropriate.
1035 (when tramp-debug-buffer
1036 (append-to-buffer
1037 (tramp-get-debug-buffer nil tramp-smb-method user host)
1038 (point-min) (point-max)))
1039
1040 ;; Return value is whether no error message has appeared.
1041 (not err)))
1051 1042
1052 1043
1053;; Snarfed code from time-date.el and parse-time.el 1044;; Snarfed code from time-date.el and parse-time.el
@@ -1125,8 +1116,6 @@ Return the difference in the format of a time value."
1125;; * Provide a local smb.conf. The default one might not be readable. 1116;; * Provide a local smb.conf. The default one might not be readable.
1126;; * Error handling in case password is wrong. 1117;; * Error handling in case password is wrong.
1127;; * Read password from "~/.netrc". 1118;; * Read password from "~/.netrc".
1128;; * Use different buffers for different shares. By this, the password
1129;; won't be requested again when changing shares on the same host.
1130;; * Return more comprehensive file permission string. Think whether it is 1119;; * Return more comprehensive file permission string. Think whether it is
1131;; possible to implement `set-file-modes'. 1120;; possible to implement `set-file-modes'.
1132;; * Handle WILDCARD and FULL-DIRECTORY-P in 1121;; * Handle WILDCARD and FULL-DIRECTORY-P in
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 949d76364fc..cd6ed337927 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -1,7 +1,7 @@
1;;; -*- mode: Emacs-Lisp; coding: iso-2022-7bit; -*- 1;;; -*- mode: Emacs-Lisp; coding: iso-2022-7bit; -*-
2;;; tramp.el --- Transparent Remote Access, Multiple Protocol 2;;; tramp.el --- Transparent Remote Access, Multiple Protocol
3 3
4;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. 4;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5 5
6;; Author: kai.grossjohann@gmx.net 6;; Author: kai.grossjohann@gmx.net
7;; Keywords: comm, processes 7;; Keywords: comm, processes
@@ -72,6 +72,12 @@
72 72
73(require 'timer) 73(require 'timer)
74(require 'format-spec) ;from Gnus 5.8, also in tar ball 74(require 'format-spec) ;from Gnus 5.8, also in tar ball
75;; As long as password.el is not part of (X)Emacs, it shouldn't
76;; be mandatory
77(if (featurep 'xemacs)
78 (load "password" 'noerror)
79 (require 'password nil 'noerror)) ;from No Gnus, also in tar ball
80
75;; The explicit check is not necessary in Emacs, which provides the 81;; The explicit check is not necessary in Emacs, which provides the
76;; feature even if implemented in C, but it appears to be necessary 82;; feature even if implemented in C, but it appears to be necessary
77;; in XEmacs. 83;; in XEmacs.
@@ -628,14 +634,18 @@ See `tramp-methods' for a list of possibilities for METHOD."
628;; Default values for non-Unices seeked 634;; Default values for non-Unices seeked
629(defconst tramp-completion-function-alist-ssh 635(defconst tramp-completion-function-alist-ssh
630 (unless (memq system-type '(windows-nt)) 636 (unless (memq system-type '(windows-nt))
631 '((tramp-parse-rhosts "/etc/hosts.equiv") 637 '((tramp-parse-rhosts "/etc/hosts.equiv")
632 (tramp-parse-rhosts "/etc/shosts.equiv") 638 (tramp-parse-rhosts "/etc/shosts.equiv")
633 (tramp-parse-shosts "/etc/ssh_known_hosts") 639 (tramp-parse-shosts "/etc/ssh_known_hosts")
634 (tramp-parse-sconfig "/etc/ssh_config") 640 (tramp-parse-sconfig "/etc/ssh_config")
635 (tramp-parse-rhosts "~/.rhosts") 641 (tramp-parse-shostkeys "/etc/ssh2/hostkeys")
636 (tramp-parse-rhosts "~/.shosts") 642 (tramp-parse-sknownhosts "/etc/ssh2/knownhosts")
637 (tramp-parse-shosts "~/.ssh/known_hosts") 643 (tramp-parse-rhosts "~/.rhosts")
638 (tramp-parse-sconfig "~/.ssh/config"))) 644 (tramp-parse-rhosts "~/.shosts")
645 (tramp-parse-shosts "~/.ssh/known_hosts")
646 (tramp-parse-sconfig "~/.ssh/config")
647 (tramp-parse-shostkeys "~/.ssh2/hostkeys")
648 (tramp-parse-sknownhosts "~/.ssh2/knownhosts")))
639 "Default list of (FUNCTION FILE) pairs to be examined for ssh methods.") 649 "Default list of (FUNCTION FILE) pairs to be examined for ssh methods.")
640 650
641;; Default values for non-Unices seeked 651;; Default values for non-Unices seeked
@@ -650,53 +660,79 @@ See `tramp-methods' for a list of possibilities for METHOD."
650 '((tramp-parse-passwd "/etc/passwd"))) 660 '((tramp-parse-passwd "/etc/passwd")))
651 "Default list of (FUNCTION FILE) pairs to be examined for su methods.") 661 "Default list of (FUNCTION FILE) pairs to be examined for su methods.")
652 662
653(defcustom tramp-completion-function-alist 663(defvar tramp-completion-function-alist nil
654 (list (cons "rcp" tramp-completion-function-alist-rsh)
655 (cons "scp" tramp-completion-function-alist-ssh)
656 (cons "scp1" tramp-completion-function-alist-ssh)
657 (cons "scp2" tramp-completion-function-alist-ssh)
658 (cons "scp1_old" tramp-completion-function-alist-ssh)
659 (cons "scp2_old" tramp-completion-function-alist-ssh)
660 (cons "rsync" tramp-completion-function-alist-rsh)
661 (cons "remcp" tramp-completion-function-alist-rsh)
662 (cons "rsh" tramp-completion-function-alist-rsh)
663 (cons "ssh" tramp-completion-function-alist-ssh)
664 (cons "ssh1" tramp-completion-function-alist-ssh)
665 (cons "ssh2" tramp-completion-function-alist-ssh)
666 (cons "ssh1_old" tramp-completion-function-alist-ssh)
667 (cons "ssh2_old" tramp-completion-function-alist-ssh)
668 (cons "remsh" tramp-completion-function-alist-rsh)
669 (cons "telnet" tramp-completion-function-alist-telnet)
670 (cons "su" tramp-completion-function-alist-su)
671 (cons "sudo" tramp-completion-function-alist-su)
672 (cons "multi" nil)
673 (cons "scpx" tramp-completion-function-alist-ssh)
674 (cons "sshx" tramp-completion-function-alist-ssh)
675 (cons "krlogin" tramp-completion-function-alist-rsh)
676 (cons "plink" tramp-completion-function-alist-ssh)
677 (cons "plink1" tramp-completion-function-alist-ssh)
678 (cons "pscp" tramp-completion-function-alist-ssh)
679 (cons "fcp" tramp-completion-function-alist-ssh)
680 )
681 "*Alist of methods for remote files. 664 "*Alist of methods for remote files.
682This is a list of entries of the form (NAME PAIR1 PAIR2 ...). 665This is a list of entries of the form (NAME PAIR1 PAIR2 ...).
683Each NAME stands for a remote access method. Each PAIR is of the form 666Each NAME stands for a remote access method. Each PAIR is of the form
684\(FUNCTION FILE). FUNCTION is responsible to extract user names and host 667\(FUNCTION FILE). FUNCTION is responsible to extract user names and host
685names from FILE for completion. The following predefined FUNCTIONs exists: 668names from FILE for completion. The following predefined FUNCTIONs exists:
686 669
687 * `tramp-parse-rhosts' for \"~/.rhosts\" like files, 670 * `tramp-parse-rhosts' for \"~/.rhosts\" like files,
688 * `tramp-parse-shosts' for \"~/.ssh/known_hosts\" like files, 671 * `tramp-parse-shosts' for \"~/.ssh/known_hosts\" like files,
689 * `tramp-parse-sconfig' for \"~/.ssh/config\" like files, 672 * `tramp-parse-sconfig' for \"~/.ssh/config\" like files,
690 * `tramp-parse-hosts' for \"/etc/hosts\" like files, and 673 * `tramp-parse-shostkeys' for \"~/.ssh2/hostkeys/*\" like files,
691 * `tramp-parse-passwd' for \"/etc/passwd\" like files. 674 * `tramp-parse-sknownhosts' for \"~/.ssh2/knownhosts/*\" like files,
692 * `tramp-parse-netrc' for \"~/.netrc\" like files. 675 * `tramp-parse-hosts' for \"/etc/hosts\" like files,
693 676 * `tramp-parse-passwd' for \"/etc/passwd\" like files.
694FUNCTION can also see a customer defined function. For more details see 677 * `tramp-parse-netrc' for \"~/.netrc\" like files.
695the info pages." 678
696 :group 'tramp 679FUNCTION can also be a customer defined function. For more details see
697 :type '(repeat 680the info pages.")
698 (cons string 681
699 (choice (const nil) (repeat (list function file)))))) 682(eval-after-load "tramp"
683 '(progn
684 (tramp-set-completion-function
685 "rcp" tramp-completion-function-alist-rsh)
686 (tramp-set-completion-function
687 "scp" tramp-completion-function-alist-ssh)
688 (tramp-set-completion-function
689 "scp1" tramp-completion-function-alist-ssh)
690 (tramp-set-completion-function
691 "scp2" tramp-completion-function-alist-ssh)
692 (tramp-set-completion-function
693 "scp1_old" tramp-completion-function-alist-ssh)
694 (tramp-set-completion-function
695 "scp2_old" tramp-completion-function-alist-ssh)
696 (tramp-set-completion-function
697 "rsync" tramp-completion-function-alist-rsh)
698 (tramp-set-completion-function
699 "remcp" tramp-completion-function-alist-rsh)
700 (tramp-set-completion-function
701 "rsh" tramp-completion-function-alist-rsh)
702 (tramp-set-completion-function
703 "ssh" tramp-completion-function-alist-ssh)
704 (tramp-set-completion-function
705 "ssh1" tramp-completion-function-alist-ssh)
706 (tramp-set-completion-function
707 "ssh2" tramp-completion-function-alist-ssh)
708 (tramp-set-completion-function
709 "ssh1_old" tramp-completion-function-alist-ssh)
710 (tramp-set-completion-function
711 "ssh2_old" tramp-completion-function-alist-ssh)
712 (tramp-set-completion-function
713 "remsh" tramp-completion-function-alist-rsh)
714 (tramp-set-completion-function
715 "telnet" tramp-completion-function-alist-telnet)
716 (tramp-set-completion-function
717 "su" tramp-completion-function-alist-su)
718 (tramp-set-completion-function
719 "sudo" tramp-completion-function-alist-su)
720 (tramp-set-completion-function
721 "multi" nil)
722 (tramp-set-completion-function
723 "scpx" tramp-completion-function-alist-ssh)
724 (tramp-set-completion-function
725 "sshx" tramp-completion-function-alist-ssh)
726 (tramp-set-completion-function
727 "krlogin" tramp-completion-function-alist-rsh)
728 (tramp-set-completion-function
729 "plink" tramp-completion-function-alist-ssh)
730 (tramp-set-completion-function
731 "plink1" tramp-completion-function-alist-ssh)
732 (tramp-set-completion-function
733 "pscp" tramp-completion-function-alist-ssh)
734 (tramp-set-completion-function
735 "fcp" tramp-completion-function-alist-ssh)))
700 736
701(defcustom tramp-rsh-end-of-line "\n" 737(defcustom tramp-rsh-end-of-line "\n"
702 "*String used for end of line in rsh connections. 738 "*String used for end of line in rsh connections.
@@ -1267,6 +1303,17 @@ this variable to be set as well."
1267 :group 'tramp 1303 :group 'tramp
1268 :type '(choice (const nil) integer)) 1304 :type '(choice (const nil) integer))
1269 1305
1306;; Logging in to a remote host normally requires obtaining a pty. But
1307;; Emacs on MacOS X has process-connection-type set to nil by default,
1308;; so on those systems Tramp doesn't obtain a pty. Here, we allow
1309;; for an override of the system default.
1310(defcustom tramp-process-connection-type t
1311 "Overrides `process-connection-type' for connections from Tramp.
1312Tramp binds process-connection-type to the value given here before
1313opening a connection to a remote host."
1314 :group 'tramp
1315 :type '(choice (const nil) (const t) (const pty)))
1316
1270;;; Internal Variables: 1317;;; Internal Variables:
1271 1318
1272(defvar tramp-buffer-file-attributes nil 1319(defvar tramp-buffer-file-attributes nil
@@ -1638,6 +1685,7 @@ on the FILENAME argument, even if VISIT was a string.")
1638 (insert-file-contents . tramp-handle-insert-file-contents) 1685 (insert-file-contents . tramp-handle-insert-file-contents)
1639 (write-region . tramp-handle-write-region) 1686 (write-region . tramp-handle-write-region)
1640 (unhandled-file-name-directory . tramp-handle-unhandled-file-name-directory) 1687 (unhandled-file-name-directory . tramp-handle-unhandled-file-name-directory)
1688 (dired-compress-file . tramp-handle-dired-compress-file)
1641 (dired-call-process . tramp-handle-dired-call-process) 1689 (dired-call-process . tramp-handle-dired-call-process)
1642 (dired-recursive-delete-directory 1690 (dired-recursive-delete-directory
1643 . tramp-handle-dired-recursive-delete-directory) 1691 . tramp-handle-dired-recursive-delete-directory)
@@ -1761,15 +1809,30 @@ Example:
1761 '((tramp-parse-sconfig \"/etc/ssh_config\") 1809 '((tramp-parse-sconfig \"/etc/ssh_config\")
1762 (tramp-parse-sconfig \"~/.ssh/config\")))" 1810 (tramp-parse-sconfig \"~/.ssh/config\")))"
1763 1811
1764 (let ((v (cdr (assoc method tramp-completion-function-alist)))) 1812 (let ((r function-list)
1765 (if v (setcdr v function-list) 1813 (v function-list))
1814 (setq tramp-completion-function-alist
1815 (delete (assoc method tramp-completion-function-alist)
1816 tramp-completion-function-alist))
1817
1818 (while v
1819 ;; Remove double entries
1820 (when (member (car v) (cdr v))
1821 (setcdr v (delete (car v) (cdr v))))
1822 ;; Check for function and file
1823 (unless (and (functionp (nth 0 (car v)))
1824 (file-exists-p (nth 1 (car v))))
1825 (setq r (delete (car v) r)))
1826 (setq v (cdr v)))
1827
1828 (when r
1766 (add-to-list 'tramp-completion-function-alist 1829 (add-to-list 'tramp-completion-function-alist
1767 (cons method function-list))))) 1830 (cons method r)))))
1768 1831
1769(defun tramp-get-completion-function (method) 1832(defun tramp-get-completion-function (method)
1770 "Returns list of completion functions for METHOD. 1833 "Returns list of completion functions for METHOD.
1771For definition of that list see `tramp-set-completion-function'." 1834For definition of that list see `tramp-set-completion-function'."
1772 (cdr (assoc method tramp-completion-function-alist))) 1835 (cdr (assoc method tramp-completion-function-alist)))
1773 1836
1774;;; File Name Handler Functions: 1837;;; File Name Handler Functions:
1775 1838
@@ -2586,44 +2649,86 @@ and `rename'. FILENAME and NEWNAME must be absolute file names."
2586 (signal 'file-already-exists 2649 (signal 'file-already-exists
2587 (list newname)))) 2650 (list newname))))
2588 (let ((t1 (tramp-tramp-file-p filename)) 2651 (let ((t1 (tramp-tramp-file-p filename))
2589 (t2 (tramp-tramp-file-p newname))) 2652 (t2 (tramp-tramp-file-p newname))
2653 v1-multi-method v1-method v1-user v1-host v1-localname
2654 v2-multi-method v2-method v2-user v2-host v2-localname)
2655
2590 ;; Check which ones of source and target are Tramp files. 2656 ;; Check which ones of source and target are Tramp files.
2657 ;; We cannot invoke `with-parsed-tramp-file-name';
2658 ;; it fails if the file isn't a Tramp file name.
2659 (if t1
2660 (with-parsed-tramp-file-name filename l
2661 (setq v1-multi-method l-multi-method
2662 v1-method l-method
2663 v1-user l-user
2664 v1-host l-host
2665 v1-localname l-localname))
2666 (setq v1-localname filename))
2667 (if t2
2668 (with-parsed-tramp-file-name newname l
2669 (setq v2-multi-method l-multi-method
2670 v2-method l-method
2671 v2-user l-user
2672 v2-host l-host
2673 v2-localname l-localname))
2674 (setq v2-localname newname))
2675
2591 (cond 2676 (cond
2677 ;; Both are Tramp files.
2592 ((and t1 t2) 2678 ((and t1 t2)
2593 ;; Both are Tramp files. 2679 (cond
2594 (with-parsed-tramp-file-name filename v1 2680 ;; Shortcut: if method, host, user are the same for both
2595 (with-parsed-tramp-file-name newname v2 2681 ;; files, we invoke `cp' or `mv' on the remote host
2596 ;; Check if we can use a shortcut. 2682 ;; directly.
2597 (if (and (equal v1-multi-method v2-multi-method) 2683 ((and (equal v1-multi-method v2-multi-method)
2598 (equal v1-method v2-method) 2684 (equal v1-method v2-method)
2599 (equal v1-host v2-host) 2685 (equal v1-user v2-user)
2600 (equal v1-user v2-user)) 2686 (equal v1-host v2-host))
2601 ;; Shortcut: if method, host, user are the same for both 2687 (tramp-do-copy-or-rename-file-directly
2602 ;; files, we invoke `cp' or `mv' on the remote host 2688 op v1-multi-method v1-method v1-user v1-host
2603 ;; directly. 2689 v1-localname v2-localname keep-date))
2604 (tramp-do-copy-or-rename-file-directly 2690 ;; If both source and target are Tramp files,
2605 op v1-multi-method v1-method v1-user v1-host 2691 ;; both are using the same copy-program, then we
2606 v1-localname v2-localname keep-date) 2692 ;; can invoke rcp directly. Note that
2607 ;; The shortcut was not possible. So we copy the 2693 ;; default-directory should point to a local
2608 ;; file first. If the operation was `rename', we go 2694 ;; directory if we want to invoke rcp.
2609 ;; back and delete the original file (if the copy was 2695 ((and (not v1-multi-method)
2610 ;; successful). The approach is simple-minded: we 2696 (not v2-multi-method)
2611 ;; create a new buffer, insert the contents of the 2697 (equal v1-method v2-method)
2612 ;; source file into it, then write out the buffer to 2698 (tramp-method-out-of-band-p
2613 ;; the target file. The advantage is that it doesn't 2699 v1-multi-method v1-method v1-user v1-host)
2614 ;; matter which filename handlers are used for the 2700 (not (string-match "\\([^#]*\\)#\\(.*\\)" v1-host))
2615 ;; source and target file. 2701 (not (string-match "\\([^#]*\\)#\\(.*\\)" v2-host)))
2616 2702 (tramp-do-copy-or-rename-file-out-of-band
2617 ;; CCC: If both source and target are Tramp files, 2703 op filename newname keep-date))
2618 ;; and both are using the same copy-program, then we 2704 ;; No shortcut was possible. So we copy the
2619 ;; can invoke rcp directly. Note that 2705 ;; file first. If the operation was `rename', we go
2620 ;; default-directory should point to a local 2706 ;; back and delete the original file (if the copy was
2621 ;; directory if we want to invoke rcp. 2707 ;; successful). The approach is simple-minded: we
2622 (tramp-do-copy-or-rename-via-buffer 2708 ;; create a new buffer, insert the contents of the
2623 op filename newname keep-date))))) 2709 ;; source file into it, then write out the buffer to
2710 ;; the target file. The advantage is that it doesn't
2711 ;; matter which filename handlers are used for the
2712 ;; source and target file.
2713 (t
2714 (tramp-do-copy-or-rename-via-buffer
2715 op filename newname keep-date))))
2716
2717 ;; One file is a Tramp file, the other one is local.
2624 ((or t1 t2) 2718 ((or t1 t2)
2625 ;; Use the generic method via a Tramp buffer. 2719 ;; If the Tramp file has an out-of-band method, the corresponding
2626 (tramp-do-copy-or-rename-via-buffer op filename newname keep-date)) 2720 ;; copy-program can be invoked.
2721 (if (and (not v1-multi-method)
2722 (not v2-multi-method)
2723 (or (tramp-method-out-of-band-p
2724 v1-multi-method v1-method v1-user v1-host)
2725 (tramp-method-out-of-band-p
2726 v2-multi-method v2-method v2-user v2-host)))
2727 (tramp-do-copy-or-rename-file-out-of-band
2728 op filename newname keep-date)
2729 ;; Use the generic method via a Tramp buffer.
2730 (tramp-do-copy-or-rename-via-buffer op filename newname keep-date)))
2731
2627 (t 2732 (t
2628 ;; One of them must be a Tramp file. 2733 ;; One of them must be a Tramp file.
2629 (error "Tramp implementation says this cannot happen"))))) 2734 (error "Tramp implementation says this cannot happen")))))
@@ -2634,8 +2739,9 @@ and `rename'. FILENAME and NEWNAME must be absolute file names."
2634First arg OP is either `copy' or `rename' and indicates the operation. 2739First arg OP is either `copy' or `rename' and indicates the operation.
2635FILENAME is the source file, NEWNAME the target file. 2740FILENAME is the source file, NEWNAME the target file.
2636KEEP-DATE is non-nil if NEWNAME should have the same timestamp as FILENAME." 2741KEEP-DATE is non-nil if NEWNAME should have the same timestamp as FILENAME."
2637 (let ((trampbuf (get-buffer-create "*tramp output*"))) 2742 (let ((trampbuf (get-buffer-create "*tramp output*"))
2638 (when keep-date 2743 (modtime (nth 5 (file-attributes filename))))
2744 (when (and keep-date (or (null modtime) (equal modtime '(0 0))))
2639 (tramp-message 2745 (tramp-message
2640 1 (concat "Warning: cannot preserve file time stamp" 2746 1 (concat "Warning: cannot preserve file time stamp"
2641 " with inline copying across machines"))) 2747 " with inline copying across machines")))
@@ -2646,7 +2752,12 @@ KEEP-DATE is non-nil if NEWNAME should have the same timestamp as FILENAME."
2646 ;; `jka-compr-inhibit' to t. 2752 ;; `jka-compr-inhibit' to t.
2647 (let ((coding-system-for-write 'binary) 2753 (let ((coding-system-for-write 'binary)
2648 (jka-compr-inhibit t)) 2754 (jka-compr-inhibit t))
2649 (write-region (point-min) (point-max) newname))) 2755 (write-region (point-min) (point-max) newname))
2756 ;; KEEP-DATE handling.
2757 (when (and keep-date
2758 (not (null modtime))
2759 (not (equal modtime '(0 0))))
2760 (tramp-touch newname modtime)))
2650 ;; If the operation was `rename', delete the original file. 2761 ;; If the operation was `rename', delete the original file.
2651 (unless (eq op 'copy) 2762 (unless (eq op 'copy)
2652 (delete-file filename)))) 2763 (delete-file filename))))
@@ -2676,13 +2787,112 @@ If KEEP-DATE is non-nil, preserve the time stamp when copying."
2676 "Copying directly failed, see buffer `%s' for details." 2787 "Copying directly failed, see buffer `%s' for details."
2677 (buffer-name))))) 2788 (buffer-name)))))
2678 2789
2679(defun tramp-do-copy-or-rename-file-one-local 2790(defun tramp-do-copy-or-rename-file-out-of-band (op filename newname keep-date)
2680 (op filename newname keep-date)
2681 "Invoke rcp program to copy. 2791 "Invoke rcp program to copy.
2682One of FILENAME and NEWNAME must be a Tramp name, the other must 2792One of FILENAME and NEWNAME must be a Tramp name, the other must
2683be a local filename. The method used must be an out-of-band method." 2793be a local filename. The method used must be an out-of-band method."
2684 ;; CCC 2794 (let ((trampbuf (get-buffer-create "*tramp output*"))
2685 ) 2795 (t1 (tramp-tramp-file-p filename))
2796 (t2 (tramp-tramp-file-p newname))
2797 v1-multi-method v1-method v1-user v1-host v1-localname
2798 v2-multi-method v2-method v2-user v2-host v2-localname
2799 method copy-program copy-args source target)
2800
2801 ;; Check which ones of source and target are Tramp files.
2802 ;; We cannot invoke `with-parsed-tramp-file-name';
2803 ;; it fails if the file isn't a Tramp file name.
2804 (if t1
2805 (with-parsed-tramp-file-name filename l
2806 (setq v1-multi-method l-multi-method
2807 v1-method l-method
2808 v1-user l-user
2809 v1-host l-host
2810 v1-localname l-localname
2811 method (tramp-find-method
2812 v1-multi-method v1-method v1-user v1-host)
2813 copy-program (tramp-get-method-parameter
2814 v1-multi-method method
2815 v1-user v1-host 'tramp-copy-program)
2816 copy-args (tramp-get-method-parameter
2817 v1-multi-method method
2818 v1-user v1-host 'tramp-copy-args)))
2819 (setq v1-localname filename))
2820
2821 (if t2
2822 (with-parsed-tramp-file-name newname l
2823 (setq v2-multi-method l-multi-method
2824 v2-method l-method
2825 v2-user l-user
2826 v2-host l-host
2827 v2-localname l-localname
2828 method (tramp-find-method
2829 v2-multi-method v2-method v2-user v2-host)
2830 copy-program (tramp-get-method-parameter
2831 v2-multi-method method
2832 v2-user v2-host 'tramp-copy-program)
2833 copy-args (tramp-get-method-parameter
2834 v2-multi-method method
2835 v2-user v2-host 'tramp-copy-args)))
2836 (setq v2-localname newname))
2837
2838 ;; The following should be changed. We need a more general
2839 ;; mechanism to parse extra host args.
2840 (if (not t1)
2841 (setq source v1-localname)
2842 (when (string-match "\\([^#]*\\)#\\(.*\\)" v1-host)
2843 (setq copy-args (cons "-P" (cons (match-string 2 v1-host) copy-args)))
2844 (setq v1-host (match-string 1 v1-host)))
2845 (setq source
2846 (tramp-make-copy-program-file-name
2847 v1-user v1-host
2848 (tramp-shell-quote-argument v1-localname))))
2849
2850 (if (not t2)
2851 (setq target v2-localname)
2852 (when (string-match "\\([^#]*\\)#\\(.*\\)" v2-host)
2853 (setq copy-args (cons "-P" (cons (match-string 2 v2-host) copy-args)))
2854 (setq v2-host (match-string 1 v2-host)))
2855 (setq target
2856 (tramp-make-copy-program-file-name
2857 v2-user v2-host
2858 (tramp-shell-quote-argument v2-localname))))
2859
2860 ;; Handle keep-date argument
2861 (when keep-date
2862 (if t1
2863 (setq copy-args
2864 (cons (tramp-get-method-parameter
2865 v1-multi-method method
2866 v1-user v1-host 'tramp-copy-keep-date-arg)
2867 copy-args))
2868 (setq copy-args
2869 (cons (tramp-get-method-parameter
2870 v2-multi-method method
2871 v2-user v2-host 'tramp-copy-keep-date-arg)
2872 copy-args))))
2873
2874 (setq copy-args (append copy-args (list source target)))
2875
2876 ;; Use rcp-like program for file transfer.
2877 (tramp-message
2878 5 "Transferring %s to file %s..." filename newname)
2879 (save-excursion (set-buffer trampbuf) (erase-buffer))
2880 (unless (equal
2881 0
2882 (apply #'call-process copy-program
2883 nil trampbuf nil copy-args))
2884 (pop-to-buffer trampbuf)
2885 (error
2886 (concat
2887 "tramp-do-copy-or-rename-file-out-of-band: `%s' didn't work, "
2888 "see buffer `%s' for details")
2889 copy-program trampbuf))
2890 (tramp-message
2891 5 "Transferring %s to file %s...done" filename newname)
2892
2893 ;; If the operation was `rename', delete the original file.
2894 (unless (eq op 'copy)
2895 (delete-file filename))))
2686 2896
2687;; mkdir 2897;; mkdir
2688(defun tramp-handle-make-directory (dir &optional parents) 2898(defun tramp-handle-make-directory (dir &optional parents)
@@ -2745,7 +2955,6 @@ This is like `dired-recursive-delete-directory' for tramp files."
2745 (and (tramp-handle-file-exists-p filename) 2955 (and (tramp-handle-file-exists-p filename)
2746 (error "Failed to recusively delete %s" filename)))) 2956 (error "Failed to recusively delete %s" filename))))
2747 2957
2748
2749(defun tramp-handle-dired-call-process (program discard &rest arguments) 2958(defun tramp-handle-dired-call-process (program discard &rest arguments)
2750 "Like `dired-call-process' for tramp files." 2959 "Like `dired-call-process' for tramp files."
2751 (with-parsed-tramp-file-name default-directory nil 2960 (with-parsed-tramp-file-name default-directory nil
@@ -2767,6 +2976,59 @@ This is like `dired-recursive-delete-directory' for tramp files."
2767 (tramp-send-command-and-check multi-method method user host nil) 2976 (tramp-send-command-and-check multi-method method user host nil)
2768 (tramp-send-command multi-method method user host "cd") 2977 (tramp-send-command multi-method method user host "cd")
2769 (tramp-wait-for-output))))) 2978 (tramp-wait-for-output)))))
2979
2980(defun tramp-handle-dired-compress-file (file &rest ok-flag)
2981 "Like `dired-compress-file' for tramp files."
2982 ;; OK-FLAG is valid for XEmacs only, but not implemented.
2983 ;; Code stolen mainly from dired-aux.el.
2984 (with-parsed-tramp-file-name file nil
2985 (save-excursion
2986 (let ((suffixes
2987 (if (not (featurep 'xemacs))
2988 ;; Emacs case
2989 (symbol-value 'dired-compress-file-suffixes)
2990 ;; XEmacs has `dired-compression-method-alist', which is
2991 ;; transformed into `dired-compress-file-suffixes' structure.
2992 (mapcar
2993 '(lambda (x)
2994 (list (concat (regexp-quote (nth 1 x)) "\\'")
2995 nil
2996 (mapconcat 'identity (nth 3 x) " ")))
2997 (symbol-value 'dired-compression-method-alist))))
2998 suffix)
2999 ;; See if any suffix rule matches this file name.
3000 (while suffixes
3001 (let (case-fold-search)
3002 (if (string-match (car (car suffixes)) localname)
3003 (setq suffix (car suffixes) suffixes nil))
3004 (setq suffixes (cdr suffixes))))
3005
3006 (cond ((file-symlink-p file)
3007 nil)
3008 ((and suffix (nth 2 suffix))
3009 ;; We found an uncompression rule.
3010 (message "Uncompressing %s..." file)
3011 (when (zerop (tramp-send-command-and-check
3012 multi-method method user host
3013 (concat (nth 2 suffix) " " localname)))
3014 (message "Uncompressing %s...done" file)
3015 (dired-remove-file file)
3016 (string-match (car suffix) file)
3017 (concat (substring file 0 (match-beginning 0)))))
3018 (t
3019 ;; We don't recognize the file as compressed, so compress it.
3020 ;; Try gzip.
3021 (message "Compressing %s..." file)
3022 (when (zerop (tramp-send-command-and-check
3023 multi-method method user host
3024 (concat "gzip -f " localname)))
3025 (message "Compressing %s...done" file)
3026 (dired-remove-file file)
3027 (cond ((file-exists-p (concat file ".gz"))
3028 (concat file ".gz"))
3029 ((file-exists-p (concat file ".z"))
3030 (concat file ".z"))
3031 (t nil)))))))))
2770 3032
2771;; Pacify byte-compiler. The function is needed on XEmacs only. I'm 3033;; Pacify byte-compiler. The function is needed on XEmacs only. I'm
2772;; not sure at all that this is the right way to do it, but let's hope 3034;; not sure at all that this is the right way to do it, but let's hope
@@ -2961,17 +3223,40 @@ the result will be a local, non-Tramp, filename."
2961 3223
2962;; Remote commands. 3224;; Remote commands.
2963 3225
3226(defvar tramp-async-proc nil
3227 "Global variable keeping asyncronous process object.
3228Used in `tramp-handle-shell-command'")
3229
2964(defun tramp-handle-shell-command (command &optional output-buffer error-buffer) 3230(defun tramp-handle-shell-command (command &optional output-buffer error-buffer)
2965 "Like `shell-command' for tramp files. 3231 "Like `shell-command' for tramp files.
2966This will break if COMMAND prints a newline, followed by the value of 3232This will break if COMMAND prints a newline, followed by the value of
2967`tramp-end-of-output', followed by another newline." 3233`tramp-end-of-output', followed by another newline."
3234 ;; Asynchronous processes are far from being perfect. But it works at least
3235 ;; for `find-grep-dired' and `find-name-dired' in Emacs 21.4.
2968 (if (tramp-tramp-file-p default-directory) 3236 (if (tramp-tramp-file-p default-directory)
2969 (with-parsed-tramp-file-name default-directory nil 3237 (with-parsed-tramp-file-name default-directory nil
2970 (let (status) 3238 (let ((asynchronous (string-match "[ \t]*&[ \t]*\\'" command))
2971 (when (string-match "&[ \t]*\\'" command) 3239 status)
2972 (error "Tramp doesn't grok asynchronous shell commands, yet")) 3240 (unless output-buffer
2973;; (when error-buffer 3241 (setq output-buffer
2974;; (error "Tramp doesn't grok optional third arg ERROR-BUFFER, yet")) 3242 (get-buffer-create
3243 (if asynchronous
3244 "*Async Shell Command*"
3245 "*Shell Command Output*")))
3246 (set-buffer output-buffer)
3247 (erase-buffer))
3248 (unless (bufferp output-buffer)
3249 (setq output-buffer (current-buffer)))
3250 (set-buffer output-buffer)
3251 ;; Tramp doesn't handle the asynchronous case by an asynchronous
3252 ;; process. Instead of, another asynchronous process is opened
3253 ;; which gets the output of the (synchronous) Tramp process
3254 ;; via process-filter. ERROR-BUFFER is disabled.
3255 (when asynchronous
3256 (setq command (substring command 0 (match-beginning 0))
3257 error-buffer nil
3258 tramp-async-proc (start-process (buffer-name output-buffer)
3259 output-buffer "cat")))
2975 (save-excursion 3260 (save-excursion
2976 (tramp-barf-unless-okay 3261 (tramp-barf-unless-okay
2977 multi-method method user host 3262 multi-method method user host
@@ -2979,23 +3264,39 @@ This will break if COMMAND prints a newline, followed by the value of
2979 nil 'file-error 3264 nil 'file-error
2980 "tramp-handle-shell-command: Couldn't `cd %s'" 3265 "tramp-handle-shell-command: Couldn't `cd %s'"
2981 (tramp-shell-quote-argument localname)) 3266 (tramp-shell-quote-argument localname))
3267 ;; Define the process filter
3268 (when asynchronous
3269 (set-process-filter
3270 (get-buffer-process
3271 (tramp-get-buffer multi-method method user host))
3272 '(lambda (process string)
3273 ;; Write the output into the Tramp Process
3274 (save-current-buffer
3275 (set-buffer (process-buffer process))
3276 (goto-char (point-max))
3277 (insert string))
3278 ;; Hand-over output to asynchronous process.
3279 (let ((end
3280 (string-match
3281 (regexp-quote tramp-end-of-output) string)))
3282 (when end
3283 (setq string
3284 (substring string 0 (1- (match-beginning 0)))))
3285 (process-send-string tramp-async-proc string)
3286 (when end
3287 (set-process-filter process nil)
3288 (process-send-eof tramp-async-proc))))))
3289 ;; Send the command
2982 (tramp-send-command 3290 (tramp-send-command
2983 multi-method method user host 3291 multi-method method user host
2984 (if error-buffer 3292 (if error-buffer
2985 (format "( %s ) 2>/tmp/tramp.$$.err; tramp_old_status=$?" 3293 (format "( %s ) 2>/tmp/tramp.$$.err; tramp_old_status=$?"
2986 command) 3294 command)
2987 (format "%s ;tramp_old_status=$?" command))) 3295 (format "%s; tramp_old_status=$?" command)))
2988 ;; This will break if the shell command prints "/////" 3296 (unless asynchronous
2989 ;; somewhere. Let's just hope for the best... 3297 (tramp-wait-for-output)))
2990 (tramp-wait-for-output)) 3298 (unless asynchronous
2991 (unless output-buffer 3299 (insert-buffer (tramp-get-buffer multi-method method user host)))
2992 (setq output-buffer (get-buffer-create "*Shell Command Output*"))
2993 (set-buffer output-buffer)
2994 (erase-buffer))
2995 (unless (bufferp output-buffer)
2996 (setq output-buffer (current-buffer)))
2997 (set-buffer output-buffer)
2998 (insert-buffer (tramp-get-buffer multi-method method user host))
2999 (when error-buffer 3300 (when error-buffer
3000 (save-excursion 3301 (save-excursion
3001 (unless (bufferp error-buffer) 3302 (unless (bufferp error-buffer)
@@ -3010,17 +3311,19 @@ This will break if COMMAND prints a newline, followed by the value of
3010 multi-method method user host "rm -f /tmp/tramp.$$.err"))) 3311 multi-method method user host "rm -f /tmp/tramp.$$.err")))
3011 (save-excursion 3312 (save-excursion
3012 (tramp-send-command multi-method method user host "cd") 3313 (tramp-send-command multi-method method user host "cd")
3013 (tramp-wait-for-output) 3314 (unless asynchronous
3315 (tramp-wait-for-output))
3014 (tramp-send-command 3316 (tramp-send-command
3015 multi-method method user host 3317 multi-method method user host
3016 (concat "tramp_set_exit_status $tramp_old_status;" 3318 (concat "tramp_set_exit_status $tramp_old_status;"
3017 " echo tramp_exit_status $?")) 3319 " echo tramp_exit_status $?"))
3018 (tramp-wait-for-output) 3320 (unless asynchronous
3019 (goto-char (point-max)) 3321 (tramp-wait-for-output)
3020 (unless (search-backward "tramp_exit_status " nil t) 3322 (goto-char (point-max))
3021 (error "Couldn't find exit status of `%s'" command)) 3323 (unless (search-backward "tramp_exit_status " nil t)
3022 (skip-chars-forward "^ ") 3324 (error "Couldn't find exit status of `%s'" command))
3023 (setq status (read (current-buffer)))) 3325 (skip-chars-forward "^ ")
3326 (setq status (read (current-buffer)))))
3024 (unless (zerop (buffer-size)) 3327 (unless (zerop (buffer-size))
3025 (display-buffer output-buffer)) 3328 (display-buffer output-buffer))
3026 status)) 3329 status))
@@ -3041,16 +3344,7 @@ This will break if COMMAND prints a newline, followed by the value of
3041(defun tramp-handle-file-local-copy (filename) 3344(defun tramp-handle-file-local-copy (filename)
3042 "Like `file-local-copy' for tramp files." 3345 "Like `file-local-copy' for tramp files."
3043 (with-parsed-tramp-file-name filename nil 3346 (with-parsed-tramp-file-name filename nil
3044 (let ((output-buf (get-buffer-create "*tramp output*")) 3347 (let ((tramp-buf (tramp-get-buffer multi-method method user host))
3045 (tramp-buf (tramp-get-buffer multi-method method user host))
3046 (copy-program (tramp-get-method-parameter
3047 multi-method
3048 (tramp-find-method multi-method method user host)
3049 user host 'tramp-copy-program))
3050 (copy-args (tramp-get-method-parameter
3051 multi-method
3052 (tramp-find-method multi-method method user host)
3053 user host 'tramp-copy-args))
3054 ;; We used to bind the following as late as possible. 3348 ;; We used to bind the following as late as possible.
3055 ;; loc-enc and loc-dec were bound directly before the if 3349 ;; loc-enc and loc-dec were bound directly before the if
3056 ;; statement that checks them. But the functions 3350 ;; statement that checks them. But the functions
@@ -3066,37 +3360,12 @@ This will break if COMMAND prints a newline, followed by the value of
3066 (error "Cannot make local copy of non-existing file `%s'" 3360 (error "Cannot make local copy of non-existing file `%s'"
3067 filename)) 3361 filename))
3068 (setq tmpfil (tramp-make-temp-file)) 3362 (setq tmpfil (tramp-make-temp-file))
3069 (cond (copy-program 3363
3070 ;; The following should be changed. We need a more general 3364
3071 ;; mechanism to parse extra host args. 3365 (cond ((tramp-method-out-of-band-p multi-method method user host)
3072 (when (string-match "\\([^#]*\\)#\\(.*\\)" host) 3366 ;; `copy-file' handles out-of-band methods
3073 (setq copy-args (cons "-p" (cons (match-string 2 host) 3367 (copy-file filename tmpfil t t))
3074 rsh-args))) 3368
3075 (setq host (match-string 1 host)))
3076 ;; Use rcp-like program for file transfer.
3077 (tramp-message-for-buffer
3078 multi-method method user host
3079 5 "Fetching %s to tmp file %s..." filename tmpfil)
3080 (save-excursion (set-buffer output-buf) (erase-buffer))
3081 (unless (equal
3082 0
3083 (apply #'call-process
3084 copy-program
3085 nil output-buf nil
3086 (append copy-args
3087 (list
3088 (tramp-make-copy-program-file-name
3089 user host
3090 (tramp-shell-quote-argument localname))
3091 tmpfil))))
3092 (pop-to-buffer output-buf)
3093 (error
3094 (concat "tramp-handle-file-local-copy: `%s' didn't work, "
3095 "see buffer `%s' for details")
3096 copy-program output-buf))
3097 (tramp-message-for-buffer
3098 multi-method method user host
3099 5 "Fetching %s to tmp file %s...done" filename tmpfil))
3100 ((and rem-enc rem-dec) 3369 ((and rem-enc rem-dec)
3101 ;; Use inline encoding for file transfer. 3370 ;; Use inline encoding for file transfer.
3102 (save-excursion 3371 (save-excursion
@@ -3225,14 +3494,6 @@ This will break if COMMAND prints a newline, followed by the value of
3225 (error "File not overwritten"))) 3494 (error "File not overwritten")))
3226 (with-parsed-tramp-file-name filename nil 3495 (with-parsed-tramp-file-name filename nil
3227 (let ((curbuf (current-buffer)) 3496 (let ((curbuf (current-buffer))
3228 (copy-program (tramp-get-method-parameter
3229 multi-method
3230 (tramp-find-method multi-method method user host)
3231 user host 'tramp-copy-program))
3232 (copy-args (tramp-get-method-parameter
3233 multi-method
3234 (tramp-find-method multi-method method user host)
3235 user host 'tramp-copy-args))
3236 (rem-enc (tramp-get-remote-encoding multi-method method user host)) 3497 (rem-enc (tramp-get-remote-encoding multi-method method user host))
3237 (rem-dec (tramp-get-remote-decoding multi-method method user host)) 3498 (rem-dec (tramp-get-remote-decoding multi-method method user host))
3238 (loc-enc (tramp-get-local-encoding multi-method method user host)) 3499 (loc-enc (tramp-get-local-encoding multi-method method user host))
@@ -3267,44 +3528,10 @@ This will break if COMMAND prints a newline, followed by the value of
3267 ;; decoding command must be specified. However, if the method 3528 ;; decoding command must be specified. However, if the method
3268 ;; _also_ specifies an encoding function, then that is used for 3529 ;; _also_ specifies an encoding function, then that is used for
3269 ;; encoding the contents of the tmp file. 3530 ;; encoding the contents of the tmp file.
3270 (cond (copy-program 3531 (cond ((tramp-method-out-of-band-p multi-method method user host)
3271 ;; The following should be changed. We need a more general 3532 ;; `copy-file' handles out-of-band methods
3272 ;; mechanism to parse extra host args. 3533 (copy-file tmpfil filename t t))
3273 (when (string-match "\\([^#]*\\)#\\(.*\\)" host) 3534
3274 (setq copy-args (cons "-p" (cons (match-string 2 host)
3275 rsh-args)))
3276 (setq host (match-string 1 host)))
3277
3278 ;; use rcp-like program for file transfer
3279 (let ((argl (append copy-args
3280 (list
3281 tmpfil
3282 (tramp-make-copy-program-file-name
3283 user host
3284 (tramp-shell-quote-argument localname))))))
3285 (tramp-message-for-buffer
3286 multi-method method user host
3287 6 "Writing tmp file using `%s'..." copy-program)
3288 (save-excursion (set-buffer trampbuf) (erase-buffer))
3289 (when tramp-debug-buffer
3290 (save-excursion
3291 (set-buffer (tramp-get-debug-buffer multi-method
3292 method user host))
3293 (goto-char (point-max))
3294 (tramp-insert-with-face
3295 'bold (format "$ %s %s\n" copy-program
3296 (mapconcat 'identity argl " ")))))
3297 (unless (equal 0
3298 (apply #'call-process
3299 copy-program nil trampbuf nil argl))
3300 (pop-to-buffer trampbuf)
3301 (error
3302 "Cannot write region to file `%s', command `%s' failed"
3303 filename copy-program))
3304 (tramp-message-for-buffer
3305 multi-method method user host
3306 6 "Transferring file using `%s'...done"
3307 copy-program)))
3308 ((and rem-enc rem-dec) 3535 ((and rem-enc rem-dec)
3309 ;; Use inline file transfer 3536 ;; Use inline file transfer
3310 (let ((tmpbuf (get-buffer-create " *tramp file transfer*"))) 3537 (let ((tmpbuf (get-buffer-create " *tramp file transfer*")))
@@ -3319,7 +3546,8 @@ This will break if COMMAND prints a newline, followed by the value of
3319 (progn 3546 (progn
3320 (tramp-message-for-buffer 3547 (tramp-message-for-buffer
3321 multi-method method user host 3548 multi-method method user host
3322 6 "Encoding region using function...") 3549 6 "Encoding region using function `%s'..."
3550 (symbol-name loc-enc))
3323 (insert-file-contents-literally tmpfil) 3551 (insert-file-contents-literally tmpfil)
3324 ;; CCC. The following `let' is a workaround for 3552 ;; CCC. The following `let' is a workaround for
3325 ;; the base64.el that comes with pgnus-0.84. If 3553 ;; the base64.el that comes with pgnus-0.84. If
@@ -3685,11 +3913,12 @@ necessary anymore."
3685;; shouldn't have partial tramp file name syntax. Maybe another variable should 3913;; shouldn't have partial tramp file name syntax. Maybe another variable should
3686;; be introduced overwriting this check in such cases. Or we change tramp 3914;; be introduced overwriting this check in such cases. Or we change tramp
3687;; file name syntax in order to avoid ambiguities, like in XEmacs ... 3915;; file name syntax in order to avoid ambiguities, like in XEmacs ...
3688;; In case of XEmacs it can be always true (and wouldn't be necessary). 3916;; In case of non unified file names it can be always true (and wouldn't be
3917;; necessary, because there are different regexp).
3689(defun tramp-completion-mode (file) 3918(defun tramp-completion-mode (file)
3690 "Checks whether method / user name / host name completion is active." 3919 "Checks whether method / user name / host name completion is active."
3691 (cond 3920 (cond
3692 ((featurep 'xemacs) t) 3921 ((not tramp-unified-filenames) t)
3693 ((string-match "^/.*:.*:$" file) nil) 3922 ((string-match "^/.*:.*:$" file) nil)
3694 ((string-match 3923 ((string-match
3695 (concat tramp-prefix-regexp 3924 (concat tramp-prefix-regexp
@@ -3697,11 +3926,21 @@ necessary anymore."
3697 file) 3926 file)
3698 (member (match-string 1 file) (mapcar 'car tramp-methods))) 3927 (member (match-string 1 file) (mapcar 'car tramp-methods)))
3699 ((or (equal last-input-event 'tab) 3928 ((or (equal last-input-event 'tab)
3929 ;; Emacs
3700 (and (integerp last-input-event) 3930 (and (integerp last-input-event)
3701 (not (event-modifiers last-input-event)) 3931 (not (event-modifiers last-input-event))
3702 (or (char-equal last-input-event ?\?) 3932 (or (char-equal last-input-event ?\?)
3703 (char-equal last-input-event ?\t) ; handled by 'tab already? 3933 (char-equal last-input-event ?\t) ; handled by 'tab already?
3704 (char-equal last-input-event ?\ )))) 3934 (char-equal last-input-event ?\ )))
3935 ;; XEmacs
3936 (and (featurep 'xemacs)
3937 (not (event-modifiers last-input-event))
3938 (or (char-equal
3939 (funcall 'event-to-character last-input-event) ?\?)
3940 (char-equal
3941 (funcall 'event-to-character last-input-event) ?\t)
3942 (char-equal
3943 (funcall 'event-to-character last-input-event) ?\ ))))
3705 t))) 3944 t)))
3706 3945
3707(defun tramp-completion-handle-file-exists-p (filename) 3946(defun tramp-completion-handle-file-exists-p (filename)
@@ -4050,6 +4289,35 @@ User is always nil."
4050 (forward-line 1)) 4289 (forward-line 1))
4051 result)) 4290 result))
4052 4291
4292(defun tramp-parse-shostkeys (dirname)
4293 "Return a list of (user host) tuples allowed to access.
4294User is always nil."
4295
4296 (let ((regexp (concat "^key_[0-9]+_\\(" tramp-host-regexp "\\)\\.pub$"))
4297 (files (when (file-directory-p dirname) (directory-files dirname)))
4298 result)
4299
4300 (while files
4301 (when (string-match regexp (car files))
4302 (push (list nil (match-string 1 (car files))) result))
4303 (setq files (cdr files)))
4304 result))
4305
4306(defun tramp-parse-sknownhosts (dirname)
4307 "Return a list of (user host) tuples allowed to access.
4308User is always nil."
4309
4310 (let ((regexp (concat "^\\(" tramp-host-regexp
4311 "\\)\\.ssh-\\(dss\\|rsa\\)\\.pub$"))
4312 (files (when (file-directory-p dirname) (directory-files dirname)))
4313 result)
4314
4315 (while files
4316 (when (string-match regexp (car files))
4317 (push (list nil (match-string 1 (car files))) result))
4318 (setq files (cdr files)))
4319 result))
4320
4053(defun tramp-parse-hosts (filename) 4321(defun tramp-parse-hosts (filename)
4054 "Return a list of (user host) tuples allowed to access. 4322 "Return a list of (user host) tuples allowed to access.
4055User is always nil." 4323User is always nil."
@@ -4206,14 +4474,29 @@ hosts, or files, disagree."
4206 (or switch "") 4474 (or switch "")
4207 (tramp-shell-quote-argument localname2)))))) 4475 (tramp-shell-quote-argument localname2))))))
4208 4476
4477(defun tramp-touch (file time)
4478 "Set the last-modified timestamp of the given file.
4479TIME is an Emacs internal time value as returned by `current-time'."
4480 (let ((touch-time (format-time-string "%Y%m%d%H%M.%S" time)))
4481 (with-parsed-tramp-file-name file nil
4482 (let ((buf (tramp-get-buffer multi-method method user host)))
4483 (unless (zerop (tramp-send-command-and-check
4484 multi-method method user host
4485 (format "touch -t %s %s"
4486 touch-time
4487 localname)))
4488 (pop-to-buffer buf)
4489 (error "tramp-touch: touch failed, see buffer `%s' for details"
4490 buf))))))
4491
4209(defun tramp-buffer-name (multi-method method user host) 4492(defun tramp-buffer-name (multi-method method user host)
4210 "A name for the connection buffer for USER at HOST using METHOD." 4493 "A name for the connection buffer for USER at HOST using METHOD."
4211 (if multi-method 4494 (if multi-method
4212 (tramp-buffer-name-multi-method "tramp" multi-method method user host) 4495 (tramp-buffer-name-multi-method "tramp" multi-method method user host)
4213 (let ((method (tramp-find-method multi-method method user host))) 4496 (let ((method (tramp-find-method multi-method method user host)))
4214 (if user 4497 (if user
4215 (format "*tramp/%s %s@%s*" method user host)) 4498 (format "*tramp/%s %s@%s*" method user host)
4216 (format "*tramp/%s %s*" method host)))) 4499 (format "*tramp/%s %s*" method host)))))
4217 4500
4218(defun tramp-buffer-name-multi-method (prefix multi-method method user host) 4501(defun tramp-buffer-name-multi-method (prefix multi-method method user host)
4219 "A name for the multi method connection buffer. 4502 "A name for the multi method connection buffer.
@@ -4482,11 +4765,6 @@ Returns nil if none was found, else the command is returned."
4482(defun tramp-action-password (p multi-method method user host) 4765(defun tramp-action-password (p multi-method method user host)
4483 "Query the user for a password." 4766 "Query the user for a password."
4484 (let ((pw-prompt (match-string 0))) 4767 (let ((pw-prompt (match-string 0)))
4485 (when (tramp-method-out-of-band-p multi-method method user host)
4486 (kill-process (get-buffer-process (current-buffer)))
4487 (error (concat "Out of band method `%s' not applicable "
4488 "for remote shell asking for a password")
4489 method))
4490 (tramp-message 9 "Sending password") 4768 (tramp-message 9 "Sending password")
4491 (tramp-enter-password p pw-prompt))) 4769 (tramp-enter-password p pw-prompt)))
4492 4770
@@ -4597,6 +4875,7 @@ The terminal type can be configured with `tramp-terminal-type'."
4597 p multi-method method user host actions) 4875 p multi-method method user host actions)
4598 nil))) 4876 nil)))
4599 (unless (eq exit 'ok) 4877 (unless (eq exit 'ok)
4878 (tramp-clear-passwd user host)
4600 (error "Login failed")))) 4879 (error "Login failed"))))
4601 4880
4602;; For multi-actions. 4881;; For multi-actions.
@@ -4632,6 +4911,7 @@ The terminal type can be configured with `tramp-terminal-type'."
4632 (tramp-process-one-multi-action p method user host actions) 4911 (tramp-process-one-multi-action p method user host actions)
4633 nil))) 4912 nil)))
4634 (unless (eq exit 'ok) 4913 (unless (eq exit 'ok)
4914 (tramp-clear-passwd user host)
4635 (error "Login failed")))) 4915 (error "Login failed"))))
4636 4916
4637;; Functions to execute when we have seen the remote shell prompt but 4917;; Functions to execute when we have seen the remote shell prompt but
@@ -4768,7 +5048,7 @@ arguments, and xx will be used as the host name to connect to.
4768 ;; The following should be changed. We need a more general 5048 ;; The following should be changed. We need a more general
4769 ;; mechanism to parse extra host args. 5049 ;; mechanism to parse extra host args.
4770 (when (string-match "\\([^#]*\\)#\\(.*\\)" host) 5050 (when (string-match "\\([^#]*\\)#\\(.*\\)" host)
4771 (setq login-args (cons "-p" (cons (match-string 2 host) rsh-args))) 5051 (setq login-args (cons "-p" (cons (match-string 2 host) login-args)))
4772 (setq host (match-string 1 host))) 5052 (setq host (match-string 1 host)))
4773 (setenv "TERM" tramp-terminal-type) 5053 (setenv "TERM" tramp-terminal-type)
4774 (let* ((default-directory (tramp-temporary-file-directory)) 5054 (let* ((default-directory (tramp-temporary-file-directory))
@@ -5308,10 +5588,7 @@ locale to C and sets up the remote shell search path."
5308 " -e '" tramp-perl-file-attributes "' $1 $2 2>/dev/null\n" 5588 " -e '" tramp-perl-file-attributes "' $1 $2 2>/dev/null\n"
5309 "}")) 5589 "}"))
5310 (tramp-wait-for-output) 5590 (tramp-wait-for-output)
5311 (unless (tramp-get-method-parameter 5591 (unless (tramp-method-out-of-band-p multi-method method user host)
5312 multi-method
5313 (tramp-find-method multi-method method user host)
5314 user host 'tramp-copy-program)
5315 (tramp-message 5 "Sending the Perl `mime-encode' implementations.") 5592 (tramp-message 5 "Sending the Perl `mime-encode' implementations.")
5316 (tramp-send-string 5593 (tramp-send-string
5317 multi-method method user host 5594 multi-method method user host
@@ -5350,10 +5627,7 @@ locale to C and sets up the remote shell search path."
5350 (tramp-set-connection-property "ln" ln multi-method method user host))) 5627 (tramp-set-connection-property "ln" ln multi-method method user host)))
5351 (erase-buffer) 5628 (erase-buffer)
5352 ;; Find the right encoding/decoding commands to use. 5629 ;; Find the right encoding/decoding commands to use.
5353 (unless (tramp-get-method-parameter 5630 (unless (tramp-method-out-of-band-p multi-method method user host)
5354 multi-method
5355 (tramp-find-method multi-method method user host)
5356 user host 'tramp-copy-program)
5357 (tramp-find-inline-encoding multi-method method user host)) 5631 (tramp-find-inline-encoding multi-method method user host))
5358 ;; If encoding/decoding command are given, test to see if they work. 5632 ;; If encoding/decoding command are given, test to see if they work.
5359 ;; CCC: Maybe it would be useful to run the encoder both locally and 5633 ;; CCC: Maybe it would be useful to run the encoder both locally and
@@ -5566,11 +5840,12 @@ connection if a previous connection has died for some reason."
5566 (unless (and p (processp p) (memq (process-status p) '(run open))) 5840 (unless (and p (processp p) (memq (process-status p) '(run open)))
5567 (when (and p (processp p)) 5841 (when (and p (processp p))
5568 (delete-process p)) 5842 (delete-process p))
5569 (funcall (tramp-get-method-parameter 5843 (let ((process-connection-type tramp-process-connection-type))
5570 multi-method 5844 (funcall (tramp-get-method-parameter
5571 (tramp-find-method multi-method method user host) 5845 multi-method
5572 user host 'tramp-connection-function) 5846 (tramp-find-method multi-method method user host)
5573 multi-method method user host)))) 5847 user host 'tramp-connection-function)
5848 multi-method method user host)))))
5574 5849
5575(defun tramp-send-command 5850(defun tramp-send-command
5576 (multi-method method user host command &optional noerase neveropen) 5851 (multi-method method user host command &optional noerase neveropen)
@@ -6223,10 +6498,28 @@ this is the function `temp-directory'."
6223 6498
6224(defun tramp-read-passwd (prompt) 6499(defun tramp-read-passwd (prompt)
6225 "Read a password from user (compat function). 6500 "Read a password from user (compat function).
6226Invokes `read-passwd' if that is defined, else `ange-ftp-read-passwd'." 6501Invokes `password-read' if available, `read-passwd' else."
6227 (apply 6502 (if (functionp 'password-read)
6228 (if (fboundp 'read-passwd) #'read-passwd #'ange-ftp-read-passwd) 6503 (let* ((user (or tramp-current-user (user-login-name)))
6229 (list prompt))) 6504 (host (or tramp-current-host (system-name)))
6505 (key (concat user "@" host))
6506 (password (apply #'password-read (list prompt key))))
6507 (apply #'password-cache-add (list key password))
6508 password)
6509 (read-passwd prompt)))
6510
6511(defun tramp-clear-passwd (&optional user host)
6512 "Clear password cache for connection related to current-buffer."
6513 (interactive)
6514 (let ((filename (or buffer-file-name list-buffers-directory "")))
6515 (when (and (functionp 'password-cache-remove)
6516 (or (and user host) (tramp-tramp-file-p filename)))
6517 (let* ((v (when (tramp-tramp-file-p filename)
6518 (tramp-dissect-file-name filename)))
6519 (luser (or user (tramp-file-name-user v) (user-login-name)))
6520 (lhost (or host (tramp-file-name-host v) (system-name)))
6521 (key (concat luser "@" lhost)))
6522 (apply #'password-cache-remove (list key))))))
6230 6523
6231(defun tramp-time-diff (t1 t2) 6524(defun tramp-time-diff (t1 t2)
6232 "Return the difference between the two times, in seconds. 6525 "Return the difference between the two times, in seconds.
@@ -6477,7 +6770,6 @@ report.
6477 6770
6478;;; TODO: 6771;;; TODO:
6479 6772
6480;; * tramp-copy-keep-date-arg is not used!
6481;; * Allow putting passwords in the filename. 6773;; * Allow putting passwords in the filename.
6482;; This should be implemented via a general mechanism to add 6774;; This should be implemented via a general mechanism to add
6483;; parameters in filenames. There is currently a kludge for 6775;; parameters in filenames. There is currently a kludge for
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index 72c8c97899a..b3223d7a46e 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -30,7 +30,7 @@
30;; are auto-frobbed from configure.ac, so you should edit that file and run 30;; are auto-frobbed from configure.ac, so you should edit that file and run
31;; "autoconf && ./configure" to change them. 31;; "autoconf && ./configure" to change them.
32 32
33(defconst tramp-version "2.0.38" 33(defconst tramp-version "2.0.39"
34 "This version of Tramp.") 34 "This version of Tramp.")
35 35
36(defconst tramp-bug-report-address "tramp-devel@mail.freesoftware.fsf.org" 36(defconst tramp-bug-report-address "tramp-devel@mail.freesoftware.fsf.org"
diff --git a/man/ChangeLog b/man/ChangeLog
index 9d95b6bae45..c1e3859986c 100644
--- a/man/ChangeLog
+++ b/man/ChangeLog
@@ -1,3 +1,20 @@
12004-02-29 Kai Grossjohann <kgrossjo@eu.uu.net>
2 Tramp version 2.0.39 released.
3
42004-02-29 Michael Albinus <Michael.Albinus@alcatel.de>
5
6 * tramp.texi (Customizing Completion): Explain new functions
7 `tramp-parse-shostkeys' and `tramp-parse-sknownhosts'.
8 (all): Savannah URLs unified to "http://savannah.nongnu.org".
9 (Top): Refer to Savannah mailing list as the major one. Mention
10 older mailing lists in HTML mode only.
11 (Auto-save and Backup): Add auto-save. Based on wording of Kai.
12 (Frequently Asked Questions): Remote hosts must not be Unix-like
13 for "smb" method.
14 (Password caching): New node.
15 (External transfer methods): Refer to password caching for "smb"
16 method.
17
12004-02-23 Nick Roberts <nick@nick.uklinux.net> 182004-02-23 Nick Roberts <nick@nick.uklinux.net>
2 19
3 * building.texi (Watch Expressions): Update. 20 * building.texi (Watch Expressions): Update.
diff --git a/man/tramp.texi b/man/tramp.texi
index ada4d63fa55..ffc22837b54 100644
--- a/man/tramp.texi
+++ b/man/tramp.texi
@@ -30,7 +30,7 @@
30@end macro 30@end macro
31 31
32@copying 32@copying
33Copyright @copyright{} 1999, 2000, 2001, 2002, 2003 Free Software 33Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004 Free Software
34Foundation, Inc. 34Foundation, Inc.
35 35
36@quotation 36@quotation
@@ -54,10 +54,10 @@ license to the document, as described in section 6 of the license.
54@end copying 54@end copying
55 55
56@c Entries for @command{install-info} to use 56@c Entries for @command{install-info} to use
57@dircategory Emacs 57@dircategory @value{emacs-name}
58@direntry 58@direntry
59* TRAMP: (tramp). Transparent Remote Access, Multiple Protocol 59* TRAMP: (tramp). Transparent Remote Access, Multiple Protocol
60 Emacs remote file access via rsh and rcp. 60 @value{emacs-name} remote file access via rsh and rcp.
61@end direntry 61@end direntry
62 62
63@tex 63@tex
@@ -108,18 +108,27 @@ Japanese translation}.
108@end ifset 108@end ifset
109 109
110The latest release of @tramp{} is available for 110The latest release of @tramp{} is available for
111@uref{http://savannah.gnu.org/download/tramp/, 111@uref{http://savannah.nongnu.org/download/tramp/,
112download}, or you may see @ref{Obtaining @tramp{}} for more details, 112download}, or you may see @ref{Obtaining @tramp{}} for more details,
113including the CVS server details. 113including the CVS server details.
114 114
115@tramp{} also has a @uref{https://savannah.gnu.org/projects/tramp/, 115@tramp{} also has a @uref{http://savannah.nongnu.org/projects/tramp/,
116Savannah Project Page}. 116Savannah Project Page}.
117@end ifhtml 117@end ifhtml
118 118
119There is a mailing list for @tramp{}, available at 119There is a mailing list for @tramp{}, available at
120@email{tramp-devel@@mail.freesoftware.fsf.org}, and archived at 120@email{tramp-devel@@mail.freesoftware.fsf.org}, and archived at
121@uref{http://www.mail-archive.com/emacs-rcp@@ls6.cs.uni-dortmund.de/} as 121@uref{http://savannah.nongnu.org/mail/?group=tramp, Savannah Mail
122well as the usual Savannah archives. 122Archive}.
123@ifhtml
124Older archives are located at
125@uref{http://sourceforge.net/mailarchive/forum.php?forum=tramp-devel,
126SourceForge Mail Archive} and
127@uref{http://www.mail-archive.com/emacs-rcp@@ls6.cs.uni-dortmund.de/,
128The Mail Archive}.
129@c in HTML output, there's no new paragraph.
130@*@*
131@end ifhtml
123 132
124@insertcopying 133@insertcopying
125 134
@@ -168,6 +177,7 @@ Configuring @tramp{} for use
168* Default Method:: Selecting a default method. 177* Default Method:: Selecting a default method.
169* Customizing Methods:: Using Non-Standard Methods. 178* Customizing Methods:: Using Non-Standard Methods.
170* Customizing Completion:: Selecting config files for user/host name completion. 179* Customizing Completion:: Selecting config files for user/host name completion.
180* Password caching:: Reusing passwords for several connections.
171* Remote Programs:: How @tramp{} finds and uses programs on the remote machine. 181* Remote Programs:: How @tramp{} finds and uses programs on the remote machine.
172* Remote shell setup:: Remote shell setup hints. 182* Remote shell setup:: Remote shell setup hints.
173* Windows setup hints:: Issues with Cygwin ssh. 183* Windows setup hints:: Issues with Cygwin ssh.
@@ -383,20 +393,15 @@ following URL and then clicking on the CVS link in the navigation bar
383at the top. 393at the top.
384 394
385@noindent 395@noindent
386@uref{http://savannah.gnu.org/projects/tramp/} 396@uref{http://savannah.nongnu.org/projects/tramp/}
387 397
388@noindent 398@noindent
389Or follow the example session below: 399Or follow the example session below:
390 400
391@example 401@example
392] @strong{cd ~/@value{emacs-dir}} 402] @strong{cd ~/@value{emacs-dir}}
393] @strong{cvs -d:pserver:anoncvs@@subversions.gnu.org:/cvsroot/tramp login} 403] @strong{export CVS_RSH="ssh"}
394 404] @strong{cvs -z3 -d:ext:anoncvs@@savannah.nongnu.org:/cvsroot/tramp co tramp}
395(Logging in to anoncvs@@subversions.gnu.org)
396CVS password: @strong{(just hit RET here)}
397@dots{}
398
399] @strong{cvs -z3 -d:pserver:anoncvs@@subversions.gnu.org:/cvsroot/tramp co tramp}
400@end example 405@end example
401 406
402@noindent 407@noindent
@@ -406,6 +411,7 @@ updates from the repository by issuing the command:
406 411
407@example 412@example
408] @strong{cd ~/@value{emacs-dir}/tramp} 413] @strong{cd ~/@value{emacs-dir}/tramp}
414] @strong{export CVS_RSH="ssh"}
409] @strong{cvs update -d} 415] @strong{cvs update -d}
410@end example 416@end example
411 417
@@ -480,6 +486,7 @@ Method}.
480 is right for them. 486 is right for them.
481* Customizing Methods:: Using Non-Standard Methods. 487* Customizing Methods:: Using Non-Standard Methods.
482* Customizing Completion:: Selecting config files for user/host name completion. 488* Customizing Completion:: Selecting config files for user/host name completion.
489* Password caching:: Reusing passwords for several connections.
483* Remote Programs:: How @tramp{} finds and uses programs on the remote machine. 490* Remote Programs:: How @tramp{} finds and uses programs on the remote machine.
484* Remote shell setup:: Remote shell setup hints. 491* Remote shell setup:: Remote shell setup hints.
485* Windows setup hints:: Issues with Cygwin ssh. 492* Windows setup hints:: Issues with Cygwin ssh.
@@ -554,9 +561,9 @@ allow you to transfer files between @emph{user identities} rather than
554hosts, see below.) 561hosts, see below.)
555 562
556These methods depend on the existence of a suitable encoding and 563These methods depend on the existence of a suitable encoding and
557decoding command on remote machine. Locally, @tramp{} may be able to use 564decoding command on remote machine. Locally, @tramp{} may be able to
558features of Emacs to decode and encode the files or it may require 565use features of @value{emacs-name} to decode and encode the files or
559access to external commands to perform that task. 566it may require access to external commands to perform that task.
560 567
561@cindex uuencode 568@cindex uuencode
562@cindex mimencode 569@cindex mimencode
@@ -662,11 +669,11 @@ question (yet), therefore you will need to make sure that you can log
662in without such questions. 669in without such questions.
663 670
664This is also useful for Windows users where @command{ssh}, when 671This is also useful for Windows users where @command{ssh}, when
665invoked from an Emacs buffer, tells them that it is not allocating a 672invoked from an @value{emacs-name} buffer, tells them that it is not
666pseudo tty. When this happens, the login shell is wont to not print 673allocating a pseudo tty. When this happens, the login shell is wont
667any shell prompt, which confuses @tramp{} mightily. For reasons 674to not print any shell prompt, which confuses @tramp{} mightily. For
668unknown, some Windows ports for @command{ssh} (maybe the Cygwin one) 675reasons unknown, some Windows ports for @command{ssh} (maybe the
669require the doubled @samp{-t} option. 676Cygwin one) require the doubled @samp{-t} option.
670 677
671This supports the @samp{-p} kludge. 678This supports the @samp{-p} kludge.
672 679
@@ -820,10 +827,10 @@ just gives @tramp{} a more-or-less `standard' login shell to work
820with. 827with.
821 828
822This is also useful for Windows users where @command{ssh}, when 829This is also useful for Windows users where @command{ssh}, when
823invoked from an Emacs buffer, tells them that it is not allocating a 830invoked from an @value{emacs-name} buffer, tells them that it is not
824pseudo tty. When this happens, the login shell is wont to not print 831allocating a pseudo tty. When this happens, the login shell is wont
825any shell prompt, which confuses @tramp{} mightily. Maybe this 832to not print any shell prompt, which confuses @tramp{} mightily.
826applies to the Cygwin port of SSH. 833Maybe this applies to the Cygwin port of SSH.
827 834
828This method supports the @samp{-p} hack. 835This method supports the @samp{-p} hack.
829 836
@@ -864,19 +871,21 @@ This method uses the command @samp{fsh @var{host} -l @var{user}
864 871
865@cindex method fsh 872@cindex method fsh
866@cindex fsh method 873@cindex fsh method
874
867There is no inline method using @command{fsh} as the multiplexing 875There is no inline method using @command{fsh} as the multiplexing
868provided by the program is not very useful in our context. @tramp{} 876provided by the program is not very useful in our context. @tramp{}
869opens just one connection to the remote host and then keeps it open, 877opens just one connection to the remote host and then keeps it open,
870anyway. 878anyway.
871 879
872 880
873@ifset emacs
874@item @option{ftp} 881@item @option{ftp}
875@cindex method ftp 882@cindex method ftp
876@cindex ftp method 883@cindex ftp method
877 884
878This is not a native @tramp{} method. Instead of, it forwards all 885This is not a native @tramp{} method. Instead of, it forwards all
879requests to @value{ftp-package-name}. 886requests to @value{ftp-package-name}.
887@ifset xemacs
888This works only for unified filenames, see @ref{Issues}.
880@end ifset 889@end ifset
881 890
882 891
@@ -899,7 +908,7 @@ directory @code{/}), all available shares are listed.
899 908
900Since authorization is done on share level, you will be prompted 909Since authorization is done on share level, you will be prompted
901always for a password if you access another share on the same host. 910always for a password if you access another share on the same host.
902Due to security reasons, the password is not cached. 911This can be suppressed by @ref{Password caching}.
903 912
904MS Windows uses for authorization both a user name and a domain name. 913MS Windows uses for authorization both a user name and a domain name.
905Because of this, the @tramp{} syntax has been extended: you can 914Because of this, the @tramp{} syntax has been extended: you can
@@ -917,10 +926,11 @@ methods, where in such a case the local user name is taken.
917 926
918The @option{smb} method supports the @samp{-p} hack. 927The @option{smb} method supports the @samp{-p} hack.
919 928
920@strong{Please note:} If Emacs runs locally under MS Windows, this 929@strong{Please note:} If @value{emacs-name} runs locally under MS
921method isn't available. Instead of, you can use UNC file names like 930Windows, this method isn't available. Instead of, you can use UNC
922@file{//melancholia/daniel$$/.emacs}. The only disadvantage is that 931file names like @file{//melancholia/daniel$$/.emacs}. The only
923there's no possibility to specify another user name. 932disadvantage is that there's no possibility to specify another user
933name.
924 934
925@end table 935@end table
926 936
@@ -1197,6 +1207,21 @@ in such files, it can return host names only.
1197This function returns the host nicknames defined by @code{Host} entries 1207This function returns the host nicknames defined by @code{Host} entries
1198in @file{~/.ssh/config} style files. 1208in @file{~/.ssh/config} style files.
1199 1209
1210@item @code{tramp-parse-shostkeys}
1211@findex tramp-parse-shostkeys
1212
1213SSH2 parsing of directories @file{/etc/ssh2/hostkeys/*} and
1214@file{~/ssh2/hostkeys/*}. Hosts are coded in file names
1215@file{hostkey_PORTNUMBER_HOST-NAME.pub}. User names are always nil.
1216
1217@item @code{tramp-parse-sknownhosts}
1218@findex tramp-parse-shostkeys
1219
1220Another SSH2 style parsing of directories like
1221@file{/etc/ssh2/knownhosts/*} and @file{~/ssh2/knownhosts/*}. This
1222case, hosts names are coded in file names
1223@file{HOST-NAME.ALGORITHM.pub}. User names are always nil.
1224
1200@item @code{tramp-parse-hosts} 1225@item @code{tramp-parse-hosts}
1201@findex tramp-parse-hosts 1226@findex tramp-parse-hosts
1202 1227
@@ -1233,6 +1258,49 @@ Example:
1233@end defun 1258@end defun
1234 1259
1235 1260
1261@node Password caching
1262@section Reusing passwords for several connections.
1263@cindex passwords
1264
1265Sometimes it is necessary to connect to the same remote host several
1266times. Reentering passwords again and again would be annoying, when
1267the choosen method does not support access without password prompt
1268throught own configuration.
1269
1270By default, @tramp{} caches the passwords entered by you. They will
1271be reused next time if a connection needs them for the same user name
1272and host name, independant of the connection method.
1273
1274@vindex password-cache-expiry
1275Passwords are not saved permanently, that means the password caching
1276is limited to the lifetime of your @value{emacs-name} session. You
1277can influence the lifetime of password caching by customizing the
1278variable @code{password-cache-expiry}. The value is the number of
1279seconds how long passwords are cached. Setting it to @code{nil}
1280disables the expiration.
1281
1282@findex tramp-clear-passwd
1283A password is removed from the cache if a connection isn't established
1284successfully. You can remove a password from the cache also by
1285executing @kbd{M-x tramp-clear-passwd} in a buffer containing a
1286related remote file or directory.
1287
1288@vindex password-cache
1289If you don't like this feature for security reasons, password caching
1290can be disabled totally by customizing the variable
1291@code{password-cache} (setting it to @code{nil}).
1292
1293Implementation Note: password caching is based on the package
1294password.el in No Gnus. For the time being, it is activated only when
1295this package is seen in the @code{load-path} while loading @tramp{}.
1296@ifset tramp-inst
1297If you don't use No Gnus, you can take password.el from the @tramp{}
1298@file{contrib} directory, see @ref{Installation parameters}.
1299@end ifset
1300It will be activated mandatory once No Gnus has found its way into
1301@value{emacs-name}.
1302
1303
1236@node Remote Programs 1304@node Remote Programs
1237@section How @tramp{} finds and uses programs on the remote machine. 1305@section How @tramp{} finds and uses programs on the remote machine.
1238 1306
@@ -1426,16 +1494,15 @@ find out if the shell is Bourne-ish?
1426@cindex backup 1494@cindex backup
1427@vindex backup-directory-alist 1495@vindex backup-directory-alist
1428 1496
1429Explaining auto-save is still to do. 1497Normally, @value{emacs-name} writes backup files to the same directory
1430 1498as the original files, but this behavior can be changed via the
1431Normally, Emacs writes backup files to the same directory as the 1499variable @code{backup-directory-alist}. In connection with @tramp{},
1432original files, but this behavior can be changed via the variable 1500this can have unexpected side effects. Suppose that you specify that
1433@code{backup-directory-alist}. In connection with @tramp{}, this can 1501all backups should go to the directory @file{~/.emacs.d/backups/}, and
1434have unexpected side effects. Suppose that you specify that all backups 1502then you edit the file @file{/su:root@@localhost:/etc/secretfile}.
1435should go to the directory @file{~/.emacs.d/backups/}, and then you edit 1503The effect is that the backup file will be owned by you and not by
1436the file @file{/su:root@@localhost:/etc/secretfile}. The effect is that 1504root, thus possibly enabling others to see it even if they were not
1437the backup file will be owned by you and not by root, thus possibly 1505intended to see it.
1438enabling others to see it even if they were not intended to see it.
1439 1506
1440When @code{backup-directory-alist} is nil (the default), such problems 1507When @code{backup-directory-alist} is nil (the default), such problems
1441do not occur. 1508do not occur.
@@ -1451,6 +1518,29 @@ effectively `turns off' the effect of @code{backup-directory-alist} for
1451 (cons tramp-file-name-regexp nil)) 1518 (cons tramp-file-name-regexp nil))
1452@end lisp 1519@end lisp
1453 1520
1521The same problem can happen with auto-saving files.
1522@ifset emacs
1523Since @value{emacs-name} 21, the variable
1524@code{auto-save-file-name-transforms} keeps information, on which
1525directory an auto-saved file should go. By default, it is initialized
1526for @tramp{} files to the local temporary directory.
1527
1528On some versions of @value{emacs-name}, namely the version built for
1529Debian Linux, the variable @code{auto-save-file-name-transforms}
1530contains the directory where @value{emacs-name} was built. A
1531workaround is to manually set the variable to a sane value.
1532
1533If auto-saved files should go into the same directory as the original
1534files, @code{auto-save-file-name-transforms} should be set to nil.
1535
1536Another possibility is to set the variable
1537@code{tramp-auto-save-directory} to a proper value.
1538@end ifset
1539@ifset xemacs
1540For this purpose you can set the variable
1541@code{tramp-auto-save-directory} to a proper value.
1542@end ifset
1543
1454 1544
1455@node Windows setup hints 1545@node Windows setup hints
1456@section Issues with Cygwin ssh 1546@section Issues with Cygwin ssh
@@ -1468,29 +1558,30 @@ setting up Cygwin in their FAQ at @uref{http://cygwin.com/faq/}.
1468@cindex method scpx with Cygwin 1558@cindex method scpx with Cygwin
1469@cindex scpx method with Cygwin 1559@cindex scpx method with Cygwin
1470If you wish to use the @code{scpx} connection method, then you might 1560If you wish to use the @code{scpx} connection method, then you might
1471have the problem that Emacs calls @code{scp} with a Windows filename 1561have the problem that @value{emacs-name} calls @code{scp} with a
1472such as @code{c:/foo}. The Cygwin version of @code{scp} does not know 1562Windows filename such as @code{c:/foo}. The Cygwin version of
1473about Windows filenames and interprets this as a remote filename on the 1563@code{scp} does not know about Windows filenames and interprets this
1474host @code{c}. 1564as a remote filename on the host @code{c}.
1475 1565
1476One possible workaround is to write a wrapper script for @code{scp} 1566One possible workaround is to write a wrapper script for @code{scp}
1477which converts the Windows filename to a Cygwinized filename. 1567which converts the Windows filename to a Cygwinized filename.
1478 1568
1479I guess that another workaround is to run Emacs under Cygwin, or to run 1569I guess that another workaround is to run @value{emacs-name} under
1480a Cygwinized Emacs. 1570Cygwin, or to run a Cygwinized @value{emacs-name}.
1481 1571
1482@cindex Cygwin and ssh-agent 1572@cindex Cygwin and ssh-agent
1483@cindex SSH_AUTH_SOCK and Emacs on Windows 1573@cindex SSH_AUTH_SOCK and @value{emacs-name} on Windows
1484If you want to use either @code{ssh} based method on Windows, then you 1574If you want to use either @code{ssh} based method on Windows, then you
1485might encounter problems with @code{ssh-agent}. Using this program, 1575might encounter problems with @code{ssh-agent}. Using this program,
1486you can avoid typing the pass-phrase every time you log in (and the 1576you can avoid typing the pass-phrase every time you log in (and the
1487@code{scpx} method more or less requires you to use @code{ssh-agent} 1577@code{scpx} method more or less requires you to use @code{ssh-agent}
1488because it does not allow you to type a password or pass-phrase). 1578because it does not allow you to type a password or pass-phrase).
1489However, if you start Emacs from a desktop shortcut, then the 1579However, if you start @value{emacs-name} from a desktop shortcut, then
1490environment variable @code{SSH_AUTH_SOCK} is not set and so Emacs and 1580the environment variable @code{SSH_AUTH_SOCK} is not set and so
1491thus @tramp{} and thus @code{ssh} and @code{scp} started from @tramp{} 1581@value{emacs-name} and thus @tramp{} and thus @code{ssh} and
1492cannot communicate with @code{ssh-agent}. It works better to start 1582@code{scp} started from @tramp{} cannot communicate with
1493Emacs from the shell. 1583@code{ssh-agent}. It works better to start @value{emacs-name} from
1584the shell.
1494 1585
1495If anyone knows how to start @code{ssh-agent} under Windows in such a 1586If anyone knows how to start @code{ssh-agent} under Windows in such a
1496way that desktop shortcuts can profit, please holler. I don't really 1587way that desktop shortcuts can profit, please holler. I don't really
@@ -1510,15 +1601,15 @@ details of the system to connect to. This is similar to the syntax used
1510by the @value{ftp-package-name} package. 1601by the @value{ftp-package-name} package.
1511 1602
1512@cindex type-ahead 1603@cindex type-ahead
1513Something that might happen which surprises you is that Emacs 1604Something that might happen which surprises you is that
1514remembers all your keystrokes, so if you see a password prompt from 1605@value{emacs-name} remembers all your keystrokes, so if you see a
1515Emacs, say, and hit @kbd{@key{RET}} twice instead of once, then the 1606password prompt from @value{emacs-name}, say, and hit @kbd{@key{RET}}
1516second keystroke will be processed by Emacs after @tramp{} has done 1607twice instead of once, then the second keystroke will be processed by
1517its thing. Why, this type-ahead is normal behavior, you say. Right 1608@value{emacs-name} after @tramp{} has done its thing. Why, this
1518you are, but be aware that opening a remote file might take quite a 1609type-ahead is normal behavior, you say. Right you are, but be aware
1519while, maybe half a minute when a connection needs to be opened. 1610that opening a remote file might take quite a while, maybe half a
1520Maybe after half a minute you have already forgotten that you hit that 1611minute when a connection needs to be opened. Maybe after half a
1521key! 1612minute you have already forgotten that you hit that key!
1522 1613
1523@menu 1614@menu
1524* Filename Syntax:: @tramp{} filename conventions. 1615* Filename Syntax:: @tramp{} filename conventions.
@@ -1606,7 +1697,7 @@ in my home directory I would specify the filename
1606 1697
1607The syntax of multi-hop file names is necessarily slightly different 1698The syntax of multi-hop file names is necessarily slightly different
1608than the syntax of other @tramp{} file names. Here's an example 1699than the syntax of other @tramp{} file names. Here's an example
1609multi-hop file name, first in Emacs syntax and then in XEmacs syntax: 1700multi-hop file name:
1610 1701
1611@example 1702@example
1612@value{tramp-prefix}multi@value{tramp-postfix-single-hop}rsh@value{tramp-postfix-multi-hop}out@@gate@value{tramp-postfix-single-hop}telnet@value{tramp-postfix-multi-hop}kai@@real.host@value{tramp-postfix}/path/to.file 1703@value{tramp-prefix}multi@value{tramp-postfix-single-hop}rsh@value{tramp-postfix-multi-hop}out@@gate@value{tramp-postfix-single-hop}telnet@value{tramp-postfix-multi-hop}kai@@real.host@value{tramp-postfix}/path/to.file
@@ -1769,7 +1860,7 @@ Where can I get the latest @tramp{}?
1769There is also a Savannah project page. 1860There is also a Savannah project page.
1770 1861
1771@noindent 1862@noindent
1772@uref{https://savannah.gnu.org/projects/tramp/} 1863@uref{http://savannah.nongnu.org/projects/tramp/}
1773 1864
1774@item 1865@item
1775Which systems does it work on? 1866Which systems does it work on?
@@ -1779,8 +1870,9 @@ as XEmacs 21. XEmacs 20 is more problematic, see the notes in
1779@file{tramp.el}. I don't think anybody has really tried it on Emacs 19. 1870@file{tramp.el}. I don't think anybody has really tried it on Emacs 19.
1780 1871
1781The package was intended to work on Unix, and it really expects a 1872The package was intended to work on Unix, and it really expects a
1782Unix-like system on the remote end, but some people seemed to have some 1873Unix-like system on the remote end (except the @option{smb} method),
1783success getting it to work on NT Emacs. 1874but some people seemed to have some success getting it to work on NT
1875Emacs.
1784 1876
1785There is some informations on @tramp{} on NT at the following URL; 1877There is some informations on @tramp{} on NT at the following URL;
1786many thanks to Joe Stoy for providing the information: 1878many thanks to Joe Stoy for providing the information:
@@ -1888,8 +1980,9 @@ work on NT with some tweaking.
1888@item 1980@item
1889How can I get notified when @tramp{} file transfers are complete? 1981How can I get notified when @tramp{} file transfers are complete?
1890 1982
1891The following snippet can be put in your @file{~/.emacs} file. It makes 1983The following snippet can be put in your @file{~/.emacs} file. It
1892Emacs beep after reading from or writing to the remote host. 1984makes @value{emacs-name} beep after reading from or writing to the
1985remote host.
1893 1986
1894@lisp 1987@lisp
1895(defadvice tramp-handle-write-region 1988(defadvice tramp-handle-write-region
@@ -2036,10 +2129,11 @@ Minor implementation details, &c.
2036@node Remote File Ownership 2129@node Remote File Ownership
2037@subsection How VC determines who owns a workfile 2130@subsection How VC determines who owns a workfile
2038 2131
2039Emacs provides the @code{user-full-name} function to return the login name 2132@value{emacs-name} provides the @code{user-full-name} function to
2040of the current user as well as mapping from arbitrary user id values 2133return the login name of the current user as well as mapping from
2041back to login names. The VC code uses this functionality to map from the 2134arbitrary user id values back to login names. The VC code uses this
2042uid of the owner of a workfile to the login name in some circumstances. 2135functionality to map from the uid of the owner of a workfile to the
2136login name in some circumstances.
2043 2137
2044This will not, for obvious reasons, work if the remote system has a 2138This will not, for obvious reasons, work if the remote system has a
2045different set of logins. As such, it is necessary to delegate to the 2139different set of logins. As such, it is necessary to delegate to the
@@ -2157,6 +2251,29 @@ uses EFS for downloading new packages. So, obviously, EFS has to be
2157installed from the start. If the filenames were unified, @tramp{} 2251installed from the start. If the filenames were unified, @tramp{}
2158would have to be installed from the start, too. 2252would have to be installed from the start, too.
2159 2253
2254@ifset xemacs
2255@strong{Note:} If you'ld like to use a similar syntax like
2256@value{ftp-package-name}, you need the following settings in your init
2257file:
2258
2259@lisp
2260(setq tramp-unified-filenames t)
2261(require 'tramp)
2262@end lisp
2263
2264The autoload of the @value{emacs-name} @tramp{} package must be
2265disabled. This can be achieved by setting file permissions @code{000}
2266to the files @file{.../xemacs-packages/lisp/tramp/auto-autoloads.el*}.
2267
2268In case of unified filenames, all @value{emacs-name} download sites
2269are added to @code{tramp-default-method-alist} with default method
2270@code{ftp} @xref{Default Method}. These settings shouldn't be touched
2271for proper working of the @value{emacs-name} package system.
2272
2273The syntax for unified filenames is described in the @tramp{} manual
2274for @value{emacs-other-name}.
2275@end ifset
2276
2160@end itemize 2277@end itemize
2161 2278
2162@node Concept Index 2279@node Concept Index
@@ -2181,7 +2298,3 @@ would have to be installed from the start, too.
2181@c ** Use `filename' resp. `file name' consistently. 2298@c ** Use `filename' resp. `file name' consistently.
2182@c ** Use `host' resp. `machine' consistently. 2299@c ** Use `host' resp. `machine' consistently.
2183@c ** Consistent small or capitalized words especially in menues. 2300@c ** Consistent small or capitalized words especially in menues.
2184
2185@ignore
2186 arch-tag: f96dd66e-6dd3-4c92-8d77-9c56205ba808
2187@end ignore
diff --git a/man/trampver.texi b/man/trampver.texi
index ae80490d703..d6b9c73610b 100644
--- a/man/trampver.texi
+++ b/man/trampver.texi
@@ -5,7 +5,7 @@
5@c configure.ac, so you should edit that file and run 5@c configure.ac, so you should edit that file and run
6@c "autoconf && ./configure" to change the version number. 6@c "autoconf && ./configure" to change the version number.
7@macro trampver{} 7@macro trampver{}
82.0.38 82.0.39
9@end macro 9@end macro
10 10
11@c Other flags from configuration 11@c Other flags from configuration
@@ -60,6 +60,3 @@
60@c Otherwise, '/dev/null/' is taken, which leaves this part empty. 60@c Otherwise, '/dev/null/' is taken, which leaves this part empty.
61 61
62 62
63@ignore
64 arch-tag: e0fe322c-e06b-46eb-bb5b-d091b521f41c
65@end ignore