grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] fat: Support file modification times


From: David Michael
Subject: [PATCH] fat: Support file modification times
Date: Fri, 28 Feb 2020 23:25:43 -0500

E.g. this allows comparing file ages on EFI system partitions.

Signed-off-by: David Michael <address@hidden>
---

Hi,

I tried to make a quick patch for #57621 based on the FAT timestamp
format as described on Wikipedia.  Is there still a chance to fix this
issue for 2.06?

Thanks.

David

P.S.  I also made a timestamp conversion for exfat as well, but I didn't
test it and it's outside the scope of my ESP issue, so I didn't include
it.  I'll paste it here in case someone wants it in the future.

static int
grub_fat_timestamp (grub_uint32_t field, grub_uint8_t usec, grub_int32_t *nix) {
  struct grub_datetime structured = {
    .year   = (field >> 25) + 1980,
    .month  = (field & 0x01E00000) >> 21,
    .day    = (field & 0x001F0000) >> 16,
    .hour   = (field & 0x0000F800) >> 11,
    .minute = (field & 0x000007E0) >>  5,
    .second = (field & 0x0000001F) * 2 + (usec >= 100 ? 1 : 0),
  };

  /* The conversion below allows seconds=60, so don't trust its validation.  */
  if ((field & 0x1F) > 29)
    return 0;

  /* Validate the 10-msec field even though it is rounded down to seconds.  */
  if (usec > 199)
    return 0;

  return grub_datetime2unixtime (&structured, nix);
}

 grub-core/fs/fat.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/grub-core/fs/fat.c b/grub-core/fs/fat.c
index d544e0af1..b0efb6cbf 100644
--- a/grub-core/fs/fat.c
+++ b/grub-core/fs/fat.c
@@ -26,6 +26,7 @@
 #include <grub/err.h>
 #include <grub/dl.h>
 #include <grub/charset.h>
+#include <grub/datetime.h>
 #ifndef MODE_EXFAT
 #include <grub/fat.h>
 #else
@@ -856,6 +857,24 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
   return grub_errno ? : GRUB_ERR_EOF;
 }
 
+static int
+grub_fat_timestamp (grub_uint16_t time, grub_uint16_t date, grub_int32_t *nix) 
{
+  struct grub_datetime structured = {
+    .year   = (date >> 9) + 1980,
+    .month  = (date & 0x01E0) >> 5,
+    .day    = (date & 0x001F),
+    .hour   = (time >> 11),
+    .minute = (time & 0x07E0) >> 5,
+    .second = (time & 0x001F) * 2,
+  };
+
+  /* The conversion below allows seconds=60, so don't trust its validation.  */
+  if ((time & 0x1F) > 29)
+    return 0;
+
+  return grub_datetime2unixtime (&structured, nix);
+}
+
 #endif
 
 static grub_err_t lookup_file (grub_fshelp_node_t node,
@@ -968,6 +987,9 @@ grub_fat_dir (grub_device_t device, const char *path, 
grub_fs_dir_hook_t hook,
 #else
       if (ctxt.dir.attr & GRUB_FAT_ATTR_VOLUME_ID)
        continue;
+      info.mtimeset = grub_fat_timestamp (grub_le_to_cpu16 (ctxt.dir.w_time),
+                                          grub_le_to_cpu16 (ctxt.dir.w_date),
+                                          &info.mtime);
 #endif
 
       if (hook (ctxt.filename, &info, hook_data))
-- 
2.21.1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]