]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/tramp.el (tramp-set-file-uid-gid): Handle the case the
authorMichael Albinus <michael.albinus@gmx.de>
Wed, 8 Jul 2009 12:43:42 +0000 (12:43 +0000)
committerMichael Albinus <michael.albinus@gmx.de>
Wed, 8 Jul 2009 12:43:42 +0000 (12:43 +0000)
remote user is root, on the local host.
(tramp-local-host-p): Either the local user or the remote user
must be root.

lisp/ChangeLog
lisp/net/tramp.el

index 6a2f3ad06e7dc2f8df81fbe39cde3ef4b998c248..b7168fffd3ac8a00414f2c0cbb8a058218aaaa21 100644 (file)
@@ -1,3 +1,10 @@
+2009-07-08  Michael Albinus  <michael.albinus@gmx.de>
+
+       * 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  <nickrob@snap.net.nz>
 
        * progmodes/gdb-mi.el (gdb): Remove description of
index d95430d55d2933903ab6f9c0b0e8501cf554a8cd..444f55ac5d24adaa1c62fb1c1cf0ad6e1c947e36 100644 (file)
@@ -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.