]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fs: fat: add file attributes to struct fs_dirent
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 15 May 2021 20:06:16 +0000 (22:06 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 12 Jul 2021 18:30:48 +0000 (20:30 +0200)
When reading a directory in the UEFI file system we have to return file
attributes and timestamps. Copy this data to the directory entry structure.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
fs/fat/fat.c
include/fs.h

index c561d82b3514070621f535ee5d9607d4425cd78a..7021138b9874be25100954f39bfbc25cffb30102 100644 (file)
@@ -1187,6 +1187,28 @@ out:
        return ret == 0;
 }
 
+/**
+ * fat2rtc() - convert FAT time stamp to RTC file stamp
+ *
+ * @date:      FAT date
+ * @time:      FAT time
+ * @tm:                RTC time stamp
+ */
+static void __maybe_unused fat2rtc(u16 date, u16 time, struct rtc_time *tm)
+{
+       tm->tm_mday = date & 0x1f;
+       tm->tm_mon = (date & 0x1e0) >> 4;
+       tm->tm_year = (date >> 9) + 1980;
+
+       tm->tm_sec = (time & 0x1f) << 1;
+       tm->tm_min = (time & 0x7e0) >> 5;
+       tm->tm_hour = time >> 11;
+
+       rtc_calc_weekday(tm);
+       tm->tm_yday = 0;
+       tm->tm_isdst = 0;
+}
+
 int fat_size(const char *filename, loff_t *size)
 {
        fsdata fsdata;
@@ -1325,7 +1347,15 @@ int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp)
 
        memset(dent, 0, sizeof(*dent));
        strcpy(dent->name, dir->itr.name);
-
+       if (CONFIG_IS_ENABLED(EFI_LOADER)) {
+               dent->attr = dir->itr.dent->attr;
+               fat2rtc(le16_to_cpu(dir->itr.dent->cdate),
+                       le16_to_cpu(dir->itr.dent->ctime), &dent->create_time);
+               fat2rtc(le16_to_cpu(dir->itr.dent->date),
+                       le16_to_cpu(dir->itr.dent->time), &dent->change_time);
+               fat2rtc(le16_to_cpu(dir->itr.dent->adate),
+                       0, &dent->access_time);
+       }
        if (fat_itr_isdir(&dir->itr)) {
                dent->type = FS_DT_DIR;
        } else {
index 0794b50d102a91378d4640522acba8ad94cf178e..1c79e299fdd5a100d4967da7a0f921c57b73b2c5 100644 (file)
@@ -6,6 +6,7 @@
 #define _FS_H
 
 #include <common.h>
+#include <rtc.h>
 
 struct cmd_tbl;
 
@@ -160,13 +161,26 @@ int fs_write(const char *filename, ulong addr, loff_t offset, loff_t len,
 #define FS_DT_REG  8         /* regular file */
 #define FS_DT_LNK  10        /* symbolic link */
 
-/*
- * A directory entry, returned by fs_readdir().  Returns information
+/**
+ * struct fs_dirent - directory entry
+ *
+ * A directory entry, returned by fs_readdir(). Returns information
  * about the file/directory at the current directory entry position.
  */
 struct fs_dirent {
-       unsigned type;       /* one of FS_DT_x (not a mask) */
-       loff_t size;         /* size in bytes */
+       /** @type:              one of FS_DT_x (not a mask) */
+       unsigned int type;
+       /** @size:              file size */
+       loff_t size;
+       /** @flags:             attribute flags (FS_ATTR_*) */
+       u32 attr;
+       /** create_time:        time of creation */
+       struct rtc_time create_time;
+       /** access_time:        time of last access */
+       struct rtc_time access_time;
+       /** change_time:        time of last modification */
+       struct rtc_time change_time;
+       /** name:               file name */
        char name[256];
 };