diff options
author | Glenn Morris <rgm@gnu.org> | 2013-01-04 11:22:37 -0800 |
---|---|---|
committer | Glenn Morris <rgm@gnu.org> | 2013-01-04 11:22:37 -0800 |
commit | 0f668a4db4a33f98f84613513af3efea521b4847 (patch) | |
tree | ab85f709ca11c2390dddfc1756656293d6762e55 /lisp/net | |
parent | 4a1b123d1517bcad22f936df9c39b61fbc3e5359 (diff) | |
parent | 92d596112248baecbe6789d450d8e8ea405de19b (diff) | |
download | emacs-0f668a4db4a33f98f84613513af3efea521b4847.tar.gz emacs-0f668a4db4a33f98f84613513af3efea521b4847.tar.bz2 emacs-0f668a4db4a33f98f84613513af3efea521b4847.zip |
Merge from emacs-24; up to 2012-12-06T20:16:38Z!monnier@iro.umontreal.ca
Diffstat (limited to 'lisp/net')
-rw-r--r-- | lisp/net/tramp-sh.el | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 5bbf1708654..79f8d82b02b 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -1452,23 +1452,22 @@ of." (defun tramp-set-file-uid-gid (filename &optional uid gid) "Set the ownership for FILENAME. If UID and GID are provided, these values are used; otherwise uid -and gid of the corresponding user is taken. Both parameters must be integers." +and gid of the corresponding user is taken. Both parameters must +be non-negative integers." ;; Modern Unices allow chown only for root. So we might need ;; another implementation, see `dired-do-chown'. OTOH, it is mostly ;; working with su(do)? when it is needed, so it shall succeed in ;; the majority of cases. ;; Don't modify `last-coding-system-used' by accident. - (let ((last-coding-system-used last-coding-system-used) - (uid (and (numberp uid) (round uid))) - (gid (and (numberp gid) (round gid)))) + (let ((last-coding-system-used last-coding-system-used)) (if (file-remote-p filename) (with-parsed-tramp-file-name filename nil (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) + (let ((uid (or (and (natnump uid) uid) (tramp-get-remote-uid v 'integer))) - (gid (or (and (integerp gid) gid) + (gid (or (and (natnump gid) gid) (tramp-get-remote-gid v 'integer)))) (tramp-send-command v (format @@ -1477,8 +1476,8 @@ and gid of the corresponding user is taken. Both parameters must be integers." ;; We handle also the local part, because there doesn't exist ;; `set-file-uid-gid'. On W32 "chown" might not work. - (let ((uid (or (and (integerp uid) uid) (tramp-get-local-uid 'integer))) - (gid (or (and (integerp gid) gid) (tramp-get-local-gid 'integer)))) + (let ((uid (or (and (natnump uid) uid) (tramp-get-local-uid 'integer))) + (gid (or (and (natnump gid) gid) (tramp-get-local-gid 'integer)))) (tramp-compat-call-process "chown" nil nil nil (format "%d:%d" uid gid) (tramp-shell-quote-argument filename)))))) @@ -4665,7 +4664,7 @@ raises an error." command (buffer-string)))))))) (defun tramp-convert-file-attributes (vec attr) - "Convert file-attributes ATTR generated by perl script, stat or ls. + "Convert `file-attributes' ATTR generated by perl script, stat or ls. Convert file mode bits to string and set virtual device number. Return ATTR." (when attr @@ -4673,6 +4672,17 @@ Return ATTR." (when (stringp (car attr)) (while (string-match tramp-color-escape-sequence-regexp (car attr)) (setcar attr (replace-match "" nil nil (car attr))))) + ;; Convert uid and gid. Use -1 as indication of unusable value. + (when (and (numberp (nth 2 attr)) (< (nth 2 attr) 0)) + (setcar (nthcdr 2 attr) -1)) + (when (and (floatp (nth 2 attr)) + (<= (nth 2 attr) (tramp-compat-most-positive-fixnum))) + (setcar (nthcdr 2 attr) (round (nth 2 attr)))) + (when (and (numberp (nth 3 attr)) (< (nth 3 attr) 0)) + (setcar (nthcdr 3 attr) -1)) + (when (and (floatp (nth 3 attr)) + (<= (nth 3 attr) (tramp-compat-most-positive-fixnum))) + (setcar (nthcdr 3 attr) (round (nth 3 attr)))) ;; Convert last access time. (unless (listp (nth 4 attr)) (setcar (nthcdr 4 attr) |