grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] fat: Support file modification times


From: Daniel Kiper
Subject: Re: [PATCH] fat: Support file modification times
Date: Tue, 3 Mar 2020 14:44:16 +0100
User-agent: NeoMutt/20170113 (1.7.2)

On Fri, Feb 28, 2020 at 11:25:43PM -0500, David Michael wrote:
> 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?

Sure thing!

> Thanks.
>
> David
>
> P.S.  I also made a timestamp conversion for exfat as well, but I didn't

Please fix exFAT too...

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

...and add your SOB.

>  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 = {

Hmmm... What does structured means?

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

Otherwise LGTM...

Daniel



reply via email to

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