From: Michael Albinus Date: Fri, 4 Jan 2013 09:41:23 +0000 (+0100) Subject: * net/tramp-sh.el (tramp-set-file-uid-gid): UID and GID must be X-Git-Tag: emacs-24.2.92~33 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f99ced353f1e6d41f085d6325b0182ed2d644753;p=emacs.git * net/tramp-sh.el (tramp-set-file-uid-gid): UID and GID must be non-negative integers. Otherwise, the default values are used. (tramp-convert-file-attributes): Convert uid and gid to integers. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 90b6e683e0a..86cd55c6c36 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Michael Albinus + + * net/tramp-sh.el (tramp-set-file-uid-gid): UID and GID must be + non-negative integers. Otherwise, the default values are used. + (tramp-convert-file-attributes): Convert uid and gid to integers. + 2013-01-03 Glenn Morris * term.el (term-handle-colors-array): Ensure face attributes diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index 2bffb868aba..2152ba1e270 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -1449,23 +1449,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 @@ -1474,8 +1473,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)))))) @@ -4606,7 +4605,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 @@ -4614,6 +4613,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)