diff options
-rw-r--r-- | coreutils/Config.src | 16 | ||||
-rw-r--r-- | coreutils/stat.c | 81 |
2 files changed, 61 insertions, 36 deletions
diff --git a/coreutils/Config.src b/coreutils/Config.src index ffbef1a31..619c2efe8 100644 --- a/coreutils/Config.src +++ b/coreutils/Config.src @@ -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 diff --git a/coreutils/stat.c b/coreutils/stat.c index f7fd227bb..1a490fef7 100644 --- a/coreutils/stat.c +++ b/coreutils/stat.c @@ -12,54 +12,83 @@ * * 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: ) @@ -71,13 +100,16 @@ //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(); |