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))))))))