stat: make -f optional. This allows to build stat for non-linux systems
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Oct 2015 21:10:44 +0000 (22:10 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 30 Oct 2015 21:10:44 +0000 (22:10 +0100)
function                                             old     new   delta
packed_usage                                       30761   30706     -55

Based on the patch by Ron Yorston.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/Config.src
coreutils/stat.c

index ffbef1a315d177f37ba53ad3e896bbcd76b7698c..619c2efe83fea4656121534e61f48d6b99373b23 100644 (file)
@@ -543,22 +543,6 @@ config FEATURE_SPLIT_FANCY
          Supports additional suffixes 'b' for 512 bytes,
          'g' for 1GiB for the -b option.
 
-config STAT
-       bool "stat"
-       default y
-       select PLATFORM_LINUX # statfs()
-       help
-         display file or filesystem status.
-
-config FEATURE_STAT_FORMAT
-       bool "Enable custom formats (-c)"
-       default y
-       depends on STAT
-       help
-         Without this, stat will not support the '-c format' option where
-         users can pass a custom format string for output. This adds about
-         7k to a nonstatic build on amd64.
-
 config STTY
        bool "stty"
        default y
index f7fd227bb1933fb0ac6b141afc3dbcdc4b241c0c..1a490fef74b7276181a2e3d3320f7858b422c735 100644 (file)
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
+//config:config STAT
+//config:      bool "stat"
+//config:      default y
+//config:      help
+//config:        display file or filesystem status.
+//config:
+//config:config FEATURE_STAT_FORMAT
+//config:      bool "Enable custom formats (-c)"
+//config:      default y
+//config:      depends on STAT
+//config:      help
+//config:        Without this, stat will not support the '-c format' option where
+//config:        users can pass a custom format string for output. This adds about
+//config:        7k to a nonstatic build on amd64.
+//config:
+//config:config FEATURE_STAT_FILESYSTEM
+//config:      bool "Enable display of filesystem status (-f)"
+//config:      default y
+//config:      depends on STAT
+//config:      select PLATFORM_LINUX # statfs()
+//config:      help
+//config:        Without this, stat will not support the '-f' option to display
+//config:        information about filesystem status.
+
 
 //usage:#define stat_trivial_usage
 //usage:       "[OPTIONS] FILE..."
 //usage:#define stat_full_usage "\n\n"
-//usage:       "Display file (default) or filesystem status\n"
+//usage:       "Display file"
+//usage:            IF_FEATURE_STAT_FILESYSTEM(" (default) or filesystem")
+//usage:            " status\n"
 //usage:       IF_FEATURE_STAT_FORMAT(
-//usage:     "\n       -c fmt  Use the specified format"
+//usage:     "\n       -c FMT  Use the specified format"
 //usage:       )
+//usage:       IF_FEATURE_STAT_FILESYSTEM(
 //usage:     "\n       -f      Display filesystem status"
+//usage:       )
 //usage:     "\n       -L      Follow links"
-//usage:     "\n       -t      Display info in terse form"
+//usage:     "\n       -t      Terse display"
 //usage:       IF_SELINUX(
 //usage:     "\n       -Z      Print security context"
 //usage:       )
 //usage:       IF_FEATURE_STAT_FORMAT(
-//usage:       "\n\nValid format sequences for files:\n"
+//usage:       "\n\nFMT sequences"IF_FEATURE_STAT_FILESYSTEM(" for files")":\n"
 //usage:       " %a    Access rights in octal\n"
 //usage:       " %A    Access rights in human readable form\n"
 //usage:       " %b    Number of blocks allocated (see %B)\n"
-//usage:       " %B    The size in bytes of each block reported by %b\n"
+//usage:       " %B    Size in bytes of each block reported by %b\n"
 //usage:       " %d    Device number in decimal\n"
 //usage:       " %D    Device number in hex\n"
 //usage:       " %f    Raw mode in hex\n"
 //usage:       " %F    File type\n"
-//usage:       " %g    Group ID of owner\n"
-//usage:       " %G    Group name of owner\n"
+//usage:       " %g    Group ID\n"
+//usage:       " %G    Group name\n"
 //usage:       " %h    Number of hard links\n"
 //usage:       " %i    Inode number\n"
 //usage:       " %n    File name\n"
 //usage:       " %N    File name, with -> TARGET if symlink\n"
 //usage:       " %o    I/O block size\n"
-//usage:       " %s    Total size, in bytes\n"
+//usage:       " %s    Total size in bytes\n"
 //usage:       " %t    Major device type in hex\n"
 //usage:       " %T    Minor device type in hex\n"
-//usage:       " %u    User ID of owner\n"
-//usage:       " %U    User name of owner\n"
+//usage:       " %u    User ID\n"
+//usage:       " %U    User name\n"
 //usage:       " %x    Time of last access\n"
 //usage:       " %X    Time of last access as seconds since Epoch\n"
 //usage:       " %y    Time of last modification\n"
 //usage:       " %Y    Time of last modification as seconds since Epoch\n"
 //usage:       " %z    Time of last change\n"
 //usage:       " %Z    Time of last change as seconds since Epoch\n"
-//usage:       "\nValid format sequences for file systems:\n"
+//usage:       IF_FEATURE_STAT_FILESYSTEM(
+//usage:       "\nFMT sequences for file systems:\n"
 //usage:       " %a    Free blocks available to non-superuser\n"
-//usage:       " %b    Total data blocks in file system\n"
-//usage:       " %c    Total file nodes in file system\n"
-//usage:       " %d    Free file nodes in file system\n"
-//usage:       " %f    Free blocks in file system\n"
+//usage:       " %b    Total data blocks\n"
+//usage:       " %c    Total file nodes\n"
+//usage:       " %d    Free file nodes\n"
+//usage:       " %f    Free blocks\n"
 //usage:       IF_SELINUX(
 //usage:       " %C    Security context in selinux\n"
 //usage:       )
 //usage:       " %t    Type in hex\n"
 //usage:       " %T    Type in human readable form"
 //usage:       )
+//usage:       )
 
 #include "libbb.h"
 
-#define OPT_FILESYS     (1 << 0)
-#define OPT_TERSE       (1 << 1)
-#define OPT_DEREFERENCE (1 << 2)
-#define OPT_SELINUX     (1 << 3)
+enum {
+       OPT_TERSE       = (1 << 0),
+       OPT_DEREFERENCE = (1 << 1),
+       OPT_FILESYS     = (1 << 2) * ENABLE_FEATURE_STAT_FILESYSTEM,
+       OPT_SELINUX     = (1 << (2+ENABLE_FEATURE_STAT_FILESYSTEM)) * ENABLE_SELINUX,
+};
 
 #if ENABLE_FEATURE_STAT_FORMAT
 typedef bool (*statfunc_ptr)(const char *, const char *);
@@ -132,6 +164,7 @@ static const char *human_time(time_t t)
 #undef buf
 }
 
+#if ENABLE_FEATURE_STAT_FILESYSTEM
 /* Return the type of the specified file system.
  * Some systems have statfvs.f_basetype[FSTYPSZ]. (AIX, HP-UX, and Solaris)
  * Others have statfs.f_fstypename[MFSNAMELEN]. (NetBSD 1.5.2)
@@ -202,6 +235,7 @@ static unsigned long long get_f_fsid(const struct statfs *statfsbuf)
        while (--sz > 0);
        return r;
 }
+#endif  /* FEATURE_STAT_FILESYSTEM */
 
 #if ENABLE_FEATURE_STAT_FORMAT
 static void strcatc(char *str, char c)
@@ -217,6 +251,7 @@ static void printfs(char *pformat, const char *msg)
        printf(pformat, msg);
 }
 
+#if ENABLE_FEATURE_STAT_FILESYSTEM
 /* print statfs info */
 static void FAST_FUNC print_statfs(char *pformat, const char m,
                const char *const filename, const void *data
@@ -263,6 +298,7 @@ static void FAST_FUNC print_statfs(char *pformat, const char m,
                printf(pformat, m);
        }
 }
+#endif
 
 /* print stat info */
 static void FAST_FUNC print_stat(char *pformat, const char m,
@@ -423,6 +459,7 @@ static void print_it(const char *masterformat,
 }
 #endif  /* FEATURE_STAT_FORMAT */
 
+#if ENABLE_FEATURE_STAT_FILESYSTEM
 /* Stat the file system and print what we find.  */
 #if !ENABLE_FEATURE_STAT_FORMAT
 #define do_statfs(filename, format) do_statfs(filename)
@@ -538,6 +575,7 @@ static bool do_statfs(const char *filename, const char *format)
 #endif  /* FEATURE_STAT_FORMAT */
        return 1;
 }
+#endif  /* FEATURE_STAT_FILESYSTEM */
 
 /* stat the file and print what we find */
 #if !ENABLE_FEATURE_STAT_FORMAT
@@ -721,12 +759,15 @@ int stat_main(int argc UNUSED_PARAM, char **argv)
        statfunc_ptr statfunc = do_stat;
 
        opt_complementary = "-1"; /* min one arg */
-       opts = getopt32(argv, "ftL"
+       opts = getopt32(argv, "tL"
+               IF_FEATURE_STAT_FILESYSTEM("f")
                IF_SELINUX("Z")
                IF_FEATURE_STAT_FORMAT("c:", &format)
        );
+#if ENABLE_FEATURE_STAT_FILESYSTEM
        if (opts & OPT_FILESYS) /* -f */
                statfunc = do_statfs;
+#endif
 #if ENABLE_SELINUX
        if (opts & OPT_SELINUX) {
                selinux_or_die();