[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: tramp (2.0.48); tramp doesn't work with FreeBSD

From: Michael Albinus
Subject: Re: tramp (2.0.48); tramp doesn't work with FreeBSD
Date: Sat, 16 Apr 2005 16:39:53 +0200
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

Michael Kifer <address@hidden> writes:

> Tramp hangs when visiting directories on a remote FreeBSD machine from a Linux
> machinr. The hangup occurs when Tramp is trying to send tramp_file_attributes:
>     tramp: Setting shell prompt
>     tramp: Remote `/bin/sh' groks tilde expansion, good
>     tramp: Finding command to check if file exists
>     tramp: Finding a suitable `ls' command
>     tramp: Checking remote `/bin/ls' command for `-n' option
>     tramp: Testing remote command `/bin/ls' for -n...okay
>     tramp: Using remote command `/bin/ls' for getting directory listings
>     tramp: Finding true name for `/'
>     tramp: Check /home
>     tramp: file attributes with perl: /
>     tramp: Sending the Perl script `tramp_file_attributes'...
> The same works when tramping to another Linux or Solaris.

After debugging on your machine, I've found the following evidences:

- FreeBSD has a bug in process communication. This is known to Emacs,
  see comment "gross hack" in process.c, function send_process. Emacs
  makes a workaround if it detects this situation, but only if FreeBSD
  is running on the machine Emacs has been compiled.

- Tramp sets tramp-chunksize if it detects hosts with such a buggy
  process communication. Up to now, it has checked the _local_ host
  only. You're running Linux, which is regarded clean.

I've made a patch in tramp.el which checks the _remote_ host,
too. With this patch, I could access your FreeBSD machine via Tramp
without any problem. The patch is appended if you want to test it.

> Moreover, I have another, older copy of Emacs with an earlier Tramp:
>     Emacs  : GNU Emacs (i686-pc-linux-gnu, X toolkit)
>     of 2004-08-04 on
>     Package: tramp (2.0.39)
> and tramp does work when visiting files on the same FreeBSD machine.
> The setup is the same in both cases, and the tests were run 1 min
> apart.

Hmm, this sounds like a contradiction to my saying above. But maybe
there has been a change of the send_process bug fix in Emacs as well?

> Hope this can be fixed soon.
> Thanks
> michael

Thanks for all your support, and best regards, Michael.

Index: tramp.el
RCS file: /cvsroot/tramp/tramp/lisp/tramp.el,v
retrieving revision 2.359.2.31
diff -u -r2.359.2.31 tramp.el
--- tramp.el    27 Feb 2005 14:28:50 -0000      2.359.2.31
+++ tramp.el    16 Apr 2005 14:38:35 -0000
@@ -1352,7 +1352,9 @@
 ;; Chunked sending kluge.  We set this to 500 for black-listed constellations
 ;; known to have a bug in `process-send-string'; some ssh connections appear
-;; to drop bytes when data is sent too quickly.
+;; to drop bytes when data is sent too quickly.  There is also a connection
+;; buffer local variable, which is computed depending on remote host properties
+;; when `tramp-chunksize' is zero or nil.
 (defcustom tramp-chunksize
   (when (and (not (featurep 'xemacs))
             (memq system-type '(hpux)))
@@ -3561,7 +3563,13 @@
            (unless asynchronous
          (unless asynchronous
-           (insert-buffer (tramp-get-buffer multi-method method user host)))
+           ;; We cannot use `insert-buffer' because the tramp buffer
+           ;; changes its contents before insertion due to calling
+           ;; `expand-file' and alike.
+           (insert
+            (with-current-buffer
+                (tramp-get-buffer multi-method method user host)
+              (buffer-string))))
          (when error-buffer
              (unless (bufferp error-buffer)
@@ -3571,7 +3579,11 @@
               "cat /tmp/tramp.$$.err")
              (set-buffer error-buffer)
-             (insert-buffer (tramp-get-buffer multi-method method user host))
+             ;; Same comment as above
+             (insert
+              (with-current-buffer
+                  (tramp-get-buffer multi-method method user host)
+                (buffer-string)))
               multi-method method user host "rm -f /tmp/tramp.$$.err")))
@@ -4834,6 +4846,9 @@
 (defun tramp-set-auto-save ()
   (when (and (buffer-file-name)
              (tramp-tramp-file-p (buffer-file-name))
+            ;; ange-ftp has its own auto-save mechanism
+            (eq (tramp-find-foreign-file-name-handler (buffer-file-name))
+                'tramp-sh-file-name-handler)
     (auto-save-mode 1)))
 (add-hook 'find-file-hooks 'tramp-set-auto-save t)
@@ -5417,7 +5432,7 @@
     (when multi-method
       (error "Cannot multi-connect using telnet connection method"))
-    (tramp-pre-connection multi-method method user host)
+    (tramp-pre-connection multi-method method user host tramp-chunksize)
     (tramp-message 7 "Opening connection for address@hidden using %s..."
                   (or user (user-login-name)) host method)
     (let ((process-environment (copy-sequence process-environment)))
@@ -5475,7 +5490,7 @@
     (when multi-method
       (error "Cannot multi-connect using rsh connection method"))
-    (tramp-pre-connection multi-method method user host)
+    (tramp-pre-connection multi-method method user host tramp-chunksize)
     (if (and user (not (string= user "")))
        (tramp-message 7 "Opening connection for address@hidden using %s..."
                       user host method)
@@ -5544,7 +5559,7 @@
        "Cannot connect to different host `%s' with `su' connection method"
-    (tramp-pre-connection multi-method method user host)
+    (tramp-pre-connection multi-method method user host tramp-chunksize)
     (tramp-message 7 "Opening connection for `%s' using `%s'..."
                   (or user "<root>") method)
     (let ((process-environment (copy-sequence process-environment)))
@@ -5609,7 +5624,7 @@
     (unless (and (= (length method) (length user))
                  (= (length method) (length host)))
       (error "Arrays METHOD, USER, HOST must have equal length"))
-    (tramp-pre-connection multi-method method user host)
+    (tramp-pre-connection multi-method method user host tramp-chunksize)
     (tramp-message 7 "Opening `%s' connection..." multi-method)
     (let ((process-environment (copy-sequence process-environment)))
       (setenv "TERM" tramp-terminal-type)
@@ -5810,7 +5825,7 @@
 ;; HHH: Not Changed.  This might handle the case where USER is not
 ;;      given in the "File name" very poorly.  Then, the local
 ;;      variable tramp-current-user will be set to nil.
-(defun tramp-pre-connection (multi-method method user host)
+(defun tramp-pre-connection (multi-method method user host chunksize)
   "Do some setup before actually logging in.
 METHOD, USER and HOST specify the connection."
   (set-buffer (tramp-get-buffer multi-method method user host))
@@ -5818,6 +5833,7 @@
   (set (make-local-variable 'tramp-current-method) method)
   (set (make-local-variable 'tramp-current-user)   user)
   (set (make-local-variable 'tramp-current-host)   host)
+  (set (make-local-variable 'tramp-chunksize)      chunksize)
   (set (make-local-variable 'inhibit-eol-conversion) nil)
@@ -5869,6 +5885,20 @@
   (tramp-send-command-internal multi-method method user host
                               "TERM=dumb; export TERM")
+  (erase-buffer)
+  ;; Check whether the remote host suffers from buggy `send-process-string'.
+  ;; This is known for FreeBSD (see comment in `send_process', file process.c).
+  ;; I've tested sending 624 bytes successfully, sending 625 bytes failed.
+  ;; Emacs makes a hack when this host type is detected locally.  It cannot
+  ;; handle remote hosts, though.
+  (when (or (not tramp-chunksize) (zerop tramp-chunksize))
+    (tramp-message 9 "Checking remote host type for `send-process-string' bug")
+    (tramp-send-command-internal multi-method method user host
+                                "(uname -sr) 2>/dev/null")
+    (goto-char (point-min))
+    (when (looking-at "FreeBSD")
+      (setq tramp-chunksize 500)))
   ;; Try to set up the coding system correctly.
   ;; CCC this can't be the right way to do it.  Hm.
@@ -7226,7 +7256,6 @@
-        tramp-out-of-band-prompt-regexp
@@ -7286,31 +7315,44 @@
 (defun tramp-append-tramp-buffers ()
   "Append Tramp buffers into the bug report."
-  ;; We load mml.el from Gnus.
+  ;; We load message.el and mml.el from Gnus.
   (if (featurep 'xemacs)
-      (load "mml" 'noerror)
+      (progn
+       (load "message" 'noerror)
+       (load "mml" 'noerror))
+    (require 'message nil 'noerror)
     (require 'mml nil 'noerror))
+  (when (functionp 'message-mode)
+    (funcall 'message-mode))
+  (when (functionp 'mml-mode)
+    (funcall 'mml-mode t))
   (when (and
-        ;; We don't want to add another dependency.
-        (functionp 'mml-insert-empty-tag)
-        ;; 2nd parameter since Emacs 22.
-        (condition-case nil
-            (list-buffers-noselect nil nil)
-          (t nil)))
-    (let ((buffer-list
-          (delq nil
-           (mapcar '(lambda (b)
-            (when (string-match "^\\*\\(debug \\)?tramp/" (buffer-name b)) b))
-            (buffer-list))))
-         (curbuf (current-buffer)))
+        (eq major-mode 'message-mode)
+        (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)))
       ;; There is at least one Tramp buffer.
       (when buffer-list
-       (switch-to-buffer (list-buffers-noselect nil buffer-list))
+       (switch-to-buffer (list-buffers-noselect nil))
        (setq buffer-read-only nil)
-       (goto-char (point-max))
+       (goto-char (point-min))
+       (while (not (eobp))
+         (if (re-search-forward tramp-buf-regexp (tramp-point-at-eol) t)
+             (forward-line 1)
+           (forward-line 0)
+           (let ((start (point)))
+             (forward-line 1)
+             (kill-region start (point)))))
        (insert "
 The buffer(s) above will be appended to this message.  If you don't want
 to append a buffer because it contains sensible data, or because the buffer

reply via email to

[Prev in Thread] Current Thread [Next in Thread]