Function: tramp-do-file-attributes-with-ls

tramp-do-file-attributes-with-ls is a byte-compiled function defined in tramp-sh.el.gz.

Signature

(tramp-do-file-attributes-with-ls VEC LOCALNAME)

Documentation

Implement file-attributes for Tramp files using the ls(1) command.

Source Code

;; Defined in /usr/src/emacs/lisp/net/tramp-sh.el.gz
(defun tramp-do-file-attributes-with-ls (vec localname)
  "Implement `file-attributes' for Tramp files using the ls(1) command."
  (let (symlinkp dirp
	res-inode res-filemodes res-numlinks
	res-uid-string res-gid-string res-uid-integer res-gid-integer
	res-size res-symlink-target)
    (tramp-message vec 5 "file attributes with ls: %s" localname)
    ;; We cannot send all three commands combined, it could exceed
    ;; NAME_MAX or PATH_MAX.  Happened on macOS, for example.
    (when (tramp-send-command-and-check
           vec
           (format "cd %s && (%s %s || %s -h %s)"
		   (tramp-shell-quote-argument
		    (tramp-run-real-handler
		     #'file-name-directory (list localname)))
		   (tramp-get-file-exists-command vec)
		   (if (string-empty-p (file-name-nondirectory localname))
		       "."
                     (tramp-shell-quote-argument
		      (file-name-nondirectory localname)))
                   (tramp-get-test-command vec)
		   (if (string-empty-p (file-name-nondirectory localname))
		       "."
                     (tramp-shell-quote-argument
		      (file-name-nondirectory localname)))))
      (tramp-send-command
       vec
       (format "%s -ild %s %s; %s -lnd %s %s"
               (tramp-get-ls-command vec)
               ;; On systems which have no quoting style, file names
               ;; with special characters could fail.
               (tramp-sh--quoting-style-options vec)
               (tramp-shell-quote-argument localname)
               (tramp-get-ls-command vec)
               ;; On systems which have no quoting style, file names
               ;; with special characters could fail.
               (tramp-sh--quoting-style-options vec)
               (tramp-shell-quote-argument localname)))
      ;; Parse `ls -l' output ...
      (with-current-buffer (tramp-get-buffer vec)
        (when (> (buffer-size) 0)
          (goto-char (point-min))
          ;; ... inode
          (setq res-inode (read (current-buffer)))
          ;; ... file mode flags
          (setq res-filemodes (symbol-name (read (current-buffer))))
          ;; ... number links
          (setq res-numlinks (read (current-buffer)))
          ;; ... uid and gid
          (setq res-uid-string (read (current-buffer)))
          (setq res-gid-string (read (current-buffer)))
	  (when (natnump res-uid-string)
	    (setq res-uid-string (number-to-string res-uid-string)))
          (unless (stringp res-uid-string)
	    (setq res-uid-string (symbol-name res-uid-string)))
	  (when (natnump res-gid-string)
	    (setq res-gid-string (number-to-string res-gid-string)))
          (unless (stringp res-gid-string)
	    (setq res-gid-string (symbol-name res-gid-string)))
          ;; ... size
          (setq res-size (read (current-buffer)))
          ;; From the file modes, figure out other stuff.
          (setq symlinkp (eq ?l (aref res-filemodes 0)))
          (setq dirp (eq ?d (aref res-filemodes 0)))
          ;; If symlink, find out file name pointed to.
          (when symlinkp
            (search-forward "-> ")
            (setq res-symlink-target
                  (if (looking-at-p "\"")
                      (read (current-buffer))
                    (buffer-substring (point) (line-end-position)))))
	  (forward-line)
          ;; ... file mode flags
	  (read (current-buffer))
          ;; ... number links
	  (read (current-buffer))
          ;; ... uid and gid
          (setq res-uid-integer (read (current-buffer)))
          (setq res-gid-integer (read (current-buffer)))
          (unless (numberp res-uid-integer)
	    (setq res-uid-integer tramp-unknown-id-integer))
          (unless (numberp res-gid-integer)
	    (setq res-gid-integer tramp-unknown-id-integer))

	  ;; Return data gathered.
          (list
           ;; 0. t for directory, string (name linked to) for symbolic
           ;; link, or nil.
           (or dirp res-symlink-target)
           ;; 1. Number of links to file.
           res-numlinks
           ;; 2. File uid.
           (cons res-uid-string res-uid-integer)
           ;; 3. File gid.
           (cons res-gid-string res-gid-integer)
           ;; 4. Last access time.
           ;; 5. Last modification time.
           ;; 6. Last status change time.
           tramp-time-dont-know tramp-time-dont-know tramp-time-dont-know
           ;; 7. Size in bytes (-1, if number is out of range).
           res-size
           ;; 8. File modes, as a string of ten letters or dashes as in ls -l.
           res-filemodes
           ;; 9. t if file's gid would change if file were deleted and
           ;; recreated.  Will be set in `tramp-convert-file-attributes'.
           t
           ;; 10. Inode number.
           res-inode
           ;; 11. Device number.  Will be replaced by a virtual device number.
           -1))))))