stat: make stat -f show filesystem "ID:" as coreutils does

print_statfs                                         358     370     +12
This commit is contained in:
Denis Vlasenko 2008-11-11 22:25:34 +00:00
parent f3c2d13602
commit 98f5cdfca7

View File

@ -139,6 +139,20 @@ static void printfs(char *pformat, const char *msg)
printf(pformat, msg); printf(pformat, msg);
} }
/* "man statfs" says that statfsbuf->f_fsid is a mess */
/* coreutils treats it as an array of ints, most significant first */
static unsigned long long get_f_fsid(const struct statfs *statfsbuf)
{
const unsigned *p = (const void*) &statfsbuf->f_fsid;
unsigned sz = sizeof(statfsbuf->f_fsid) / sizeof(unsigned);
unsigned long long r = 0;
do
r = (r << (sizeof(unsigned)*8)) | *p++;
while (--sz > 0);
return r;
}
/* print statfs info */ /* print statfs info */
static void print_statfs(char *pformat, const char m, static void print_statfs(char *pformat, const char m,
const char *const filename, const void *data const char *const filename, const void *data
@ -148,11 +162,11 @@ static void print_statfs(char *pformat, const char m,
if (m == 'n') { if (m == 'n') {
printfs(pformat, filename); printfs(pformat, filename);
} else if (m == 'i') { } else if (m == 'i') {
strcat(pformat, "Lx"); strcat(pformat, "llx");
printf(pformat, statfsbuf->f_fsid); printf(pformat, get_f_fsid(statfsbuf));
} else if (m == 'l') { } else if (m == 'l') {
strcat(pformat, "lu"); strcat(pformat, "lu");
printf(pformat, statfsbuf->f_namelen); printf(pformat, (unsigned long) (statfsbuf->f_namelen));
} else if (m == 't') { } else if (m == 't') {
strcat(pformat, "lx"); strcat(pformat, "lx");
printf(pformat, (unsigned long) (statfsbuf->f_type)); /* no equiv */ printf(pformat, (unsigned long) (statfsbuf->f_type)); /* no equiv */
@ -349,10 +363,11 @@ static void print_it(const char *masterformat, const char *filename,
#endif #endif
static bool do_statfs(const char *filename, const char *format) static bool do_statfs(const char *filename, const char *format)
{ {
struct statfs statfsbuf;
#if !ENABLE_FEATURE_STAT_FORMAT #if !ENABLE_FEATURE_STAT_FORMAT
const char *format; const char *format;
#endif #endif
struct statfs statfsbuf;
#if ENABLE_SELINUX #if ENABLE_SELINUX
security_context_t scontext = NULL; security_context_t scontext = NULL;
@ -406,10 +421,10 @@ static bool do_statfs(const char *filename, const char *format)
format = (option_mask32 & OPT_TERSE format = (option_mask32 & OPT_TERSE
? "%s %llx %lu " ? "%s %llx %lu "
: " File: \"%s\"\n" : " File: \"%s\"\n"
" ID: %-8Lx Namelen: %-7lu "); " ID: %-8llx Namelen: %-7lu ");
printf(format, printf(format,
filename, filename,
statfsbuf.f_fsid, get_f_fsid(&statfsbuf),
statfsbuf.f_namelen); statfsbuf.f_namelen);
if (option_mask32 & OPT_TERSE) if (option_mask32 & OPT_TERSE)