From: Michael Albinus Date: Wed, 8 Jul 2009 12:43:42 +0000 (+0000) Subject: * net/tramp.el (tramp-set-file-uid-gid): Handle the case the X-Git-Tag: emacs-pretest-23.1.90~2265 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=93c3eb7c61e2992e80ff14bd98fb68e4e66dca41;p=emacs.git * net/tramp.el (tramp-set-file-uid-gid): Handle the case the remote user is root, on the local host. (tramp-local-host-p): Either the local user or the remote user must be root. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6a2f3ad06e7..b7168fffd3a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2009-07-08 Michael Albinus + + * net/tramp.el (tramp-set-file-uid-gid): Handle the case the + remote user is root, on the local host. + (tramp-local-host-p): Either the local user or the remote user + must be root. (Bug#3771) + 2009-07-08 Nick Roberts * progmodes/gdb-mi.el (gdb): Remove description of diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el index d95430d55d2..444f55ac5d2 100644 --- a/lisp/net/tramp.el +++ b/lisp/net/tramp.el @@ -2709,14 +2709,17 @@ and gid of the corresponding user is taken. Both parameters must be integers." ;; the majority of cases. (if (file-remote-p filename) (with-parsed-tramp-file-name filename nil - (let ((uid (or (and (integerp uid) uid) - (tramp-get-remote-uid v 'integer))) - (gid (or (and (integerp gid) gid) - (tramp-get-remote-gid v 'integer)))) - (tramp-send-command - v (format - "chown %d:%d %s" uid gid - (tramp-shell-quote-argument localname))))) + (if (and (zerop (user-uid)) (tramp-local-host-p v)) + ;; If we are root on the local host, we can do it directly. + (tramp-set-file-uid-gid localname uid gid) + (let ((uid (or (and (integerp uid) uid) + (tramp-get-remote-uid v 'integer))) + (gid (or (and (integerp gid) gid) + (tramp-get-remote-gid v 'integer)))) + (tramp-send-command + v (format + "chown %d:%d %s" uid gid + (tramp-shell-quote-argument localname)))))) ;; We handle also the local part, because there doesn't exist ;; `set-file-uid-gid'. On W32 "chown" might not work. @@ -4395,7 +4398,7 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file." (tramp-get-remote-gid v 'integer)))) (if (and (tramp-local-host-p v) - ;; `file-writable-p' calls 'file-expand-file-name'. We + ;; `file-writable-p' calls `file-expand-file-name'. We ;; cannot use `tramp-run-real-handler' therefore. (let (file-name-handler-alist) (and @@ -4403,10 +4406,10 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file." (or (file-directory-p localname) (file-writable-p localname))))) ;; Short track: if we are on the local host, we can run directly. - (prog1 - (tramp-run-real-handler - 'write-region - (list start end localname append 'no-message lockname confirm)) + (progn + (tramp-run-real-handler + 'write-region + (list start end localname append 'no-message lockname confirm)) (tramp-flush-file-property v localname)) (let ((rem-dec (tramp-get-remote-coding v "remote-decoding")) @@ -7190,7 +7193,10 @@ necessary only. This function will be used in file name completion." (tramp-file-name-method vec) (tramp-file-name-user vec) host - (tramp-compat-temporary-file-directory)))))) + (tramp-compat-temporary-file-directory))) + ;; On some systems, chown runs only for root. + (or (zerop (user-uid)) + (zerop (tramp-get-remote-uid vec 'integer)))))) ;; Variables local to connection.