]> granicus.if.org Git - esp-idf/commitdiff
Merge branch 'bugfix/fatfs_stat' into 'master'
authorIvan Grokhotkov <ivan@espressif.com>
Wed, 13 Dec 2017 03:10:27 +0000 (11:10 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Wed, 13 Dec 2017 03:10:27 +0000 (11:10 +0800)
Fix stat behavior for FATFS mount point

See merge request !1652

1  2 
components/fatfs/src/vfs_fat.c

index b1192b602cfd07eca212564e1ccce884ad330760,6b0180cb4d56cdf628c8cf6fef51ac7306ff4858..556492e3ed928298e065bc4cdbf1aa337e860003
@@@ -408,25 -439,21 +442,23 @@@ static int vfs_fat_stat(void* ctx, cons
          errno = fresult_to_errno(res);
          return -1;
      }
+     memset(st, 0, sizeof(*st));
      st->st_size = info.fsize;
-     st->st_mode = S_IRWXU | S_IRWXG | S_IRWXO |
-             ((info.fattrib & AM_DIR) ? S_IFDIR : S_IFREG);
-     struct tm tm;
-     uint16_t fdate = info.fdate;
-     tm.tm_mday = fdate & 0x1f;
-     fdate >>= 5;
-     tm.tm_mon = (fdate & 0xf) - 1;
-     fdate >>=4;
-     tm.tm_year = fdate + 80;
-     uint16_t ftime = info.ftime;
-     tm.tm_sec = (ftime & 0x1f) * 2;
-     ftime >>= 5;
-     tm.tm_min = (ftime & 0x3f);
-     ftime >>= 6;
-     tm.tm_hour = (ftime & 0x1f);
+     st->st_mode = get_stat_mode((info.fattrib & AM_DIR) != 0);
+     fat_date_t fdate = { .as_int = info.fdate };
+     fat_time_t ftime = { .as_int = info.ftime };
+     struct tm tm = {
+         .tm_mday = fdate.mday,
+         .tm_mon = fdate.mon - 1,    /* unlike tm_mday, tm_mon is zero-based */
+         .tm_year = fdate.year + 80,
+         .tm_sec = ftime.sec * 2,
+         .tm_min = ftime.min,
+         .tm_hour = ftime.hour
+     };
      st->st_mtime = mktime(&tm);
 +    st->st_atime = 0;
 +    st->st_ctime = 0;
      return 0;
  }