diff options
-rw-r--r-- | coreutils/stat.c | 181 | ||||
-rw-r--r-- | include/libbb.h | 1 | ||||
-rw-r--r-- | include/platform.h | 16 |
3 files changed, 93 insertions, 105 deletions
diff --git a/coreutils/stat.c b/coreutils/stat.c index bbd2e6a..57f1f14 100644 --- a/coreutils/stat.c +++ b/coreutils/stat.c @@ -12,10 +12,8 @@ * * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ - #include "libbb.h" -/* vars to control behavior */ #define OPT_FILESYS (1 << 0) #define OPT_TERSE (1 << 1) #define OPT_DEREFERENCE (1 << 2) @@ -154,7 +152,7 @@ static void printfs(char *pformat, const char *msg) } /* print statfs info */ -static void print_statfs(char *pformat, const char m, +static void FAST_FUNC print_statfs(char *pformat, const char m, const char *const filename, const void *data IF_SELINUX(, security_context_t scontext)) { @@ -166,34 +164,34 @@ static void print_statfs(char *pformat, const char m, printf(pformat, get_f_fsid(statfsbuf)); } else if (m == 'l') { strcat(pformat, "lu"); - printf(pformat, (unsigned long) (statfsbuf->f_namelen)); + printf(pformat, (unsigned long) statfsbuf->f_namelen); } else if (m == 't') { strcat(pformat, "lx"); - printf(pformat, (unsigned long) (statfsbuf->f_type)); /* no equiv */ + printf(pformat, (unsigned long) statfsbuf->f_type); /* no equiv */ } else if (m == 'T') { printfs(pformat, human_fstype(statfsbuf->f_type)); } else if (m == 'b') { - strcat(pformat, "jd"); - printf(pformat, (intmax_t) (statfsbuf->f_blocks)); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statfsbuf->f_blocks); } else if (m == 'f') { - strcat(pformat, "jd"); - printf(pformat, (intmax_t) (statfsbuf->f_bfree)); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statfsbuf->f_bfree); } else if (m == 'a') { - strcat(pformat, "jd"); - printf(pformat, (intmax_t) (statfsbuf->f_bavail)); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statfsbuf->f_bavail); } else if (m == 's' || m == 'S') { strcat(pformat, "lu"); - printf(pformat, (unsigned long) (statfsbuf->f_bsize)); + printf(pformat, (unsigned long) statfsbuf->f_bsize); } else if (m == 'c') { - strcat(pformat, "jd"); - printf(pformat, (intmax_t) (statfsbuf->f_files)); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statfsbuf->f_files); } else if (m == 'd') { - strcat(pformat, "jd"); - printf(pformat, (intmax_t) (statfsbuf->f_ffree)); -#if ENABLE_SELINUX + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statfsbuf->f_ffree); +# if ENABLE_SELINUX } else if (m == 'C' && (option_mask32 & OPT_SELINUX)) { printfs(pformat, scontext); -#endif +# endif } else { strcatc(pformat, 'c'); printf(pformat, m); @@ -201,7 +199,7 @@ static void print_statfs(char *pformat, const char m, } /* print stat info */ -static void print_stat(char *pformat, const char m, +static void FAST_FUNC print_stat(char *pformat, const char m, const char *const filename, const void *data IF_SELINUX(, security_context_t scontext)) { @@ -227,14 +225,14 @@ static void print_stat(char *pformat, const char m, printf(pformat, filename); } } else if (m == 'd') { - strcat(pformat, "ju"); - printf(pformat, (uintmax_t) statbuf->st_dev); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statbuf->st_dev); } else if (m == 'D') { - strcat(pformat, "jx"); - printf(pformat, (uintmax_t) statbuf->st_dev); + strcat(pformat, "llx"); + printf(pformat, (unsigned long long) statbuf->st_dev); } else if (m == 'i') { - strcat(pformat, "ju"); - printf(pformat, (uintmax_t) statbuf->st_ino); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statbuf->st_ino); } else if (m == 'a') { strcat(pformat, "lo"); printf(pformat, (unsigned long) (statbuf->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO))); @@ -269,14 +267,14 @@ static void print_stat(char *pformat, const char m, strcat(pformat, "lx"); printf(pformat, (unsigned long) minor(statbuf->st_rdev)); } else if (m == 's') { - strcat(pformat, "ju"); - printf(pformat, (uintmax_t) (statbuf->st_size)); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statbuf->st_size); } else if (m == 'B') { strcat(pformat, "lu"); printf(pformat, (unsigned long) 512); //ST_NBLOCKSIZE } else if (m == 'b') { - strcat(pformat, "ju"); - printf(pformat, (uintmax_t) statbuf->st_blocks); + strcat(pformat, "llu"); + printf(pformat, (unsigned long long) statbuf->st_blocks); } else if (m == 'o') { strcat(pformat, "lu"); printf(pformat, (unsigned long) statbuf->st_blksize); @@ -284,31 +282,34 @@ static void print_stat(char *pformat, const char m, printfs(pformat, human_time(statbuf->st_atime)); } else if (m == 'X') { strcat(pformat, TYPE_SIGNED(time_t) ? "ld" : "lu"); - printf(pformat, (unsigned long) statbuf->st_atime); + /* note: (unsigned long) would be wrong: + * imagine (unsigned long64)int32 */ + printf(pformat, (long) statbuf->st_atime); } else if (m == 'y') { printfs(pformat, human_time(statbuf->st_mtime)); } else if (m == 'Y') { strcat(pformat, TYPE_SIGNED(time_t) ? "ld" : "lu"); - printf(pformat, (unsigned long) statbuf->st_mtime); + printf(pformat, (long) statbuf->st_mtime); } else if (m == 'z') { printfs(pformat, human_time(statbuf->st_ctime)); } else if (m == 'Z') { strcat(pformat, TYPE_SIGNED(time_t) ? "ld" : "lu"); - printf(pformat, (unsigned long) statbuf->st_ctime); -#if ENABLE_SELINUX + printf(pformat, (long) statbuf->st_ctime); +# if ENABLE_SELINUX } else if (m == 'C' && (option_mask32 & OPT_SELINUX)) { printfs(pformat, scontext); -#endif +# endif } else { strcatc(pformat, 'c'); printf(pformat, m); } } -static void print_it(const char *masterformat, const char *filename, - void (*print_func) (char*, char, const char*, const void* IF_SELINUX(, security_context_t scontext)), +static void print_it(const char *masterformat, + const char *filename, + void FAST_FUNC (*print_func)(char*, char, const char*, const void* IF_SELINUX(, security_context_t scontext)), const void *data - IF_SELINUX(, security_context_t scontext) ) + IF_SELINUX(, security_context_t scontext)) { /* Create a working copy of the format string */ char *format = xstrdup(masterformat); @@ -355,7 +356,7 @@ static void print_it(const char *masterformat, const char *filename, free(format); free(dest); } -#endif +#endif /* FEATURE_STAT_FORMAT */ /* Stat the file system and print what we find. */ #if !ENABLE_FEATURE_STAT_FORMAT @@ -364,7 +365,6 @@ static void print_it(const char *masterformat, const char *filename, static bool do_statfs(const char *filename, const char *format) { struct statfs statfsbuf; - #if !ENABLE_FEATURE_STAT_FORMAT const char *format; #endif @@ -389,7 +389,7 @@ static bool do_statfs(const char *filename, const char *format) #if ENABLE_FEATURE_STAT_FORMAT if (format == NULL) { -#if !ENABLE_SELINUX +# if !ENABLE_SELINUX format = (option_mask32 & OPT_TERSE ? "%n %i %l %t %s %b %f %a %c %d\n" : " File: \"%n\"\n" @@ -397,7 +397,7 @@ static bool do_statfs(const char *filename, const char *format) "Block size: %-10s\n" "Blocks: Total: %-10b Free: %-10f Available: %a\n" "Inodes: Total: %-10c Free: %d"); -#else +# else format = (option_mask32 & OPT_TERSE ? (option_mask32 & OPT_SELINUX ? "%n %i %l %t %s %b %f %a %c %d %C\n": "%n %i %l %t %s %b %f %a %c %d\n") @@ -414,7 +414,7 @@ static bool do_statfs(const char *filename, const char *format) "Blocks: Total: %-10b Free: %-10f Available: %a\n" "Inodes: Total: %-10c Free: %d\n") ); -#endif /* SELINUX */ +# endif /* SELINUX */ } print_it(format, filename, print_statfs, &statfsbuf IF_SELINUX(, scontext)); #else /* FEATURE_STAT_FORMAT */ @@ -428,47 +428,48 @@ static bool do_statfs(const char *filename, const char *format) statfsbuf.f_namelen); if (option_mask32 & OPT_TERSE) - printf("%lx ", (unsigned long) (statfsbuf.f_type)); + printf("%lx ", (unsigned long) statfsbuf.f_type); else printf("Type: %s\n", human_fstype(statfsbuf.f_type)); -#if !ENABLE_SELINUX +# if !ENABLE_SELINUX format = (option_mask32 & OPT_TERSE - ? "%lu %ld %ld %ld %ld %ld\n" + ? "%lu %llu %llu %llu %llu %llu\n" : "Block size: %-10lu\n" - "Blocks: Total: %-10jd Free: %-10jd Available: %jd\n" - "Inodes: Total: %-10jd Free: %jd\n"); + "Blocks: Total: %-10llu Free: %-10llu Available: %llu\n" + "Inodes: Total: %-10llu Free: %llu\n"); printf(format, - (unsigned long) (statfsbuf.f_bsize), - (intmax_t) (statfsbuf.f_blocks), - (intmax_t) (statfsbuf.f_bfree), - (intmax_t) (statfsbuf.f_bavail), - (intmax_t) (statfsbuf.f_files), - (intmax_t) (statfsbuf.f_ffree)); -#else + (unsigned long) statfsbuf.f_bsize, + (unsigned long long) statfsbuf.f_blocks, + (unsigned long long) statfsbuf.f_bfree, + (unsigned long long) statfsbuf.f_bavail, + (unsigned long long) statfsbuf.f_files, + (unsigned long long) statfsbuf.f_ffree); +# else format = (option_mask32 & OPT_TERSE - ? (option_mask32 & OPT_SELINUX ? "%lu %ld %ld %ld %ld %ld %C\n": - "%lu %ld %ld %ld %ld %ld\n") - : (option_mask32 & OPT_SELINUX ? - "Block size: %-10lu\n" - "Blocks: Total: %-10jd Free: %-10jd Available: %jd\n" - "Inodes: Total: %-10jd Free: %jd" - "S_context: %C\n": - "Block size: %-10lu\n" - "Blocks: Total: %-10jd Free: %-10jd Available: %jd\n" - "Inodes: Total: %-10jd Free: %jd\n")); + ? (option_mask32 & OPT_SELINUX ? "%lu %llu %llu %llu %llu %llu %C\n" : "%lu %llu %llu %llu %llu %llu\n") + : (option_mask32 & OPT_SELINUX + ? "Block size: %-10lu\n" + "Blocks: Total: %-10llu Free: %-10llu Available: %llu\n" + "Inodes: Total: %-10llu Free: %llu" + "S_context: %C\n" + : "Block size: %-10lu\n" + "Blocks: Total: %-10llu Free: %-10llu Available: %llu\n" + "Inodes: Total: %-10llu Free: %llu\n" + ) + ); printf(format, - (unsigned long) (statfsbuf.f_bsize), - (intmax_t) (statfsbuf.f_blocks), - (intmax_t) (statfsbuf.f_bfree), - (intmax_t) (statfsbuf.f_bavail), - (intmax_t) (statfsbuf.f_files), - (intmax_t) (statfsbuf.f_ffree), + (unsigned long) statfsbuf.f_bsize, + (unsigned long long) statfsbuf.f_blocks, + (unsigned long long) statfsbuf.f_bfree, + (unsigned long long) statfsbuf.f_bavail, + (unsigned long long) statfsbuf.f_files, + (unsigned long long) statfsbuf.f_ffree, scontext); if (scontext) freecon(scontext); -#endif +# endif #endif /* FEATURE_STAT_FORMAT */ return 1; } @@ -501,7 +502,7 @@ static bool do_stat(const char *filename, const char *format) #if ENABLE_FEATURE_STAT_FORMAT if (format == NULL) { -#if !ENABLE_SELINUX +# if !ENABLE_SELINUX if (option_mask32 & OPT_TERSE) { format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o"; } else { @@ -522,7 +523,7 @@ static bool do_stat(const char *filename, const char *format) "Access: %x\n" "Modify: %y\n" "Change: %z\n"; } } -#else +# else if (option_mask32 & OPT_TERSE) { format = (option_mask32 & OPT_SELINUX ? "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o %C\n": @@ -558,21 +559,21 @@ static bool do_stat(const char *filename, const char *format) "Access: %x\n" "Modify: %y\n" "Change: %z\n"); } } -#endif +# endif } print_it(format, filename, print_stat, &statbuf IF_SELINUX(, scontext)); #else /* FEATURE_STAT_FORMAT */ if (option_mask32 & OPT_TERSE) { - printf("%s %ju %ju %lx %lu %lu %jx %ju %lu %lx %lx %lu %lu %lu %lu" + printf("%s %llu %llu %lx %lu %lu %llx %llu %lu %lx %lx %lu %lu %lu %lu" IF_NOT_SELINUX("\n"), filename, - (uintmax_t) (statbuf.st_size), - (uintmax_t) statbuf.st_blocks, + (unsigned long long) statbuf.st_size, + (unsigned long long) statbuf.st_blocks, (unsigned long) statbuf.st_mode, (unsigned long) statbuf.st_uid, (unsigned long) statbuf.st_gid, - (uintmax_t) statbuf.st_dev, - (uintmax_t) statbuf.st_ino, + (unsigned long long) statbuf.st_dev, + (unsigned long long) statbuf.st_ino, (unsigned long) statbuf.st_nlink, (unsigned long) major(statbuf.st_rdev), (unsigned long) minor(statbuf.st_rdev), @@ -581,12 +582,12 @@ static bool do_stat(const char *filename, const char *format) (unsigned long) statbuf.st_ctime, (unsigned long) statbuf.st_blksize ); -#if ENABLE_SELINUX +# if ENABLE_SELINUX if (option_mask32 & OPT_SELINUX) printf(" %lc\n", *scontext); else bb_putchar('\n'); -#endif +# endif } else { char *linkname = NULL; @@ -604,15 +605,15 @@ static bool do_stat(const char *filename, const char *format) else printf(" File: \"%s\"\n", filename); - printf(" Size: %-10ju\tBlocks: %-10ju IO Block: %-6lu %s\n" - "Device: %jxh/%jud\tInode: %-10ju Links: %-5lu", - (uintmax_t) (statbuf.st_size), - (uintmax_t) statbuf.st_blocks, + printf(" Size: %-10llu\tBlocks: %-10llu IO Block: %-6lu %s\n" + "Device: %llxh/%llud\tInode: %-10llu Links: %-5lu", + (unsigned long long) statbuf.st_size, + (unsigned long long) statbuf.st_blocks, (unsigned long) statbuf.st_blksize, file_type(&statbuf), - (uintmax_t) statbuf.st_dev, - (uintmax_t) statbuf.st_dev, - (uintmax_t) statbuf.st_ino, + (unsigned long long) statbuf.st_dev, + (unsigned long long) statbuf.st_dev, + (unsigned long long) statbuf.st_ino, (unsigned long) statbuf.st_nlink); if (S_ISBLK(statbuf.st_mode) || S_ISCHR(statbuf.st_mode)) printf(" Device type: %lx,%lx\n", @@ -627,9 +628,9 @@ static bool do_stat(const char *filename, const char *format) (pw_ent != NULL) ? pw_ent->pw_name : "UNKNOWN", (unsigned long) statbuf.st_gid, (gw_ent != NULL) ? gw_ent->gr_name : "UNKNOWN"); -#if ENABLE_SELINUX +# if ENABLE_SELINUX printf(" S_Context: %lc\n", *scontext); -#endif +# endif printf("Access: %s\n" "Modify: %s\n" "Change: %s\n", human_time(statbuf.st_atime), human_time(statbuf.st_mtime), diff --git a/include/libbb.h b/include/libbb.h index 09852d0..3b7eea2 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -20,6 +20,7 @@ #include <netdb.h> #include <setjmp.h> #include <signal.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> diff --git a/include/platform.h b/include/platform.h index a41daa0..c34a46e 100644 --- a/include/platform.h +++ b/include/platform.h @@ -215,6 +215,7 @@ #ifndef __APPLE__ # include <arpa/inet.h> # if !defined(__socklen_t_defined) && !defined(_SOCKLEN_T_DECLARED) +# define socklen_t bb_socklen_t typedef int socklen_t; # endif #else @@ -250,21 +251,6 @@ typedef int socklen_t; #if defined __GLIBC__ || defined __UCLIBC__ \ || defined __dietlibc__ || defined _NEWLIB_VERSION # include <features.h> -# define HAVE_FEATURES_H -# include <stdint.h> -# define HAVE_STDINT_H -#elif !defined __APPLE__ -/* Largest integral types. */ -# if BB_BIG_ENDIAN -/* Looks BROKEN! */ -typedef long intmax_t; -typedef unsigned long uintmax_t; -# else -__extension__ -typedef long long intmax_t; -__extension__ -typedef unsigned long long uintmax_t; -# endif #endif /* Size-saving "small" ints (arch-dependent) */ |