[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 Kifer |
Subject: |
Re: tramp (2.0.48); tramp doesn't work with FreeBSD |
Date: |
Sat, 16 Apr 2005 21:10:47 -0400 |
It works - thanks!
--michael
> --=-=-=
>
> 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 `/scpx:ug.cs.sunysb.edu:/home/f/kifer/'
> > tramp: Check /home
> > tramp: file attributes with perl: /scpx:ug.cs.sunysb.edu:/home
> > 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 21.3.50.1 (i686-pc-linux-gnu, X toolkit)
> > of 2004-08-04 on kiferserv.kiferhome.com
> > 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.
>
>
> --=-=-=
> Content-Disposition: inline; filename=tramp.el.diff
>
> 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
> (tramp-wait-for-output)))
> (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
> (save-excursion
> (unless (bufferp error-buffer)
> @@ -3571,7 +3579,11 @@
> "cat /tmp/tramp.$$.err")
> (tramp-wait-for-output)
> (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)))
> (tramp-send-command-and-check
> multi-method method user host "rm -f /tmp/tramp.$$.err")))
> (save-excursion
> @@ -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-default)
> (auto-save-mode 1)))
> (add-hook 'find-file-hooks 'tramp-set-auto-save t)
> @@ -5417,7 +5432,7 @@
> method))
> (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 @@
> (save-match-data
> (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 @@
> (error
> "Cannot connect to different host `%s' with `su' connection method"
> host))
> - (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)
> (erase-buffer))
>
> @@ -5869,6 +5885,20 @@
> (erase-buffer)
> (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.
> (save-excursion
> @@ -7226,7 +7256,6 @@
> tramp-yesno-prompt-regexp
> tramp-yn-prompt-regexp
> tramp-terminal-prompt-regexp
> - tramp-out-of-band-prompt-regexp
> tramp-temp-name-prefix
> tramp-file-name-structure
> tramp-file-name-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))
> (delete-other-windows)
> (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
>
> --=-=-=--
>