# HG changeset patch # User Michael Albinus # Date 1247056858 0 # Node ID c5225871ee78f65d657a4e2b3fa5dada18d0c777 # Parent 455b21d42672ef742b637285fe130071f4e346f0 * 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 -r 455b21d42672 -r c5225871ee78 lisp/net/tramp.el --- a/lisp/net/tramp.el Wed Jul 08 07:23:55 2009 +0000 +++ b/lisp/net/tramp.el Wed Jul 08 12:40:58 2009 +0000 @@ -2709,14 +2709,17 @@ ;; 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 @@ (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 @@ (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 @@ (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.