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 &optional ID-FORMAT)

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 &optional id-format)
  "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-get-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
	       (concat
		"Size:\\s-+\\([[:digit:]]+\\)\\s-+"
		"Blocks:\\s-+[[:digit:]]+\\s-+\\(\\w+\\)"))
	      (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
	       "Inode:\\s-+\\([[:digit:]]+\\)\\s-+Links:\\s-+\\([[:digit:]]+\\)")
	      (setq inode (string-to-number (match-string 1))
		    link (string-to-number (match-string 2))))
	     ((looking-at
	       (concat
		"Access:\\s-+([[:digit:]]+/\\(\\S-+\\))\\s-+"
		"Uid:\\s-+\\([[:digit:]]+\\)\\s-+"
		"Gid:\\s-+\\([[:digit:]]+\\)"))
	      (setq mode (match-string 1)
		    uid (if (equal id-format 'string) (match-string 2)
			  (string-to-number (match-string 2)))
		    gid (if (equal id-format 'string) (match-string 3)
			  (string-to-number (match-string 3)))))
	     ((looking-at
	       (concat
		"Access:\\s-+"
		"\\([[:digit:]]+\\)-\\([[:digit:]]+\\)-\\([[:digit:]]+\\)\\s-+"
		"\\([[:digit:]]+\\):\\([[:digit:]]+\\):\\([[: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
	       (concat
		"Modify:\\s-+"
		"\\([[:digit:]]+\\)-\\([[:digit:]]+\\)-\\([[:digit:]]+\\)\\s-+"
		"\\([[:digit:]]+\\):\\([[:digit:]]+\\):\\([[: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
	       (concat
		"Change:\\s-+"
		"\\([[:digit:]]+\\)-\\([[:digit:]]+\\)-\\([[:digit:]]+\\)\\s-+"
		"\\([[:digit:]]+\\):\\([[:digit:]]+\\):\\([[: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-get-localname vec))))
	    (goto-char (point-min))
	    (and (looking-at ".+ -> \\(.+\\)")
		 (setq id (match-string 1))))

	  ;; Return the result.
	  (when (or id link uid gid atime mtime ctime size mode inode)
	    (list id link uid gid atime mtime ctime size mode nil inode
		  (tramp-get-device vec))))))))