summaryrefslogtreecommitdiff
path: root/lisp/net
diff options
context:
space:
mode:
authorMichael Albinus <michael.albinus@gmx.de>2007-10-21 14:02:38 +0000
committerMichael Albinus <michael.albinus@gmx.de>2007-10-21 14:02:38 +0000
commit9c13938d8e013e72c797489eaf91bc986bb5046f (patch)
tree2ca88af5ea32b01ef9fad50d0045348ac9516c40 /lisp/net
parentba63d4410729baf16297145068a767cd8892d349 (diff)
downloademacs-9c13938d8e013e72c797489eaf91bc986bb5046f.tar.gz
* net/tramp.el (top): Put load of all tramp-* files into a dolist.
Require tramp-cmds.el. (tramp-make-tramp-temp-file): We can get rid of DONT-CREATE. (tramp-handle-file-name-all-completions): Expand DIRECTORY. (tramp-do-copy-or-rename-file-directly): Make more rigid checks. (tramp-do-copy-or-rename-file-out-of-band) (tramp-maybe-open-connection): Use `make-temp-name'. This is possible, because we don't need to create the temporary file, but we need a prefix for ssh, which has its own temporary file handling. (tramp-handle-delete-directory): Add "-f" to rmdir. (tramp-handle-dired-recursive-delete-directory): Call "rm -rf". (tramp-handle-insert-file-contents): Don't raise a tramp-error but a signal, in order to give the callee a chance to suppress. (tramp-handle-write-region): Set owner also in case of short track. Don't use compatibility calls for `write-region' anymore. (tramp-clear-passwd): Add parameter VEC. Adapt all callees. (tramp-append-tramp-buffers): Apply `tramp-list-tramp-buffers'. * net/tramp-cmds.el: New file. * net/tramp-gw.el (tramp-gw-basic-authentication): Apply VEC to `tramp-clear-passwd'. * net/trampver.el: Update release number.
Diffstat (limited to 'lisp/net')
-rw-r--r--lisp/net/tramp-cmds.el147
-rw-r--r--lisp/net/tramp-gw.el5
-rw-r--r--lisp/net/tramp.el523
-rw-r--r--lisp/net/trampver.el4
4 files changed, 399 insertions, 280 deletions
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
new file mode 100644
index 00000000000..43df393ec69
--- /dev/null
+++ b/lisp/net/tramp-cmds.el
@@ -0,0 +1,147 @@
+;;; tramp-cmds.el --- Interactive commands for Tramp
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Michael Albinus <michael.albinus@gmx.de>
+;; Keywords: comm, processes
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, see
+;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides all interactive commands which are releated
+;; to Tramp.
+
+;;; Code:
+
+(require 'tramp)
+
+(defun tramp-list-tramp-buffers ()
+ "Return a list of all Tramp connection buffers."
+ (append
+ (all-completions
+ "*tramp" (mapcar 'list (mapcar 'buffer-name (buffer-list))))
+ (all-completions
+ "*debug tramp" (mapcar 'list (mapcar 'buffer-name (buffer-list))))))
+
+(defun tramp-list-remote-buffers ()
+ "Return a list of all buffers with remote default-directory."
+ (delq
+ nil
+ (mapcar
+ (lambda (x)
+ (with-current-buffer x
+ (when (and (stringp default-directory)
+ (file-remote-p default-directory))
+ x)))
+ (buffer-list))))
+
+(defun tramp-cleanup-connection (vec)
+ "Flush all connection related objects.
+This includes password cache, file cache, connection cache, buffers.
+When called interactively, a Tramp connection has to be selected."
+ (interactive
+ ;; When interactive, select the Tramp remote identification.
+ ;; Return nil when there is no Tramp connection.
+ (list
+ (let ((connections
+ (mapcar
+ (lambda (x)
+ (with-current-buffer x (list (file-remote-p default-directory))))
+ ;; We shall not count debug buffers, because their
+ ;; default-directory is random. It could be even a remote
+ ;; one from another connection.
+ (all-completions
+ "*tramp" (mapcar 'list (tramp-list-tramp-buffers)))))
+ name)
+
+ (when connections
+ (setq name
+ (completing-read
+ "Enter Tramp connection: " connections nil t
+ (try-completion "" connections)))
+ (when (and name (file-remote-p name))
+ (with-parsed-tramp-file-name name nil v))))))
+
+ (if (not vec)
+ ;; Nothing to do.
+ (message "No Tramp connection found.")
+
+ ;; Flush password cache.
+ (tramp-clear-passwd vec)
+
+ ;; Flush file cache.
+ (tramp-flush-directory-property vec "/")
+
+ ;; Flush connection cache.
+ (tramp-flush-connection-property (tramp-get-connection-process vec) nil)
+ (tramp-flush-connection-property vec nil)
+
+ ;; Remove buffers.
+ (dolist
+ (buf (list (get-buffer (tramp-buffer-name vec))
+ (get-buffer (tramp-debug-buffer-name vec))
+ (tramp-get-connection-property vec "process-buffer" nil)))
+ (when (bufferp buf) (kill-buffer buf)))))
+
+(defun tramp-cleanup-all-connections ()
+ "Flush all Tramp internal objects.
+This includes password cache, file cache, connection cache, buffers."
+ (interactive)
+
+ ;; Flush password cache.
+ (when (functionp 'password-reset)
+ (funcall (symbol-function 'password-reset)))
+
+ ;; Flush file and connection cache.
+ (clrhash tramp-cache-data)
+
+ ;; Remove buffers.
+ (dolist (name (tramp-list-tramp-buffers))
+ (when (bufferp (get-buffer name)) (kill-buffer name))))
+
+(defun tramp-cleanup-all-buffers ()
+ "Kill all remote buffers."
+ (interactive)
+
+ ;; Remove all Tramp related buffers.
+ (tramp-cleanup-all-connections)
+
+ ;; Remove all buffers with a remote default-directory.
+ (dolist (name (tramp-list-remote-buffers))
+ (when (bufferp (get-buffer name)) (kill-buffer name))))
+
+(provide 'tramp-cmds)
+
+;;; TODO:
+
+;; * Clean up unused *tramp/foo* buffers after a while. (Pete Forman)
+;; * WIBNI there was an interactive command prompting for tramp
+;; method, hostname, username and filename and translates the user
+;; input into the correct filename syntax (depending on the Emacs
+;; flavor) (Reiner Steib)
+;; * Let the user edit the connection properties interactively.
+;; Something like `gnus-server-edit-server' in Gnus' *Server* buffer.
+;; * It's just that when I come to Customize `tramp-default-user-alist'
+;; I'm presented with a mismatch and raw lisp for a value. It is my
+;; understanding that a variable declared with defcustom is a User
+;; Option and should not be modified by the code. add-to-list is
+;; called in several places. One way to handle that is to have a new
+;; ordinary variable that gets its initial value from
+;; tramp-default-user-alist and then is added to. (Pete Forman)
+
+;;; tramp-cmds.el ends here
diff --git a/lisp/net/tramp-gw.el b/lisp/net/tramp-gw.el
index 70a37f384fe..fa2e9ba68b0 100644
--- a/lisp/net/tramp-gw.el
+++ b/lisp/net/tramp-gw.el
@@ -284,12 +284,11 @@ PROXY is an indication whether we need a Proxy-Authorization header
or an Authorization header. If PW-CACHE is non-nil, check for
password in password cache. This is done for the first try only."
- ;; `tramp-current-*' must be set for `tramp-read-passwd' and
- ;; `tramp-clear-passwd'.
+ ;; `tramp-current-*' must be set for `tramp-read-passwd'.
(let ((tramp-current-method (tramp-file-name-method tramp-gw-gw-vector))
(tramp-current-user (tramp-file-name-user tramp-gw-gw-vector))
(tramp-current-host (tramp-file-name-host tramp-gw-gw-vector)))
- (unless pw-cache (tramp-clear-passwd))
+ (unless pw-cache (tramp-clear-passwd tramp-gw-gw-vector))
;; We are already in the right buffer.
(tramp-message
tramp-gw-vector 5 "%s required"
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 0af9c457995..10c2043b204 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -115,41 +115,34 @@
;; The following Tramp packages must be loaded after Tramp, because
;; they require Tramp as well.
(eval-after-load "tramp"
- '(progn
+ '(dolist
+ (feature
+ (list
+
+ ;; Tramp commands.
+ 'tramp-cmds
+
+ ;; Load foreign FTP method.
+ (if (featurep 'xemacs) 'tramp-efs 'tramp-ftp)
+
+ ;; tramp-smb uses "smbclient" from Samba. Not available
+ ;; under Cygwin and Windows, because they don't offer
+ ;; "smbclient". And even not necessary there, because Emacs
+ ;; supports UNC file names like "//host/share/localname".
+ (unless (memq system-type '(cygwin windows-nt)) 'tramp-smb)
+
+ ;; Load foreign FISH method.
+ 'tramp-fish
- ;; Load foreign FTP method.
- (let ((feature (if (featurep 'xemacs) 'tramp-efs 'tramp-ftp)))
+ ;; Load gateways. It needs `make-network-process' from Emacs 22.
+ (when (functionp 'make-network-process) 'tramp-gw)))
+
+ (when feature
(require feature)
(add-hook 'tramp-unload-hook
`(lambda ()
(when (featurep ,feature)
- (unload-feature ,feature 'force)))))
-
- ;; tramp-smb uses "smbclient" from Samba. Not available under
- ;; Cygwin and Windows, because they don't offer "smbclient". And
- ;; even not necessary there, because Emacs supports UNC file names
- ;; like "//host/share/localname".
- (unless (memq system-type '(cygwin windows-nt))
- (require 'tramp-smb)
- (add-hook 'tramp-unload-hook
- '(lambda ()
- (when (featurep 'tramp-smb)
- (unload-feature 'tramp-smb 'force)))))
-
- ;; Load foreign FISH method.
- (require 'tramp-fish)
- (add-hook 'tramp-unload-hook
- '(lambda ()
- (when (featurep 'tramp-fish)
- (unload-feature 'tramp-fish 'force))))
-
- ;; Load gateways. It needs `make-network-process' from Emacs 22.
- (when (functionp 'make-network-process)
- (require 'tramp-gw)
- (add-hook 'tramp-unload-hook
- '(lambda ()
- (when (featurep 'tramp-gw)
- (unload-feature 'tramp-gw 'force)))))))
+ (unload-feature ,feature 'force)))))))
;;; User Customizable Internal Variables:
@@ -1965,42 +1958,30 @@ The intent is to protect against `obsolete variable' warnings."
(put 'tramp-let-maybe 'lisp-indent-function 2)
(put 'tramp-let-maybe 'edebug-form-spec t)
-(defsubst tramp-make-tramp-temp-file (vec &optional dont-create)
+(defsubst tramp-make-tramp-temp-file (vec)
"Create a temporary file on the remote host identified by VEC.
-Return the local name of the temporary file.
-If DONT-CREATE is non-nil, just the file name is returned without
-creation of the temporary file. This is not the preferred way to run,
-but it is necessary during connection setup, because we cannot create
-a remote file at this time. This parameter shall NOT be set to
-non-nil else."
- (if dont-create
- ;; It sounds a little bit stupid to create a LOCAL file name.
- ;; But we intend to use the remote directory "/tmp", and we have
- ;; no chance to check whether a temporary file exists already
- ;; remotely, because we have no working connection yet.
- (make-temp-name (expand-file-name tramp-temp-name-prefix "/tmp"))
-
- (let ((prefix
- (tramp-make-tramp-file-name
- (tramp-file-name-method vec)
- (tramp-file-name-user vec)
- (tramp-file-name-host vec)
- (expand-file-name tramp-temp-name-prefix "/tmp")))
- result)
- (while (not result)
- ;; `make-temp-file' would be the first choice for
- ;; implementation. But it calls `write-region' internally,
- ;; which also needs a temporary file - we would end in an
- ;; infinite loop.
- (setq result (make-temp-name prefix))
- (if (file-exists-p result)
- (setq result nil)
- ;; This creates the file by side effect.
- (set-file-times result)
- (set-file-modes result (tramp-octal-to-decimal "0700"))))
-
- ;; Return the local part.
- (with-parsed-tramp-file-name result nil localname))))
+Return the local name of the temporary file."
+ (let ((prefix
+ (tramp-make-tramp-file-name
+ (tramp-file-name-method vec)
+ (tramp-file-name-user vec)
+ (tramp-file-name-host vec)
+ (expand-file-name tramp-temp-name-prefix "/tmp")))
+ result)
+ (while (not result)
+ ;; `make-temp-file' would be the natural choice for
+ ;; implementation. But it calls `write-region' internally,
+ ;; which also needs a temporary file - we would end in an
+ ;; infinite loop.
+ (setq result (make-temp-name prefix))
+ (if (file-exists-p result)
+ (setq result nil)
+ ;; This creates the file by side effect.
+ (set-file-times result)
+ (set-file-modes result (tramp-octal-to-decimal "0700"))))
+
+ ;; Return the local part.
+ (with-parsed-tramp-file-name result nil localname)))
;;; Config Manipulation Functions:
@@ -2824,7 +2805,7 @@ and gid of the corresponding user is taken. Both parameters must be integers."
(defun tramp-handle-file-name-all-completions (filename directory)
"Like `file-name-all-completions' for Tramp files."
(unless (save-match-data (string-match "/" filename))
- (with-parsed-tramp-file-name directory nil
+ (with-parsed-tramp-file-name (expand-file-name directory) nil
(all-completions
filename
(mapcar
@@ -3114,7 +3095,9 @@ the uid and gid from FILENAME."
(cond
;; We can do it directly.
((and (file-readable-p localname1)
- (file-writable-p (file-name-directory localname2)))
+ (file-writable-p (file-name-directory localname2))
+ (or (file-directory-p localname2)
+ (file-writable-p localname2)))
(if (eq op 'copy)
(tramp-compat-copy-file
localname1 localname2 ok-if-already-exists
@@ -3209,7 +3192,8 @@ be a local filename. The method used must be an out-of-band method."
;; Compose copy command.
(setq spec `((?h . ,host) (?u . ,user) (?p . ,port)
- (?t . ,(tramp-make-tramp-temp-file v 'dont-create))
+ (?t . ,(tramp-get-connection-property
+ (tramp-get-connection-process v) "temp-file" ""))
(?k . ,(if keep-date " " "")))
copy-program (tramp-get-method-parameter
method 'tramp-copy-program)
@@ -3224,8 +3208,7 @@ be a local filename. The method used must be an out-of-band method."
;; " " is indication for keep-date argument.
x (delete " " (mapcar '(lambda (y) (format-spec y spec)) x)))
(unless (member "" x) (mapconcat 'identity x " ")))
- (tramp-get-method-parameter
- method 'tramp-copy-args))))
+ (tramp-get-method-parameter method 'tramp-copy-args))))
;; Check for program.
(when (and (fboundp 'executable-find)
@@ -3293,7 +3276,7 @@ be a local filename. The method used must be an out-of-band method."
(save-excursion
(tramp-barf-unless-okay
v
- (format " %s %s"
+ (format "%s %s"
(if parents "mkdir -p" "mkdir")
(tramp-shell-quote-argument localname))
"Couldn't make directory %s" dir))))
@@ -3305,7 +3288,7 @@ be a local filename. The method used must be an out-of-band method."
(tramp-flush-directory-property v localname)
(unless (zerop (tramp-send-command-and-check
v
- (format "rmdir %s"
+ (format "rmdir -f %s"
(tramp-shell-quote-argument localname))))
(tramp-error v 'file-error "Couldn't delete %s" directory))))
@@ -3336,7 +3319,7 @@ This is like `dired-recursive-delete-directory' for Tramp files."
;; Which is better, -r or -R? (-r works for me <daniel@danann.net>)
(tramp-send-command
v
- (format "rm -r %s" (tramp-shell-quote-argument localname))
+ (format "rm -rf %s" (tramp-shell-quote-argument localname))
;; Don't read the output, do it explicitely.
nil t)
;; Wait for the remote system to return to us...
@@ -3896,8 +3879,9 @@ beginning of local filename are not substituted."
(setq buffer-file-name filename)
(set-visited-file-modtime)
(set-buffer-modified-p nil))
- (tramp-error
- v 'file-error "File %s not found on remote host" filename)
+ ;; We don't raise a Tramp error, because it might be
+ ;; suppressed, like in `find-file-noselect-1'.
+ (signal 'file-error (list "File not found on remote host" filename))
(list (expand-file-name filename) 0))
(if (and (tramp-local-host-p v)
@@ -4065,166 +4049,177 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
(unless (y-or-n-p (format "File %s exists; overwrite anyway? " filename))
(tramp-error v 'file-error "File not overwritten")))
- (if (and (tramp-local-host-p v)
- (file-writable-p (file-name-directory localname)))
- ;; Short track: if we are on the local host, we can run directly.
- (if confirm
- (write-region
- start end localname append 'no-message lockname confirm)
- (write-region start end localname append 'no-message lockname))
-
- (let ((rem-dec (tramp-get-remote-coding v "remote-decoding"))
- (loc-enc (tramp-get-local-coding v "local-encoding"))
- (modes (save-excursion (file-modes filename)))
- ;; We use this to save the value of `last-coding-system-used'
- ;; after writing the tmp file. At the end of the function,
- ;; we set `last-coding-system-used' to this saved value.
- ;; This way, any intermediary coding systems used while
- ;; talking to the remote shell or suchlike won't hose this
- ;; variable. This approach was snarfed from ange-ftp.el.
- coding-system-used
- ;; Write region into a tmp file. This isn't really needed if we
- ;; use an encoding function, but currently we use it always
- ;; because this makes the logic simpler.
- (tmpfile (tramp-compat-make-temp-file filename)))
-
- ;; We say `no-message' here because we don't want the visited file
- ;; modtime data to be clobbered from the temp file. We call
- ;; `set-visited-file-modtime' ourselves later on.
- (tramp-run-real-handler
- 'write-region
- (if confirm ; don't pass this arg unless defined for backward compat.
- (list start end tmpfile append 'no-message lockname confirm)
- (list start end tmpfile append 'no-message lockname)))
- ;; Now, `last-coding-system-used' has the right value. Remember it.
- (when (boundp 'last-coding-system-used)
- (setq coding-system-used (symbol-value 'last-coding-system-used)))
- ;; The permissions of the temporary file should be set. If
- ;; filename does not exist (eq modes nil) it has been renamed to
- ;; the backup file. This case `save-buffer' handles
- ;; permissions.
- (when modes (set-file-modes tmpfile modes))
-
- ;; This is a bit lengthy due to the different methods possible for
- ;; file transfer. First, we check whether the method uses an rcp
- ;; program. If so, we call it. Otherwise, both encoding and
- ;; decoding command must be specified. However, if the method
- ;; _also_ specifies an encoding function, then that is used for
- ;; encoding the contents of the tmp file.
- (cond
- ;; `rename-file' handles direct copy and out-of-band methods.
- ((or (tramp-local-host-p v)
- (and (tramp-method-out-of-band-p v)
- (integerp start)
- (> (- end start) tramp-copy-size-limit)))
- (rename-file tmpfile filename t))
-
- ;; Use inline file transfer
- (rem-dec
- ;; Encode tmpfile
- (tramp-message v 5 "Encoding region...")
- (unwind-protect
- (with-temp-buffer
- ;; Use encoding function or command.
- (if (and (symbolp loc-enc) (fboundp loc-enc))
- (progn
- (tramp-message
- v 5 "Encoding region using function `%s'..."
- (symbol-name loc-enc))
- (let ((coding-system-for-read 'binary))
- (insert-file-contents-literally tmpfile))
- ;; CCC. The following `let' is a workaround for
- ;; the base64.el that comes with pgnus-0.84. If
- ;; both of the following conditions are
- ;; satisfied, it tries to write to a local file
- ;; in default-directory, but at this point,
- ;; default-directory is remote.
- ;; (CALL-PROCESS-REGION can't write to remote
- ;; files, it seems.) The file in question is a
- ;; tmp file anyway.
- (let ((default-directory
- (tramp-compat-temporary-file-directory)))
- (funcall loc-enc (point-min) (point-max))))
+ (let ((uid (or (nth 2 (file-attributes filename 'integer))
+ (tramp-get-remote-uid v 'integer)))
+ (gid (or (nth 3 (file-attributes filename 'integer))
+ (tramp-get-remote-gid v 'integer))))
+
+ (if (and (tramp-local-host-p v)
+ (file-writable-p (file-name-directory localname))
+ (or (file-directory-p localname)
+ (file-writable-p localname)))
+ ;; Short track: if we are on the local host, we can run directly.
+ (write-region start end localname append 'no-message lockname confirm)
+
+ (let ((rem-dec (tramp-get-remote-coding v "remote-decoding"))
+ (loc-enc (tramp-get-local-coding v "local-encoding"))
+ (modes (save-excursion (file-modes filename)))
+ ;; We use this to save the value of
+ ;; `last-coding-system-used' after writing the tmp file.
+ ;; At the end of the function, we set
+ ;; `last-coding-system-used' to this saved value. This
+ ;; way, any intermediary coding systems used while
+ ;; talking to the remote shell or suchlike won't hose
+ ;; this variable. This approach was snarfed from
+ ;; ange-ftp.el.
+ coding-system-used
+ ;; Write region into a tmp file. This isn't really
+ ;; needed if we use an encoding function, but currently
+ ;; we use it always because this makes the logic
+ ;; simpler.
+ (tmpfile (tramp-compat-make-temp-file filename)))
+
+ ;; We say `no-message' here because we don't want the
+ ;; visited file modtime data to be clobbered from the temp
+ ;; file. We call `set-visited-file-modtime' ourselves later
+ ;; on.
+ (tramp-run-real-handler
+ 'write-region
+ (list start end tmpfile append 'no-message lockname confirm))
+ ;; Now, `last-coding-system-used' has the right value. Remember it.
+ (when (boundp 'last-coding-system-used)
+ (setq coding-system-used (symbol-value 'last-coding-system-used)))
+ ;; The permissions of the temporary file should be set. If
+ ;; filename does not exist (eq modes nil) it has been
+ ;; renamed to the backup file. This case `save-buffer'
+ ;; handles permissions.
+ (when modes (set-file-modes tmpfile modes))
+
+ ;; This is a bit lengthy due to the different methods
+ ;; possible for file transfer. First, we check whether the
+ ;; method uses an rcp program. If so, we call it.
+ ;; Otherwise, both encoding and decoding command must be
+ ;; specified. However, if the method _also_ specifies an
+ ;; encoding function, then that is used for encoding the
+ ;; contents of the tmp file.
+ (cond
+ ;; `rename-file' handles direct copy and out-of-band methods.
+ ((or (tramp-local-host-p v)
+ (and (tramp-method-out-of-band-p v)
+ (integerp start)
+ (> (- end start) tramp-copy-size-limit)))
+ (rename-file tmpfile filename t))
+
+ ;; Use inline file transfer
+ (rem-dec
+ ;; Encode tmpfile
+ (tramp-message v 5 "Encoding region...")
+ (unwind-protect
+ (with-temp-buffer
+ ;; Use encoding function or command.
+ (if (and (symbolp loc-enc) (fboundp loc-enc))
+ (progn
+ (tramp-message
+ v 5 "Encoding region using function `%s'..."
+ (symbol-name loc-enc))
+ (let ((coding-system-for-read 'binary))
+ (insert-file-contents-literally tmpfile))
+ ;; CCC. The following `let' is a workaround
+ ;; for the base64.el that comes with
+ ;; pgnus-0.84. If both of the following
+ ;; conditions are satisfied, it tries to write
+ ;; to a local file in default-directory, but
+ ;; at this point, default-directory is remote.
+ ;; (CALL-PROCESS-REGION can't write to remote
+ ;; files, it seems.) The file in question is
+ ;; a tmp file anyway.
+ (let ((default-directory
+ (tramp-compat-temporary-file-directory)))
+ (funcall loc-enc (point-min) (point-max))))
+ (tramp-message
+ v 5 "Encoding region using command `%s'..." loc-enc)
+ (unless (equal 0 (tramp-call-local-coding-command
+ loc-enc tmpfile t))
+ (tramp-error
+ v 'file-error
+ "Cannot write to `%s', local encoding command `%s' failed"
+ filename loc-enc)))
+
+ ;; Send buffer into remote decoding command which
+ ;; writes to remote file. Because this happens on
+ ;; the remote host, we cannot use the function.
+ (goto-char (point-max))
+ (unless (bolp) (newline))
(tramp-message
- v 5 "Encoding region using command `%s'..." loc-enc)
- (unless (equal 0 (tramp-call-local-coding-command
- loc-enc tmpfile t))
- (tramp-error
- v 'file-error
- "Cannot write to `%s', local encoding command `%s' failed"
- filename loc-enc)))
-
- ;; Send buffer into remote decoding command which
- ;; writes to remote file. Because this happens on the
- ;; remote host, we cannot use the function.
- (goto-char (point-max))
- (unless (bolp) (newline))
- (tramp-message
- v 5 "Decoding region into remote file %s..." filename)
- (tramp-send-command
- v
- (format
- "%s >%s <<'EOF'\n%sEOF"
- rem-dec
- (tramp-shell-quote-argument localname)
- (buffer-string)))
- (tramp-barf-unless-okay
- v nil
- "Couldn't write region to `%s', decode using `%s' failed"
- filename rem-dec)
- ;; When `file-precious-flag' is set, the region is
- ;; written to a temporary file. Check that the
- ;; checksum is equal to that from the local tmpfile.
- (when file-precious-flag
- (erase-buffer)
- (and
- ;; cksum runs locally
- (let ((default-directory
- (tramp-compat-temporary-file-directory)))
- (zerop (call-process "cksum" tmpfile t)))
- ;; cksum runs remotely
- (zerop
- (tramp-send-command-and-check
- v
- (format "cksum <%s" (tramp-shell-quote-argument localname))))
- ;; ... they are different
- (not
- (string-equal
- (buffer-string)
- (with-current-buffer (tramp-get-buffer v) (buffer-string))))
- (tramp-error
- v 'file-error
- (concat "Couldn't write region to `%s',"
- " decode using `%s' failed")
- filename rem-dec)))
- (tramp-message
- v 5 "Decoding region into remote file %s...done" filename)
- (tramp-flush-file-property v localname))
+ v 5 "Decoding region into remote file %s..." filename)
+ (tramp-send-command
+ v
+ (format
+ "%s >%s <<'EOF'\n%sEOF"
+ rem-dec
+ (tramp-shell-quote-argument localname)
+ (buffer-string)))
+ (tramp-barf-unless-okay
+ v nil
+ "Couldn't write region to `%s', decode using `%s' failed"
+ filename rem-dec)
+ ;; When `file-precious-flag' is set, the region is
+ ;; written to a temporary file. Check that the
+ ;; checksum is equal to that from the local tmpfile.
+ (when file-precious-flag
+ (erase-buffer)
+ (and
+ ;; cksum runs locally
+ (let ((default-directory
+ (tramp-compat-temporary-file-directory)))
+ (zerop (call-process "cksum" tmpfile t)))
+ ;; cksum runs remotely
+ (zerop
+ (tramp-send-command-and-check
+ v
+ (format
+ "cksum <%s" (tramp-shell-quote-argument localname))))
+ ;; ... they are different
+ (not
+ (string-equal
+ (buffer-string)
+ (with-current-buffer (tramp-get-buffer v)
+ (buffer-string))))
+ (tramp-error
+ v 'file-error
+ (concat "Couldn't write region to `%s',"
+ " decode using `%s' failed")
+ filename rem-dec)))
+ (tramp-message
+ v 5 "Decoding region into remote file %s...done" filename)
+ (tramp-flush-file-property v localname))
- ;; Save exit.
- (delete-file tmpfile)))
+ ;; Save exit.
+ (delete-file tmpfile)))
- ;; That's not expected.
- (t
- (tramp-error
- v 'file-error
- (concat "Method `%s' should specify both encoding and "
- "decoding command or an rcp program")
- method)))
+ ;; That's not expected.
+ (t
+ (tramp-error
+ v 'file-error
+ (concat "Method `%s' should specify both encoding and "
+ "decoding command or an rcp program")
+ method)))
- ;; Make `last-coding-system-used' have the right value.
- (when coding-system-used
- (set 'last-coding-system-used coding-system-used)))
+ ;; Make `last-coding-system-used' have the right value.
+ (when coding-system-used
+ (set 'last-coding-system-used coding-system-used))))
;; Set file modification time.
(when (or (eq visit t) (stringp visit))
(set-visited-file-modtime
- ;; We must pass modtime explicitely, because filename can be different
- ;; from (buffer-file-name), f.e. if `file-precious-flag' is set.
+ ;; We must pass modtime explicitely, because filename can
+ ;; be different from (buffer-file-name), f.e. if
+ ;; `file-precious-flag' is set.
(nth 5 (file-attributes filename))))
+
;; Set the ownership.
- (tramp-set-file-uid-gid filename)
+ (tramp-set-file-uid-gid filename uid gid)
(when (or (eq visit t) (null visit) (stringp visit))
(tramp-message v 0 "Wrote %s" filename))
(run-hooks 'tramp-handle-write-region-hook))))
@@ -4559,8 +4554,7 @@ Falls back to normal file name handler if no tramp file name handler exists."
(insert "\")")
(goto-char (point-min))
(mapcar
- (function (lambda (x)
- (tramp-make-tramp-file-name method user host x)))
+ (lambda (x) (tramp-make-tramp-file-name method user host x))
(read (current-buffer)))))))
(list (expand-file-name name))))))
@@ -5542,7 +5536,7 @@ The terminal type can be configured with `tramp-terminal-type'."
(with-current-buffer (tramp-get-connection-buffer vec)
(tramp-message vec 6 "\n%s" (buffer-string)))
(unless (eq exit 'ok)
- (tramp-clear-passwd)
+ (tramp-clear-passwd vec)
(tramp-error-with-buffer
nil vec 'file-error
(cond
@@ -6158,6 +6152,18 @@ connection if a previous connection has died for some reason."
(g-user (and gw (tramp-file-name-user gw)))
(g-host (and gw (tramp-file-name-host gw)))
(command login-program)
+ ;; We don't create the temporary file. In fact, it
+ ;; is just a prefix for the ControlPath option of
+ ;; ssh; the real temporary file has another name, and
+ ;; it is created and protected by ssh. It is also
+ ;; removed by ssh, when the connection is closed.
+ (tmpfile
+ (tramp-set-connection-property
+ p "temp-file"
+ (make-temp-name
+ (expand-file-name
+ tramp-temp-name-prefix
+ (tramp-compat-temporary-file-directory)))))
spec)
;; Add gateway arguments if necessary.
@@ -6182,7 +6188,7 @@ connection if a previous connection has died for some reason."
l-user (or l-user "")
l-port (or l-port "")
spec `((?h . ,l-host) (?u . ,l-user) (?p . ,l-port)
- (?t . ,(tramp-make-tramp-temp-file vec 'dont-create)))
+ (?t . ,tmpfile))
command
(concat
command " "
@@ -7043,17 +7049,16 @@ Invokes `password-read' if available, `read-passwd' else."
password)
(read-passwd pw-prompt))))
-(defun tramp-clear-passwd ()
- "Clear password cache for connection related to current-buffer.
-If METHOD, USER or HOST is given, take then for computing the key."
- (interactive)
+(defun tramp-clear-passwd (vec)
+ "Clear password cache for connection related to VEC."
(when (functionp 'password-cache-remove)
- (funcall (symbol-function 'password-cache-remove)
- (tramp-make-tramp-file-name
- tramp-current-method
- tramp-current-user
- tramp-current-host
- ""))))
+ (funcall
+ (symbol-function 'password-cache-remove)
+ (tramp-make-tramp-file-name
+ (tramp-file-name-method vec)
+ (tramp-file-name-user vec)
+ (tramp-file-name-host vec)
+ ""))))
;; Snarfed code from time-date.el and parse-time.el
@@ -7410,13 +7415,9 @@ Used for non-7bit chars in strings."
(boundp 'mml-mode)
(symbol-value 'mml-mode))
- (let* ((tramp-buf-regexp "\\*\\(debug \\)?tramp/")
- (buffer-list
- (delq nil
- (mapcar '(lambda (b)
- (when (string-match tramp-buf-regexp (buffer-name b)) b))
- (buffer-list))))
- (curbuf (current-buffer)))
+ (let ((tramp-buf-regexp "\\*\\(debug \\)?tramp/")
+ (buffer-list (funcall (symbol-function 'tramp-list-tramp-buffers)))
+ (curbuf (current-buffer)))
;; There is at least one Tramp buffer.
(when buffer-list
@@ -7465,8 +7466,8 @@ please ensure that the buffers are attached to your email.\n\n")
(dolist (buffer buffer-list)
(funcall (symbol-function 'mml-insert-empty-tag)
'part 'type "text/plain" 'encoding "base64"
- 'disposition "attachment" 'buffer (buffer-name buffer)
- 'description (buffer-name buffer)))
+ 'disposition "attachment" 'buffer buffer
+ 'description buffer))
(set-buffer-modified-p nil))
;; Don't send. Delete the message buffer.
@@ -7516,20 +7517,6 @@ please ensure that the buffers are attached to your email.\n\n")
;; around one of the loops that calls accept-process-output)
;; (Stefan Monnier).
;; * Autodetect if remote `ls' groks the "--dired" switch.
-;; * Add fallback for inline encodings. This should be used
-;; if the remote end doesn't support mimencode or a similar program.
-;; For reading files from the remote host, we can just parse the output
-;; of `od -b'. For writing files to the remote host, we construct
-;; a shell program which contains only "safe" ascii characters
-;; and which writes the right bytes to the file. We can use printf(1)
-;; or "echo -e" or the printf function in awk and use octal escapes
-;; for the "dangerous" characters. The null byte might be a problem.
-;; On some systems, the octal escape doesn't work. So we try the following
-;; two commands to write a null byte:
-;; dd if=/dev/zero bs=1 count=1
-;; echo | tr '\n' '\000'
-;; * Cooperate with PCL-CVS. It uses start-process, which doesn't
-;; work for remote files.
;; * Rewrite `tramp-shell-quote-argument' to abstain from using
;; `shell-quote-argument'.
;; * Completion gets confused when you leave out the method name.
@@ -7565,7 +7552,6 @@ please ensure that the buffers are attached to your email.\n\n")
;; (Francesco Potort́)
;; * Make it work for different encodings, and for different file name
;; encodings, too. (Daniel Pittman)
-;; * Clean up unused *tramp/foo* buffers after a while. (Pete Forman)
;; * Progress reports while copying files. (Michael Kifer)
;; * Don't search for perl5 and perl. Instead, only search for perl and
;; then look if it's the right version (with `perl -v').
@@ -7600,21 +7586,8 @@ please ensure that the buffers are attached to your email.\n\n")
;; something. (David Kastrup)
;; * Could Tramp reasonably look for a prompt after ^M rather than
;; only after ^J ? (Stefan Monnier)
-;; * WIBNI there was an interactive command prompting for tramp
-;; method, hostname, username and filename and translates the user
-;; input into the correct filename syntax (depending on the Emacs
-;; flavor) (Reiner Steib)
-;; * Let the user edit the connection properties interactively.
-;; Something like `gnus-server-edit-server' in Gnus' *Server* buffer.
;; * Reconnect directly to a compliant shell without first going
;; through the user's default shell. (Pete Forman)
-;; * It's just that when I come to Customize `tramp-default-user-alist'
-;; I'm presented with a mismatch and raw lisp for a value. It is my
-;; understanding that a variable declared with defcustom is a User
-;; Option and should not be modified by the code. add-to-list is
-;; called in several places. One way to handle that is to have a new
-;; ordinary variable that gets its initial value from
-;; tramp-default-user-alist and then is added to. (Pete Forman)
;; * Make `tramp-default-user' obsolete.
;; Functions for file-name-handler-alist:
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index a83d81966a8..58ae73d8cd3 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -30,14 +30,14 @@
;; "autoconf && ./configure" to change them. (X)Emacs version check is defined
;; in macro AC_EMACS_INFO of aclocal.m4; should be changed only there.
-(defconst tramp-version "2.1.11"
+(defconst tramp-version "2.1.12-pre"
"This version of Tramp.")
(defconst tramp-bug-report-address "tramp-devel@gnu.org"
"Email address to send bug reports to.")
;; Check for (X)Emacs version.
-(let ((x (if (or (< emacs-major-version 21) (and (featurep 'xemacs) (< emacs-minor-version 4))) (format "Tramp 2.1.11 is not fit for %s" (when (string-match "^.*$" (emacs-version)) (match-string 0 (emacs-version)))) "ok")))
+(let ((x (if (or (< emacs-major-version 21) (and (featurep 'xemacs) (< emacs-minor-version 4))) (format "Tramp 2.1.12-pre is not fit for %s" (when (string-match "^.*$" (emacs-version)) (match-string 0 (emacs-version)))) "ok")))
(unless (string-match "\\`ok\\'" x) (error x)))
(provide 'trampver)