Function: tramp-smb-do-file-attributes-with-stat
tramp-smb-do-file-attributes-with-stat is a byte-compiled function
defined in tramp-smb.el.gz.
Signature
(tramp-smb-do-file-attributes-with-stat VEC)
Documentation
Implement file-attributes for Tramp files using stat command.
Source Code
;; Defined in /usr/src/emacs/lisp/net/tramp-smb.el.gz
device)))))))) ;11 file system number
(defun tramp-smb-do-file-attributes-with-stat (vec)
"Implement `file-attributes' for Tramp files using `stat' command."
(tramp-message
vec 5 "file attributes with stat: %s" (tramp-file-name-localname vec))
(let* (size id link uid gid atime mtime ctime mode inode)
(when (tramp-smb-send-command
vec (format "stat %s" (tramp-smb-shell-quote-localname vec)))
;; Loop the listing.
(with-current-buffer (tramp-get-connection-buffer vec)
(goto-char (point-min))
(unless (re-search-forward tramp-smb-errors nil t)
(while (not (eobp))
(cond
((looking-at
(rx "Size:" (+ blank) (group (+ digit)) (+ blank)
"Blocks:" (+ blank) (+ digit) (+ blank) (group (+ wordchar))))
(setq size (string-to-number (match-string 1))
id (if (string-equal "directory" (match-string 2)) t
(if (string-equal "symbolic" (match-string 2)) ""))))
((looking-at
(rx "Inode:" (+ blank) (group (+ digit)) (+ blank)
"Links:" (+ blank) (group (+ digit))))
(setq inode (string-to-number (match-string 1))
link (string-to-number (match-string 2))))
((looking-at
(rx "Access:" (+ blank)
"(" (+ digit) "/" (group (+ (not blank))) ")" (+ blank)
"Uid:" (+ blank) (group (+ digit)) (+ blank)
"Gid:" (+ blank) (group (+ digit))))
(setq mode (match-string 1)
uid (match-string 2)
gid (match-string 3)))
((looking-at
(rx "Access:" (+ blank)
(group (+ digit)) "-" (group (+ digit)) "-"
(group (+ digit)) (+ blank)
(group (+ digit)) ":" (group (+ digit)) ":"
(group (+ digit))))
(setq atime
(encode-time
(string-to-number (match-string 6)) ;; sec
(string-to-number (match-string 5)) ;; min
(string-to-number (match-string 4)) ;; hour
(string-to-number (match-string 3)) ;; day
(string-to-number (match-string 2)) ;; month
(string-to-number (match-string 1))))) ;; year
((looking-at
(rx "Modify:" (+ blank)
(group (+ digit)) "-" (group (+ digit)) "-"
(group (+ digit)) (+ blank)
(group (+ digit)) ":" (group (+ digit)) ":"
(group (+ digit))))
(setq mtime
(encode-time
(string-to-number (match-string 6)) ;; sec
(string-to-number (match-string 5)) ;; min
(string-to-number (match-string 4)) ;; hour
(string-to-number (match-string 3)) ;; day
(string-to-number (match-string 2)) ;; month
(string-to-number (match-string 1))))) ;; year
((looking-at
(rx "Change:" (+ blank)
(group (+ digit)) "-" (group (+ digit)) "-"
(group (+ digit)) (+ blank)
(group (+ digit)) ":" (group (+ digit)) ":"
(group (+ digit))))
(setq ctime
(encode-time
(string-to-number (match-string 6)) ;; sec
(string-to-number (match-string 5)) ;; min
(string-to-number (match-string 4)) ;; hour
(string-to-number (match-string 3)) ;; day
(string-to-number (match-string 2)) ;; month
(string-to-number (match-string 1)))))) ;; year
(forward-line))
;; Resolve symlink.
(when (and (stringp id)
(tramp-smb-send-command
vec
(format
"readlink %s" (tramp-smb-shell-quote-localname vec))))
(goto-char (point-min))
(and (looking-at (rx (+ nonl) " -> " (group (+ nonl))))
(setq id (match-string 1))))
;; Return the result.
(when (or id link uid gid atime mtime ctime size mode inode)
(list id link (cons uid (string-to-number uid))
(cons gid (string-to-number gid)) gid atime mtime ctime size
mode nil inode (tramp-get-device vec))))))))