Function: tramp-convert-file-attributes

tramp-convert-file-attributes is a macro defined in tramp.el.gz.

Signature

(tramp-convert-file-attributes VEC LOCALNAME ID-FORMAT ATTR)

Documentation

Convert file-attributes ATTR generated Tramp backend functions.

Convert file mode bits to string and set virtual device number. Set file uid and gid according to ID-FORMAT. LOCALNAME is used to cache the result. Return the modified ATTR.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp.el.gz
(defmacro tramp-convert-file-attributes (vec localname id-format attr)
  "Convert `file-attributes' ATTR generated Tramp backend functions.
Convert file mode bits to string and set virtual device number.
Set file uid and gid according to ID-FORMAT.  LOCALNAME is used
to cache the result.  Return the modified ATTR."
  (declare (indent 3) (debug t))
  `(with-tramp-file-property
       ,vec ,localname (format "file-attributes-%s" (or ,id-format 'integer))
     (when-let
	 ((result
	   (with-tramp-file-property ,vec ,localname "file-attributes"
	     (when-let ((attr ,attr))
	       (save-match-data
		 ;; Remove ANSI control escape sequences from symlink.
		 (when (stringp (car attr))
		   (while (string-match ansi-color-control-seq-regexp (car attr))
		     (setcar attr (replace-match "" nil nil (car attr)))))
		 ;; Convert uid and gid.  Use `tramp-unknown-id-integer'
		 ;; as indication of unusable value.
		 (when (consp (nth 2 attr))
		   (when (and (numberp (cdr (nth 2 attr)))
			      (< (cdr (nth 2 attr)) 0))
		     (setcdr (car (nthcdr 2 attr)) tramp-unknown-id-integer))
		   (when (and (floatp (cdr (nth 2 attr)))
			      (<= (cdr (nth 2 attr)) most-positive-fixnum))
		     (setcdr (car (nthcdr 2 attr)) (round (cdr (nth 2 attr))))))
		 (when (consp (nth 3 attr))
		   (when (and (numberp (cdr (nth 3 attr)))
			      (< (cdr (nth 3 attr)) 0))
		     (setcdr (car (nthcdr 3 attr)) tramp-unknown-id-integer))
		   (when (and (floatp (cdr (nth 3 attr)))
			      (<= (cdr (nth 3 attr)) most-positive-fixnum))
		     (setcdr (car (nthcdr 3 attr)) (round (cdr (nth 3 attr))))))
		 ;; Convert last access time.
		 (unless (listp (nth 4 attr))
		   (setcar (nthcdr 4 attr) (seconds-to-time (nth 4 attr))))
		 ;; Convert last modification time.
		 (unless (listp (nth 5 attr))
		   (setcar (nthcdr 5 attr) (seconds-to-time (nth 5 attr))))
		 ;; Convert last status change time.
		 (unless (listp (nth 6 attr))
		   (setcar (nthcdr 6 attr) (seconds-to-time (nth 6 attr))))
		 ;; Convert file size.
		 (when (< (nth 7 attr) 0)
		   (setcar (nthcdr 7 attr) -1))
		 (when (and (floatp (nth 7 attr))
			    (<= (nth 7 attr) most-positive-fixnum))
		   (setcar (nthcdr 7 attr) (round (nth 7 attr))))
		 ;; Convert file mode bits to string.
		 (unless (stringp (nth 8 attr))
		   (setcar (nthcdr 8 attr)
			   (tramp-file-mode-from-int (nth 8 attr)))
		   (when (stringp (car attr))
		     (aset (nth 8 attr) 0 ?l)))
		 ;; Convert directory indication bit.
		 (when (string-prefix-p "d" (nth 8 attr))
		   (setcar attr t))
		 ;; Convert symlink from `tramp-do-file-attributes-with-stat'.
		 ;; Decode also multibyte string.
		 (when (consp (car attr))
		   (setcar attr
			   (and (stringp (caar attr))
				(string-match
				 (rx (+ nonl) " -> " nonl (group (+ nonl)) nonl)
				 (caar attr))
				(decode-coding-string
				 (match-string 1 (caar attr)) 'utf-8))))
		 ;; Set file's gid change bit.
		 (setcar
		  (nthcdr 9 attr)
		  (not (= (cdr (nth 3 attr))
			  (or (tramp-get-remote-gid ,vec 'integer)
			      tramp-unknown-id-integer))))
		 ;; Convert inode.
		 (when (floatp (nth 10 attr))
		   (setcar (nthcdr 10 attr)
			   (condition-case nil
			       (let ((high (nth 10 attr))
				     middle low)
				 (if (<= high most-positive-fixnum)
				     (floor high)
				   ;; The low 16 bits.
				   (setq low (mod high #x10000)
					 high (/ high #x10000))
				   (if (<= high most-positive-fixnum)
				       (cons (floor high) (floor low))
				     ;; The middle 24 bits.
				     (setq middle (mod high #x1000000)
					   high (/ high #x1000000))
				     (cons (floor high)
					   (cons (floor middle) (floor low))))))
			     ;; Inodes can be incredible huge.  We
			     ;; must hide this.
			     (error (tramp-get-inode ,vec)))))
		 ;; Set virtual device number.
		 (setcar (nthcdr 11 attr)
			 (tramp-get-device ,vec))
		 attr)))))

       ;; Return normalized result.
       (append (tramp-compat-take 2 result)
	       (if (eq ,id-format 'string)
		   (list (car (nth 2 result)) (car (nth 3 result)))
		 (list (cdr (nth 2 result)) (cdr (nth 3 result))))
	       (nthcdr 4 result)))))