From e2ad5c6c155ef63833f6d3774b607c314fbe8987 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 22 Feb 2021 14:19:31 -0800 Subject: stat: fix macOS build and behavior. My patch to fix df behavior on macOS broke the stat build on macOS. First off, we had %s and %S the wrong way round compared to coreutils, though since Linux always seems to use the same value for both, no-one will ever have noticed. Annoyingly, Linux and macOS disagree about what statfs::f_bsize means, and whether statfs::f_iosize and statfs::f_frsize exist (each has one or the other, depending on what f_bsize *doesn't* mean to them). This mess is presumably why statvfs exists. Unfortunately, statvfs on macOS at least doesn't contain the file system type information. So we either need to do *both* statfs() and statvfs() for macOS, or we need to take into account the different fields. This patch adds an #ifdef outside of portability.h because I wasn't sure we actually wanted to add statfs_best_transfer_size() and statfs_real_block_size() functions to lib for this. But that's an easy cleanup if desired. --- toys/other/stat.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'toys/other') diff --git a/toys/other/stat.c b/toys/other/stat.c index 37dd1808..6d5fc018 100644 --- a/toys/other/stat.c +++ b/toys/other/stat.c @@ -33,8 +33,8 @@ config STAT The valid format escape sequences for filesystems: %a Available blocks |%b Total blocks |%c Total inodes %d Free inodes |%f Free blocks |%i File system ID - %l Max filename length |%n File name |%s Fragment size - %S Best transfer size |%t FS type (hex) |%T FS type (driver name) + %l Max filename length |%n File name |%s Best transfer size + %S Actual block size |%t FS type (hex) |%T FS type (driver name) */ #define FOR_stat @@ -157,8 +157,14 @@ static void print_statfs(char type) { sprintf(buf, "%08x%08x", val[0], val[1]); strout(buf); - } else if (type == 's') out('d', statfs->f_frsize); + } +#ifdef __APPLE__ + else if (type == 's') out('d', statfs->f_iosize); else if (type == 'S') out('d', statfs->f_bsize); +#else + else if (type == 's') out('d', statfs->f_bsize); + else if (type == 'S') out('d', statfs->f_frsize); +#endif else strout("?"); } -- cgit v1.2.3