E.g. this allows comparing file ages on EFI system partitions. Signed-off-by: David Michael <fedora....@gmail.com> ---
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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel