]> code.delx.au - gnu-emacs/commitdiff
Version 2.0.6.
authorKai Großjohann <kgrossjo@eu.uu.net>
Sat, 3 Aug 2002 09:23:25 +0000 (09:23 +0000)
committerKai Großjohann <kgrossjo@eu.uu.net>
Sat, 3 Aug 2002 09:23:25 +0000 (09:23 +0000)
(tramp-default-method): Change to "ssh" from "sm".
(tramp-wrong-passwd-regexp): Restructure.  Add additional
alternative.
(tramp-su-program): New internal variable for method parameter.
(tramp-perl-encode-with-module, tramp-perl-decode-with-module):
New variables.  Very short Perl one-liner, but requires Perl
module MIME::Base64 to be installed on the remote site.
(tramp-perl-encode, tramp-perl-decode): New base64
encoder/decoder.  From Juanma Barranquero <lektu@terra.es>.
(tramp-handle-file-truename): Invoke Ange-FTP properly (even
though Ange-FTP doesn't do anything for this operation).
(tramp-handle-set-visited-file-modtime): Comment change.
(tramp-handle-make-directory): Save-excursion.
(tramp-handle-expand-many-files): Don't try to invoke Ange-FTP
twice, once is enough.
(tramp-action-permission-denied): Show *tramp/foo* buffer so the
user knows what's wrong.
(tramp-post-connection): Support the two Perl encoders and
decoders.
(tramp-coding-commands): Ditto.  Add some todo items.

lisp/ChangeLog
lisp/net/tramp.el

index 8853ba55178fec5b1c2b1b689499325020c1d21e..fd3be9a816681b7272c425cc3ecfa657c831444c 100644 (file)
@@ -1,3 +1,27 @@
+2002-08-03  Kai Gro\e,b_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * net/tramp.el: Version 2.0.6.
+       (tramp-default-method): Change to "ssh" from "sm".
+       (tramp-wrong-passwd-regexp): Restructure.  Add additional
+       alternative.
+       (tramp-su-program): New internal variable for method parameter.
+       (tramp-perl-encode-with-module, tramp-perl-decode-with-module):
+       New variables.  Very short Perl one-liner, but requires Perl
+       module MIME::Base64 to be installed on the remote site.
+       (tramp-perl-encode, tramp-perl-decode): New base64
+       encoder/decoder.  From Juanma Barranquero <lektu@terra.es>.
+       (tramp-handle-file-truename): Invoke Ange-FTP properly (even
+       though Ange-FTP doesn't do anything for this operation).
+       (tramp-handle-set-visited-file-modtime): Comment change.
+       (tramp-handle-make-directory): Save-excursion.
+       (tramp-handle-expand-many-files): Don't try to invoke Ange-FTP
+       twice, once is enough.
+       (tramp-action-permission-denied): Show *tramp/foo* buffer so the
+       user knows what's wrong.
+       (tramp-post-connection): Support the two Perl encoders and
+       decoders.
+       (tramp-coding-commands): Ditto.  Add some todo items.
+
 2002-08-02  Richard M. Stallman  <rms@gnu.org>
 
        * international/mule.el (merge-coding-systems): New function.
index 26141c0aa20dd6b63e67da11089aa21d26e812ab..e6a13a07489fde84f04f806287334af441f5ce58 100644 (file)
 
 ;;; Code:
 
-(defconst tramp-version "2.0.5"
+;; In the Tramp CVS repository, the version numer is auto-frobbed from
+;; the Makefile, so you should edit the top-level Makefile to change
+;; the version number.
+(defconst tramp-version "2.0.6"
   "This version of tramp.")
 
 (defconst tramp-bug-report-address "tramp-devel@mail.freesoftware.fsf.org"
@@ -632,8 +635,7 @@ various functions for details."
   :group 'tramp
   :type '(repeat (list string function string)))
 
-(defcustom tramp-default-method "sm"
-  ;;(if (featurep 'xemacs) "sm" "ftp")
+(defcustom tramp-default-method "ssh"
   "*Default method to use for transferring files.
 See `tramp-methods' for possibilities.
 Also see `tramp-default-method-alist'.
@@ -707,9 +709,22 @@ The `sudo' program appears to insert a `^@' character into the prompt."
   :type 'regexp)
 
 (defcustom tramp-wrong-passwd-regexp
-  (concat "^.*\\(Permission denied.\\|Login [Ii]ncorrect\\|"
-          "Received signal [0-9]+\\|Connection \\(refused\\|closed\\)\\|"
-          "Sorry, try again.\\|Name or service not known\\).*")
+  (concat "^.*"
+         ;; These strings should be on the last line
+         (regexp-opt '("Permission denied."
+                       "Login incorrect"
+                       "Login Incorrect"
+                       "Connection refused"
+                       "Connection closed"
+                       "Sorry, try again."
+                       "Name or service not known"
+                       "Host key verification failed.") t)
+         ".*"
+         "\\|"
+         "^.*\\("
+         ;; Here comes a list of regexes, separated by \\|
+         "Received signal [0-9]+"
+         "\\).*")
   "*Regexp matching a `login failed' message.
 The regexp should match at end of buffer."
   :group 'tramp
@@ -1145,6 +1160,11 @@ method parameter, as specified in `tramp-methods' (which see).")
 In the connection buffer, this variable has the value of the like-named
 method parameter, as specified in `tramp-methods' (which see).")
 
+(defvar tramp-su-program nil
+  "This internal variable holds a parameter for `tramp-methods'.
+In the connection buffer, this variable has the value of the like-named
+method parameter, as specified in `tramp-methods' (which see).")
+
 ;; CCC `local in each buffer'?
 (defvar tramp-ls-command nil
   "This command is used to get a long listing with numeric user and group ids.
@@ -1220,13 +1240,101 @@ on the remote file system.")
 ;; Escape sequence %s is replaced with name of Perl binary.")
 
 ;; These two use base64 encoding.
-(defvar tramp-perl-encode
+(defvar tramp-perl-encode-with-module
   "perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'"
   "Perl program to use for encoding a file.
+Escape sequence %s is replaced with name of Perl binary.
+This implementation requires the MIME::Base64 Perl module to be installed
+on the remote host.")
+
+(defvar tramp-perl-decode-with-module
+  "perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)'"
+  "Perl program to use for decoding a file.
+Escape sequence %s is replaced with name of Perl binary.
+This implementation requires the MIME::Base64 Perl module to be installed
+on the remote host.")
+
+(defvar tramp-perl-encode
+  "%s -e '
+# This script contributed by Juanma Barranquero <lektu@terra.es>.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+use strict;
+
+my %trans = do {
+    my $i = 0;
+    map {(substr(unpack(q(B8), chr $i++), 2, 6), $_)}
+      split //, q(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/);
+};
+
+binmode(\*STDIN);
+
+# We read in chunks of 54 bytes, to generate output lines
+# of 72 chars (plus end of line)
+$/ = \54;
+
+while (my $data = <STDIN>) {
+    my $pad = q();
+
+    # Only for the last chunk, and only if did not fill the last three-byte packet
+    if (eof) {
+        my $mod = length($data) % 3;
+        $pad = q(=) x (3 - $mod) if $mod;
+    }
+
+    # Not the fastest method, but it is simple: unpack to binary string, split
+    # by groups of 6 bits and convert back from binary to byte; then map into
+    # the translation table
+    print
+      join q(),
+        map($trans{$_},
+            (substr(unpack(q(B*), $data) . q(00000), 0, 432) =~ /....../g)),
+              $pad,
+                qq(\n);
+}
+'"
+  "Perl program to use for encoding a file.
 Escape sequence %s is replaced with name of Perl binary.")
 
 (defvar tramp-perl-decode
-  "perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)'"
+  "%s -e '
+# This script contributed by Juanma Barranquero <lektu@terra.es>.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+use strict;
+
+my %trans = do {
+    my $i = 0;
+    map {($_, sprintf(q(%06b), $i++))}
+      split //, q(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)
+};
+
+my %bytes = map {(unpack(q(B8), chr $_), chr $_)} 0 .. 255;
+
+binmode(\*STDOUT);
+
+# We are going to accumulate into $pending to accept any line length
+# (we do not check they are <= 76 chars as the RFC says)
+my $pending = q();
+
+while (my $data = <STDIN>) {
+    chomp $data;
+
+    # If we find one or two =, we have reached the end and
+    # any following data is to be discarded
+    my $finished = $data =~ s/(==?).*/$1/;
+    $pending .= $data;
+
+    my $len = length($pending);
+    my $chunk = substr($pending, 0, $len & ~3, q());
+
+    # Easy method: translate from chars to (pregenerated) six-bit packets, join,
+    # split in 8-bit chunks and convert back to char.
+    print join q(),
+      map $bytes{$_},
+        ((join q(), map {$trans{$_} || q()} split //, $chunk) =~ /......../g);
+
+    last if $finished;
+}
+'"
   "Perl program to use for decoding a file.
 Escape sequence %s is replaced with name of Perl binary.")
 
@@ -1512,10 +1620,11 @@ target of the symlink differ."
 (defun tramp-handle-file-truename (filename &optional counter prev-dirs)
   "Like `file-truename' for tramp files."
   (with-parsed-tramp-file-name filename nil
-    ;; Ange-FTP does not support truename processing.  It returns the
-    ;; file name as-is.  So that's what we do, too.
+    ;; Ange-FTP does not support truename processing, but for
+    ;; convenience we pretend it did and forward the call to Ange-FTP
+    ;; anyway.  Ange-FTP then just invokes `identity'.
     (when (tramp-ange-ftp-file-name-p multi-method method)
-      filename)
+      (tramp-invoke-ange-ftp 'file-truename filename))
     (let* ((steps        (tramp-split-string path "/"))
           (pathdir (let ((directory-sep-char ?/))
                      (file-name-as-directory path)))
@@ -1546,7 +1655,9 @@ target of the symlink differ."
                      (tramp-make-tramp-file-name
                       multi-method method user host
                       (mapconcat 'identity
-                                 (append '("") (reverse result) (list thisstep))
+                                 (append '("")
+                                         (reverse result)
+                                         (list thisstep))
                                  "/")))))
        (cond ((string= "." thisstep)
               (tramp-message-for-buffer multi-method method user host
@@ -1733,7 +1844,11 @@ is initially created and is kept cached by the remote shell."
   (let ((f (buffer-file-name))
        (coding-system-used nil))
     (with-parsed-tramp-file-name f nil
-      ;; This operation is not handled by Ange-FTP!
+      ;; This operation is not handled by Ange-FTP!  Compare this
+      ;; behavior with `file-truename' which Ange-FTP does not really
+      ;; handle, either, but at least it pretends to.  I wonder if
+      ;; Ange-FTP should also pretend to grok
+      ;; `set-visited-file-modtime', for consistency?
       (when (tramp-ange-ftp-file-name-p multi-method method)
        (throw 'tramp-forward-to-ange-ftp
               (tramp-run-real-handler 'set-visited-file-modtime
@@ -2297,13 +2412,14 @@ If KEEP-DATE is non-nil, preserve the time stamp when copying."
   (with-parsed-tramp-file-name dir nil
     (when (tramp-ange-ftp-file-name-p multi-method method)
       (tramp-invoke-ange-ftp 'make-directory dir parents))
-    (tramp-barf-unless-okay
-     multi-method method user host
-     (format " %s %s"
-            (if parents "mkdir -p" "mkdir")
-            (tramp-shell-quote-argument path))
-     nil 'file-error
-     "Couldn't make directory %s" dir)))
+    (save-excursion
+      (tramp-barf-unless-okay
+       multi-method method user host
+       (format " %s %s"
+              (if parents "mkdir -p" "mkdir")
+              (tramp-shell-quote-argument path))
+       nil 'file-error
+       "Couldn't make directory %s" dir))))
 
 ;; CCC error checking?
 (defun tramp-handle-delete-directory (directory)
@@ -3087,11 +3203,7 @@ necessary anymore."
              (string-match "\\?" name)
              (string-match "\\[.*\\]" name))
          (save-excursion
-           ;; Dissect NAME.
            (let (bufstr)
-             ;; Perhaps invoke Ange-FTP.
-             (when (string= method tramp-ftp-method)
-               (signal 'tramp-run-ange-ftp (list 0)))
              ;; CCC: To do it right, we should quote certain characters
              ;; in the file name, but since the echo command is going to
              ;; break anyway when there are spaces in the file names, we
@@ -3485,9 +3597,9 @@ Returns nil if none was found, else the command is returned."
 
 (defun tramp-action-permission-denied (p multi-method method user host)
   "Signal permission denied."
+  (pop-to-buffer (tramp-get-buffer multi-method method user host))
   (tramp-message 9 "Permission denied by remote host.")
   (kill-process p)
-  (erase-buffer)
   (throw 'tramp-action 'permission-denied))
 
 (defun tramp-action-yesno (p multi-method method user host)
@@ -4399,7 +4511,7 @@ locale to C and sets up the remote shell search path."
                 " -e '" tramp-perl-file-attributes "' $1 2>/dev/null\n"
                 "}"))
        (tramp-wait-for-output)
-       (tramp-message 5 "Sending the Perl `mime-encode' implementation.")
+       (tramp-message 5 "Sending the Perl `mime-encode' implementations.")
        (tramp-send-linewise
         multi-method method user host
         (concat "tramp_encode () {\n"
@@ -4407,13 +4519,27 @@ locale to C and sets up the remote shell search path."
                 " 2>/dev/null"
                 "\n}"))
        (tramp-wait-for-output)
-       (tramp-message 5 "Sending the Perl `mime-decode' implementation.")
+       (tramp-send-linewise
+        multi-method method user host
+        (concat "tramp_encode_with_module () {\n"
+                (format tramp-perl-encode-with-module tramp-remote-perl)
+                " 2>/dev/null"
+                "\n}"))
+       (tramp-wait-for-output)
+       (tramp-message 5 "Sending the Perl `mime-decode' implementations.")
        (tramp-send-linewise
         multi-method method user host
         (concat "tramp_decode () {\n"
                 (format tramp-perl-decode tramp-remote-perl)
                 " 2>/dev/null"
                 "\n}"))
+       (tramp-wait-for-output)
+       (tramp-send-linewise
+        multi-method method user host
+        (concat "tramp_decode_with_module () {\n"
+                (format tramp-perl-decode-with-module tramp-remote-perl)
+                " 2>/dev/null"
+                "\n}"))
        (tramp-wait-for-output))))
   ;; Find ln(1)
   (erase-buffer)
@@ -4467,6 +4593,8 @@ locale to C and sets up the remote shell search path."
      nil uudecode-decode-region)
     ("uuencode xxx" "uudecode -p"
      nil uudecode-decode-region)
+    ("tramp_encode_with_module" "tramp_decode_with_module"
+     base64-encode-region base64-decode-region)
     ("tramp_encode" "tramp_decode"
      base64-encode-region base64-decode-region))
   "List of coding commands for inline transfer.
@@ -5537,11 +5665,22 @@ TRAMP.
 
 ;;; TODO:
 
-;; * Revise the comments near the beginning of the file.
+;; * 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'.
+;;   `shell-quote-argument'.
 ;; * Completion gets confused when you leave out the method name.
 ;; * Support `dired-compress-file' filename handler.
 ;; * In Emacs 21, `insert-directory' shows total number of bytes used