]> git.eshelyaron.com Git - emacs.git/commitdiff
Use `file-attribute-*' in Tramp
authorMichael Albinus <michael.albinus@gmx.de>
Tue, 30 Aug 2016 13:36:14 +0000 (15:36 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Tue, 30 Aug 2016 13:36:14 +0000 (15:36 +0200)
* lisp/net/tramp-compat.el (tramp-compat-file-attribute-type)
(tramp-compat-file-attribute-link-number)
(tramp-compat-file-attribute-user-id)
(tramp-compat-file-attribute-group-id)
(tramp-compat-file-attribute-modification-time)
(tramp-compat-file-attribute-size)
(tramp-compat-file-attribute-modes): New defaliases.

* lisp/net/tramp.el (tramp-handle-file-modes)
(tramp-handle-file-newer-than-file-p)
(tramp-handle-file-regular-p, tramp-handle-file-symlink-p)
(tramp-handle-set-visited-file-modtime)
(tramp-handle-verify-visited-file-modtime)
(tramp-get-local-gid, tramp-check-cached-permissions):
* lisp/net/tramp-adb.el (tramp-adb-handle-file-directory-p)
(tramp-adb-handle-file-truename, tramp-adb-handle-copy-file):
* lisp/net/tramp-gvfs.el (tramp-gvfs-handle-delete-directory)
(tramp-gvfs-handle-file-directory-p)
(tramp-gvfs-handle-write-region, tramp-gvfs-get-remote-uid)
(tramp-gvfs-get-remote-gid):
* lisp/net/tramp-sh.el (tramp-sh-handle-file-truename)
(tramp-sh-handle-set-visited-file-modtime)
(tramp-sh-handle-verify-visited-file-modtime)
(tramp-sh-handle-file-newer-than-file-p)
(tramp-sh-handle-file-ownership-preserved-p)
(tramp-do-copy-or-rename-file)
(tramp-do-copy-or-rename-file-via-buffer)
(tramp-do-copy-or-rename-file-directly)
(tramp-do-copy-or-rename-file-out-of-band)
(tramp-sh-handle-file-local-copy)
(tramp-sh-handle-write-region):
* lisp/net/tramp-smb.el (tramp-smb-handle-copy-directory)
(tramp-smb-handle-copy-file)
(tramp-smb-handle-file-directory-p)
(tramp-smb-handle-file-writable-p)
(tramp-smb-handle-insert-directory): Use them.

lisp/net/tramp-adb.el
lisp/net/tramp-compat.el
lisp/net/tramp-gvfs.el
lisp/net/tramp-sh.el
lisp/net/tramp-smb.el
lisp/net/tramp.el

index 48a05a7bf4f294ca6226382e7167ad32ddde4841..3eb1bc445160ab339e97812ce334cc1af1894a70 100644 (file)
@@ -246,7 +246,9 @@ pass to the OPERATION."
 
 (defun tramp-adb-handle-file-directory-p (filename)
   "Like `file-directory-p' for Tramp files."
-  (car (file-attributes (file-truename filename))))
+  (eq (tramp-compat-file-attribute-type
+       (file-attributes (file-truename filename)))
+      t))
 
 ;; This is derived from `tramp-sh-handle-file-truename'.  Maybe the
 ;; code could be shared?
@@ -281,14 +283,15 @@ pass to the OPERATION."
                          (append '("") (reverse result) (list thisstep))
                          "/"))
              (setq symlink-target
-                   (nth 0 (file-attributes
-                           (tramp-make-tramp-file-name
-                            method user host
-                            (mapconcat 'identity
-                                       (append '("")
-                                               (reverse result)
-                                               (list thisstep))
-                                       "/")))))
+                   (tramp-compat-file-attribute-type
+                    (file-attributes
+                     (tramp-make-tramp-file-name
+                      method user host
+                      (mapconcat 'identity
+                                 (append '("")
+                                         (reverse result)
+                                         (list thisstep))
+                                 "/")))))
              (cond ((string= "." thisstep)
                     (tramp-message v 5 "Ignoring step `.'"))
                    ((string= ".." thisstep)
@@ -712,7 +715,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
 
     ;; KEEP-DATE handling.
     (when keep-date
-      (set-file-times newname (nth 5 (file-attributes filename))))))
+      (set-file-times
+       newname
+       (tramp-compat-file-attribute-modification-time
+       (file-attributes filename))))))
 
 (defun tramp-adb-handle-rename-file
   (filename newname &optional ok-if-already-exists)
index 19e48f6f251b38332725aef91c812214568961ff..1c0b8d20fda239c8c3c17acbf1f17c046c071bf3 100644 (file)
@@ -261,6 +261,65 @@ process."
           (memq (process-status process)
                 '(run open listen connect stop))))))
 
+;; `file-attribute-*' are introduced in Emacs 25.1.
+
+(if (fboundp 'file-attribute-type)
+    (defalias 'tramp-compat-file-attribute-type 'file-attribute-type)
+  (defsubst tramp-compat-file-attribute-type (attributes)
+    "The type field in ATTRIBUTES returned by `file-attributes'.
+The value is either t for directory, string (name linked to) for
+symbolic link, or nil."
+    (nth 0 attributes)))
+
+(if (fboundp 'file-attribute-link-number)
+    (defalias 'tramp-compat-file-attribute-link-number
+      'file-attribute-link-number)
+  (defsubst tramp-compat-file-attribute-link-number (attributes)
+    "Return the number of links in ATTRIBUTES returned by `file-attributes'."
+    (nth 1 attributes)))
+
+(if (fboundp 'file-attribute-user-id)
+    (defalias 'tramp-compat-file-attribute-user-id 'file-attribute-user-id)
+  (defsubst tramp-compat-file-attribute-user-id (attributes)
+    "The UID field in ATTRIBUTES returned by `file-attributes'.
+This is either a string or a number.  If a string value cannot be
+looked up, a numeric value, either an integer or a float, is
+returned."
+    (nth 2 attributes)))
+
+(if (fboundp 'file-attribute-group-id)
+    (defalias 'tramp-compat-file-attribute-group-id 'file-attribute-group-id)
+  (defsubst tramp-compat-file-attribute-group-id (attributes)
+    "The GID field in ATTRIBUTES returned by `file-attributes'.
+This is either a string or a number.  If a string value cannot be
+looked up, a numeric value, either an integer or a float, is
+returned."
+    (nth 3 attributes)))
+
+(if (fboundp 'file-attribute-modification-time)
+    (defalias 'tramp-compat-file-attribute-modification-time
+      'file-attribute-modification-time)
+  (defsubst tramp-compat-file-attribute-modification-time (attributes)
+    "The modification time in ATTRIBUTES returned by `file-attributes'.
+This is the time of the last change to the file's contents, and
+is a list of integers (HIGH LOW USEC PSEC) in the same style
+as (current-time)."
+    (nth 5 attributes)))
+
+(if (fboundp 'file-attribute-size)
+    (defalias 'tramp-compat-file-attribute-size 'file-attribute-size)
+  (defsubst tramp-compat-file-attribute-size (attributes)
+    "The size (in bytes) in ATTRIBUTES returned by `file-attributes'.
+This is a floating point number if the size is too large for an integer."
+    (nth 7 attributes)))
+
+(if (fboundp 'file-attribute-modes)
+    (defalias 'tramp-compat-file-attribute-modes 'file-attribute-modes)
+  (defsubst tramp-compat-file-attribute-modes (attributes)
+    "The file modes in ATTRIBUTES returned by `file-attributes'.
+This is a string of ten letters or dashes as in ls -l."
+    (nth 8 attributes)))
+
 ;; `default-toplevel-value' has been declared in Emacs 24.
 (unless (fboundp 'default-toplevel-value)
   (defalias 'default-toplevel-value 'symbol-value))
index 398fc87870c9b8f7db76e797cf6485d60fb0b682..6f1c01362ac95fa0f74d756f0191c58747e17cc0 100644 (file)
@@ -754,7 +754,8 @@ file names."
   (with-parsed-tramp-file-name directory nil
     (if (and recursive (not (file-symlink-p directory)))
        (mapc (lambda (file)
-               (if (eq t (car (file-attributes file)))
+               (if (eq t (tramp-compat-file-attribute-type
+                          (file-attributes file)))
                    (tramp-compat-delete-directory file recursive trash)
                  (tramp-compat-delete-file file trash)))
              (directory-files
@@ -1017,7 +1018,8 @@ file names."
 
 (defun tramp-gvfs-handle-file-directory-p (filename)
   "Like `file-directory-p' for Tramp files."
-  (eq t (car (file-attributes (file-truename filename)))))
+  (eq t (tramp-compat-file-attribute-type
+        (file-attributes (file-truename filename)))))
 
 (defun tramp-gvfs-handle-file-executable-p (filename)
   "Like `file-executable-p' for Tramp files."
@@ -1214,7 +1216,9 @@ file-notify events."
 
     ;; Set file modification time.
     (when (or (eq visit t) (stringp visit))
-      (set-visited-file-modtime (nth 5 (file-attributes filename))))
+      (set-visited-file-modtime
+       (tramp-compat-file-attribute-modification-time
+       (file-attributes filename))))
 
     ;; The end.
     (when (or (eq visit t) (null visit) (stringp visit))
@@ -1589,9 +1593,9 @@ ID-FORMAT valid values are `string' and `integer'."
       (cond
        ((and user (equal id-format 'string)) user)
        (localname
-       (nth 2 (file-attributes
-               (tramp-make-tramp-file-name method user host localname)
-               id-format)))
+       (tramp-compat-file-attribute-user-id
+        (file-attributes
+         (tramp-make-tramp-file-name method user host localname) id-format)))
        ((equal id-format 'integer) tramp-unknown-id-integer)
        ((equal id-format 'string) tramp-unknown-id-string)))))
 
@@ -1606,9 +1610,9 @@ ID-FORMAT valid values are `string' and `integer'."
           (tramp-get-connection-property vec "default-location" nil)))
       (cond
        (localname
-       (nth 3 (file-attributes
-               (tramp-make-tramp-file-name method user host localname)
-               id-format)))
+       (tramp-compat-file-attribute-group-id
+        (file-attributes
+         (tramp-make-tramp-file-name method user host localname) id-format)))
        ((equal id-format 'integer) tramp-unknown-id-integer)
        ((equal id-format 'string) tramp-unknown-id-string)))))
 
index 61d853f111e8b8ec7fe6451bf542dc4db2b4fd95..b6aa3a7c619a4577b79055a69ac90f57bffb48d1 100644 (file)
@@ -1190,14 +1190,15 @@ target of the symlink differ."
                              (append '("") (reverse result) (list thisstep))
                              "/"))
                  (setq symlink-target
-                       (nth 0 (file-attributes
-                               (tramp-make-tramp-file-name
-                                method user host
-                                (mapconcat 'identity
-                                           (append '("")
-                                                   (reverse result)
-                                                   (list thisstep))
-                                           "/")))))
+                       (tramp-compat-file-attribute-type
+                        (file-attributes
+                         (tramp-make-tramp-file-name
+                          method user host
+                          (mapconcat 'identity
+                                     (append '("")
+                                             (reverse result)
+                                             (list thisstep))
+                                    "/")))))
                  (cond ((string= "." thisstep)
                         (tramp-message v 5 "Ignoring step `.'"))
                        ((string= ".." thisstep)
@@ -1448,7 +1449,8 @@ target of the symlink differ."
        (let* ((remote-file-name-inhibit-cache t)
               (attr (file-attributes f))
               ;; '(-1 65535) means file doesn't exists yet.
-              (modtime (or (nth 5 attr) '(-1 65535))))
+              (modtime (or (tramp-compat-file-attribute-modification-time attr)
+                           '(-1 65535))))
          (setq coding-system-used last-coding-system-used)
          ;; We use '(0 0) as a don't-know value.  See also
          ;; `tramp-do-file-attributes-with-ls'.
@@ -1487,7 +1489,7 @@ of."
        (with-parsed-tramp-file-name f nil
          (let* ((remote-file-name-inhibit-cache t)
                 (attr (file-attributes f))
-                (modtime (nth 5 attr))
+                (modtime (tramp-compat-file-attribute-modification-time attr))
                 (mt (visited-file-modtime)))
 
            (cond
@@ -1711,9 +1713,16 @@ be non-negative integers."
           ;; and obtain the result.
           (let ((fa1 (file-attributes file1))
                 (fa2 (file-attributes file2)))
-            (if (and (not (equal (nth 5 fa1) '(0 0)))
-                     (not (equal (nth 5 fa2) '(0 0))))
-                (> 0 (tramp-time-diff (nth 5 fa2) (nth 5 fa1)))
+            (if (and
+                 (not
+                  (equal (tramp-compat-file-attribute-modification-time fa1)
+                         '(0 0)))
+                 (not
+                  (equal (tramp-compat-file-attribute-modification-time fa2)
+                         '(0 0))))
+                (> 0 (tramp-time-diff
+                      (tramp-compat-file-attribute-modification-time fa2)
+                      (tramp-compat-file-attribute-modification-time fa1)))
               ;; If one of them is the dont-know value, then we can
               ;; still try to run a shell command on the remote host.
               ;; However, this only works if both files are Tramp
@@ -1765,9 +1774,11 @@ be non-negative integers."
        ;; information would be lost by an (attempted) delete and create.
        (or (null attributes)
            (and
-            (= (nth 2 attributes) (tramp-get-remote-uid v 'integer))
+            (= (tramp-compat-file-attribute-user-id attributes)
+               (tramp-get-remote-uid v 'integer))
             (or (not group)
-                (= (nth 3 attributes) (tramp-get-remote-gid v 'integer)))))))))
+                (= (tramp-compat-file-attribute-group-id attributes)
+                   (tramp-get-remote-gid v 'integer)))))))))
 
 ;; Directory listings.
 
@@ -2066,7 +2077,8 @@ file names."
     (error "Unknown operation `%s', must be `copy' or `rename'" op))
   (let ((t1 (tramp-tramp-file-p filename))
        (t2 (tramp-tramp-file-p newname))
-       (length (nth 7 (file-attributes (file-truename filename))))
+       (length (tramp-compat-file-attribute-size
+                (file-attributes (file-truename filename))))
        (attributes (and preserve-extended-attributes
                         (apply 'file-extended-attributes (list filename)))))
 
@@ -2177,7 +2189,11 @@ KEEP-DATE is non-nil if NEWNAME should have the same timestamp as FILENAME."
       (set-buffer-multibyte nil)
       (insert-file-contents-literally filename)))
   ;; KEEP-DATE handling.
-  (when keep-date (set-file-times newname (nth 5 (file-attributes filename))))
+  (when keep-date
+    (set-file-times
+     newname
+     (tramp-compat-file-attribute-modification-time
+      (file-attributes filename))))
   ;; Set the mode.
   (set-file-modes newname (tramp-default-file-modes filename))
   ;; If the operation was `rename', delete the original file.
@@ -2195,7 +2211,8 @@ as FILENAME.  PRESERVE-UID-GID, when non-nil, instructs to keep
 the uid and gid from FILENAME."
   (let ((t1 (tramp-tramp-file-p filename))
        (t2 (tramp-tramp-file-p newname))
-       (file-times (nth 5 (file-attributes filename)))
+       (file-times (tramp-compat-file-attribute-modification-time
+                    (file-attributes filename)))
        (file-modes (tramp-default-file-modes filename)))
     (with-parsed-tramp-file-name (if t1 filename newname) nil
       (let* ((cmd (cond ((and (eq op 'copy) preserve-uid-gid) "cp -f -p")
@@ -2559,7 +2576,10 @@ The method used must be an out-of-band method."
 
        ;; Handle KEEP-DATE argument.
        (when (and keep-date (not copy-keep-date))
-         (set-file-times newname (nth 5 (file-attributes filename))))
+         (set-file-times
+          newname
+          (tramp-compat-file-attribute-modification-time
+           (file-attributes filename))))
 
        ;; Set the mode.
        (unless (and keep-date copy-keep-date)
@@ -3114,7 +3134,8 @@ the result will be a local, non-Tramp, file name."
        v 'file-error
        "Cannot make local copy of non-existing file `%s'" filename))
 
-    (let* ((size (nth 7 (file-attributes (file-truename filename))))
+    (let* ((size (tramp-compat-file-attribute-size
+                 (file-attributes (file-truename filename))))
           (rem-enc (tramp-get-inline-coding v "remote-encoding" size))
           (loc-dec (tramp-get-inline-coding v "local-decoding" size))
           (tmpfile (tramp-compat-make-temp-file filename)))
@@ -3205,9 +3226,11 @@ the result will be a local, non-Tramp, file name."
       (unless (y-or-n-p (format "File %s exists; overwrite anyway? " filename))
        (tramp-error v 'file-error "File not overwritten")))
 
-    (let ((uid (or (nth 2 (file-attributes filename 'integer))
+    (let ((uid (or (tramp-compat-file-attribute-user-id
+                   (file-attributes filename 'integer))
                   (tramp-get-remote-uid v 'integer)))
-         (gid (or (nth 3 (file-attributes filename 'integer))
+         (gid (or (tramp-compat-file-attribute-group-id
+                   (file-attributes filename 'integer))
                   (tramp-get-remote-gid v 'integer))))
 
       (if (and (tramp-local-host-p v)
@@ -3284,7 +3307,8 @@ the result will be a local, non-Tramp, file name."
          ;; specified.  However, if the method _also_ specifies an
          ;; encoding function, then that is used for encoding the
          ;; contents of the tmp file.
-         (let* ((size (nth 7 (file-attributes tmpfile)))
+         (let* ((size (tramp-compat-file-attribute-size
+                       (file-attributes tmpfile)))
                 (rem-dec (tramp-get-inline-coding v "remote-decoding" size))
                 (loc-enc (tramp-get-inline-coding v "local-encoding" size)))
            (cond
@@ -3420,9 +3444,9 @@ the result will be a local, non-Tramp, file name."
              ;; We must pass modtime explicitly, because FILENAME can
              ;; be different from (buffer-file-name), f.e. if
              ;; `file-precious-flag' is set.
-             (nth 5 file-attr))
-            (when (and (= (nth 2 file-attr) uid)
-                       (= (nth 3 file-attr) gid))
+             (tramp-compat-file-attribute-modification-time file-attr))
+            (when (and (= (tramp-compat-file-attribute-user-id file-attr) uid)
+                       (= (tramp-compat-file-attribute-group-id file-attr) gid))
               (setq need-chown nil))))
 
        ;; Set the ownership.
index 05ce6041a8b23adf56afe81dd57224f4049ccffe..3b9c49eb26e8c3f018b715ed5385fcfe9baa092f 100644 (file)
@@ -531,7 +531,10 @@ pass to the OPERATION."
 
            ;; Handle KEEP-DATE argument.
            (when keep-date
-             (set-file-times newname (nth 5 (file-attributes dirname))))
+             (set-file-times
+              newname
+              (tramp-compat-file-attribute-modification-time
+               (file-attributes dirname))))
 
            ;; Set the mode.
            (unless keep-date
@@ -599,7 +602,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
 
     ;; KEEP-DATE handling.
     (when keep-date
-      (set-file-times newname (nth 5 (file-attributes filename))))))
+      (set-file-times
+       newname
+       (tramp-compat-file-attribute-modification-time
+       (file-attributes filename))))))
 
 (defun tramp-smb-handle-delete-directory (directory &optional recursive)
   "Like `delete-directory' for Tramp files."
@@ -887,7 +893,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
 (defun tramp-smb-handle-file-directory-p (filename)
   "Like `file-directory-p' for Tramp files."
   (and (file-exists-p filename)
-       (eq ?d (aref (nth 8 (file-attributes filename)) 0))))
+       (eq ?d
+          (aref (tramp-compat-file-attribute-modes (file-attributes filename))
+                0))))
 
 (defun tramp-smb-handle-file-local-copy (filename)
   "Like `file-local-copy' for Tramp files."
@@ -929,7 +937,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
 (defun tramp-smb-handle-file-writable-p (filename)
   "Like `file-writable-p' for Tramp files."
   (if (file-exists-p filename)
-      (string-match "w" (or (nth 8 (file-attributes filename)) ""))
+      (string-match
+       "w"
+       (or (tramp-compat-file-attribute-modes (file-attributes filename)) ""))
     (let ((dir (file-name-directory filename)))
       (and (file-exists-p dir)
           (file-writable-p dir)))))
@@ -1014,11 +1024,11 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
                   (insert
                    (format
                     "%10s %3d %-8s %-8s %8s %s "
-                    (or (nth 8 attr) (nth 1 x)) ; mode
-                    (or (nth 1 attr) 1) ; inode
-                    (or (nth 2 attr) "nobody") ; uid
-                    (or (nth 3 attr) "nogroup") ; gid
-                    (or (nth 7 attr) (nth 2 x)) ; size
+                    (or (tramp-compat-file-attribute-modes attr) (nth 1 x))
+                    (or (tramp-compat-file-attribute-link-number attr) 1)
+                    (or (tramp-compat-file-attribute-user-id attr) "nobody")
+                    (or (tramp-compat-file-attribute-group-id attr) "nogroup")
+                    (or (tramp-compat-file-attribute-size attr) (nth 2 x))
                     (format-time-string
                      (if (time-less-p (time-subtract (current-time) (nth 3 x))
                           tramp-half-a-year)
index 4e9d4c29cd4df73b8d70465e8337cfc8ba74a638..ad00f31010f9e10b482f2c06a341639f33fbd075 100644 (file)
@@ -2856,7 +2856,8 @@ User is always nil."
   "Like `file-modes' for Tramp files."
   (let ((truename (or (file-truename filename) filename)))
     (when (file-exists-p truename)
-      (tramp-mode-string-to-int (nth 8 (file-attributes truename))))))
+      (tramp-mode-string-to-int
+       (tramp-compat-file-attribute-modes (file-attributes truename))))))
 
 ;; Localname manipulation functions that grok Tramp localnames...
 (defun tramp-handle-file-name-as-directory (file)
@@ -2926,13 +2927,17 @@ User is always nil."
   (cond
    ((not (file-exists-p file1)) nil)
    ((not (file-exists-p file2)) t)
-   (t (time-less-p (nth 5 (file-attributes file2))
-                  (nth 5 (file-attributes file1))))))
+   (t (time-less-p (tramp-compat-file-attribute-modification-time
+                   (file-attributes file2))
+                  (tramp-compat-file-attribute-modification-time
+                   (file-attributes file1))))))
 
 (defun tramp-handle-file-regular-p (filename)
   "Like `file-regular-p' for Tramp files."
   (and (file-exists-p filename)
-       (eq ?- (aref (nth 8 (file-attributes filename)) 0))))
+       (eq ?-
+          (aref (tramp-compat-file-attribute-modes (file-attributes filename))
+                0))))
 
 (defun tramp-handle-file-remote-p (filename &optional identification connected)
   "Like `file-remote-p' for Tramp files."
@@ -2958,7 +2963,7 @@ User is always nil."
 (defun tramp-handle-file-symlink-p (filename)
   "Like `file-symlink-p' for Tramp files."
   (with-parsed-tramp-file-name filename nil
-    (let ((x (car (file-attributes filename))))
+    (let ((x (tramp-compat-file-attribute-type (file-attributes filename))))
       (when (stringp x)
        (if (file-name-absolute-p x)
            (tramp-make-tramp-file-name method user host x)
@@ -3279,7 +3284,9 @@ User is always nil."
     (let ((remote-file-name-inhibit-cache t))
       ;; '(-1 65535) means file doesn't exists yet.
       (setq time-list
-           (or (nth 5 (file-attributes (buffer-file-name))) '(-1 65535)))))
+           (or (tramp-compat-file-attribute-modification-time
+                (file-attributes (buffer-file-name)))
+               '(-1 65535)))))
   ;; We use '(0 0) as a don't-know value.
   (unless (equal time-list '(0 0))
     (tramp-run-real-handler 'set-visited-file-modtime (list time-list))))
@@ -3303,7 +3310,7 @@ of."
        (with-parsed-tramp-file-name f nil
          (let* ((remote-file-name-inhibit-cache t)
                 (attr (file-attributes f))
-                (modtime (nth 5 attr))
+                (modtime (tramp-compat-file-attribute-modification-time attr))
                 (mt (visited-file-modtime)))
 
            (cond
@@ -3820,7 +3827,7 @@ ID-FORMAT valid values are `string' and `integer'."
   ;; `group-gid' has been introduced with Emacs 24.4.
   (if (and (fboundp 'group-gid) (equal id-format 'integer))
       (tramp-compat-funcall 'group-gid)
-    (nth 3 (file-attributes "~/" id-format))))
+    (tramp-compat-file-attribute-group-id (file-attributes "~/" id-format))))
 
 (defun tramp-get-local-locale (&optional vec)
   "Determine locale, supporting UTF8 if possible.
@@ -3884,23 +3891,32 @@ be granted."
           (and
            file-attr
            (or
-            ;; Not a symlink
-            (eq t (car file-attr))
-            (null (car file-attr)))
+            ;; Not a symlink.
+            (eq t (tramp-compat-file-attribute-type file-attr))
+            (null (tramp-compat-file-attribute-type file-attr)))
            (or
             ;; World accessible.
-            (eq access (aref (nth 8 file-attr) (+ offset 6)))
+            (eq access
+               (aref (tramp-compat-file-attribute-modes file-attr)
+                     (+ offset 6)))
             ;; User accessible and owned by user.
             (and
-             (eq access (aref (nth 8 file-attr) offset))
-            (or (equal remote-uid (nth 2 file-attr))
-                (equal unknown-id (nth 2 file-attr))))
-            ;; Group accessible and owned by user's
-            ;; principal group.
+             (eq access
+                (aref (tramp-compat-file-attribute-modes file-attr) offset))
+            (or (equal remote-uid
+                       (tramp-compat-file-attribute-user-id file-attr))
+                (equal unknown-id
+                       (tramp-compat-file-attribute-user-id file-attr))))
+            ;; Group accessible and owned by user's principal group.
             (and
-             (eq access (aref (nth 8 file-attr) (+ offset 3)))
-             (or (equal remote-gid (nth 3 file-attr))
-                (equal unknown-id (nth 3 file-attr))))))))))))
+             (eq access
+                (aref (tramp-compat-file-attribute-modes file-attr)
+                      (+ offset 3)))
+             (or (equal remote-gid
+                       (tramp-compat-file-attribute-group-id file-attr))
+                (equal unknown-id
+                       (tramp-compat-file-attribute-group-id
+                        file-attr))))))))))))
 
 ;;;###tramp-autoload
 (defun tramp-local-host-p (vec)