]> 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:53:07 +0000 (12:53 +0000)
committerMichael Albinus <michael.albinus@gmx.de>
Wed, 8 Jul 2009 12:53:07 +0000 (12:53 +0000)
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)

lisp/ChangeLog
lisp/net/tramp.el

index 3c2be95238fb2aad6bb855d00994a25091945edc..c9bdc0722a05fae50eb741932e8672deb96bc3ea 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  E. Jay Berkenbilt  <ejb@ql.org>  (tiny change)
 
        * mail/unrmail.el (unrmail): Make sure the message ends with two
index 01ce21698a4b3787b69fcbf02edcf85947408fef..021535250a34a0e323f752ac1ee2bf7935c844e6 100644 (file)
@@ -2687,14 +2687,17 @@ and gid of the corresponding user is taken.  Both parameters must be integers."
   ;;      succeed in 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 Win32 "chown" might not work.
@@ -4356,7 +4359,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
@@ -4364,10 +4367,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"))
@@ -7161,7 +7164,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.