X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=statfs.c;h=00dd04c4e49165570879bd4e5b2f1a72b4358750;hb=45afd0c7a36a4edf486f0001507871d39c76560b;hp=214e6b2a813a29f70f20eb297eec57c127c26d26;hpb=babe7f6a30d3d7061b94299f41e338000737abf3;p=strace diff --git a/statfs.c b/statfs.c index 214e6b2a..00dd04c4 100644 --- a/statfs.c +++ b/statfs.c @@ -1,226 +1,12 @@ #include "defs.h" -#ifdef HAVE_SYS_VFS_H -# include -#endif -#include "xlat/fsmagic.h" -static const char * -sprintfstype(const unsigned int magic) -{ - static char buf[32]; - const char *s; - - s = xlat_search(fsmagic, ARRAY_SIZE(fsmagic), magic); - if (s) { - sprintf(buf, "\"%s\"", s); - return buf; - } - sprintf(buf, "%#x", magic); - return buf; -} - -static void -printstatfs(struct tcb *tcp, const long addr) -{ - struct statfs statbuf; - - if (syserror(tcp) || !verbose(tcp)) { - tprintf("%#lx", addr); - return; - } - if (umove(tcp, addr, &statbuf) < 0) { - tprints("{...}"); - return; - } - tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%lu, f_bfree=%lu, ", - sprintfstype(statbuf.f_type), - (unsigned long)statbuf.f_bsize, - (unsigned long)statbuf.f_blocks, - (unsigned long)statbuf.f_bfree); - tprintf("f_bavail=%lu, f_files=%lu, f_ffree=%lu, f_fsid={%d, %d}", - (unsigned long)statbuf.f_bavail, - (unsigned long)statbuf.f_files, - (unsigned long)statbuf.f_ffree, - statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]); - tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen); -#ifdef _STATFS_F_FRSIZE - tprintf(", f_frsize=%lu", (unsigned long)statbuf.f_frsize); -#endif -#ifdef _STATFS_F_FLAGS - tprintf(", f_flags=%lu", (unsigned long)statbuf.f_flags); -#endif - tprints("}"); -} - -int -sys_statfs(struct tcb *tcp) +SYS_FUNC(statfs) { if (entering(tcp)) { printpath(tcp, tcp->u_arg[0]); tprints(", "); } else { - printstatfs(tcp, tcp->u_arg[1]); - } - return 0; -} - -int -sys_fstatfs(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - } else { - printstatfs(tcp, tcp->u_arg[1]); - } - return 0; -} - -#ifdef HAVE_STRUCT_STATFS64 -static void -printstatfs64(struct tcb *tcp, long addr) -{ - struct statfs64 statbuf; - - if (syserror(tcp) || !verbose(tcp)) { - tprintf("%#lx", addr); - return; - } - if (umove(tcp, addr, &statbuf) < 0) { - tprints("{...}"); - return; - } - tprintf("{f_type=%s, f_bsize=%llu, f_blocks=%llu, f_bfree=%llu, ", - sprintfstype(statbuf.f_type), - (unsigned long long)statbuf.f_bsize, - (unsigned long long)statbuf.f_blocks, - (unsigned long long)statbuf.f_bfree); - tprintf("f_bavail=%llu, f_files=%llu, f_ffree=%llu, f_fsid={%d, %d}", - (unsigned long long)statbuf.f_bavail, - (unsigned long long)statbuf.f_files, - (unsigned long long)statbuf.f_ffree, - statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]); - tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen); -#ifdef _STATFS_F_FRSIZE - tprintf(", f_frsize=%llu", (unsigned long long)statbuf.f_frsize); -#endif -#ifdef _STATFS_F_FLAGS - tprintf(", f_flags=%llu", (unsigned long long)statbuf.f_flags); -#endif - tprints("}"); -} - -struct compat_statfs64 { - uint32_t f_type; - uint32_t f_bsize; - uint64_t f_blocks; - uint64_t f_bfree; - uint64_t f_bavail; - uint64_t f_files; - uint64_t f_ffree; - fsid_t f_fsid; - uint32_t f_namelen; - uint32_t f_frsize; - uint32_t f_flags; - uint32_t f_spare[4]; -} -#if defined AARCH64 || defined X86_64 || defined X32 || defined IA64 - __attribute__ ((packed, aligned(4))) -#endif -; -#if defined AARCH64 || defined ARM -/* See arch/arm/kernel/sys_oabi-compat.c for details. */ -# define COMPAT_STATFS64_PADDED_SIZE (sizeof(struct compat_statfs64) + 4) -#endif - -static void -printcompat_statfs64(struct tcb *tcp, const long addr) -{ - struct compat_statfs64 statbuf; - - if (syserror(tcp) || !verbose(tcp)) { - tprintf("%#lx", addr); - return; - } - if (umove(tcp, addr, &statbuf) < 0) { - tprints("{...}"); - return; - } - tprintf("{f_type=%s, f_bsize=%lu, f_blocks=%llu, f_bfree=%llu, ", - sprintfstype(statbuf.f_type), - (unsigned long)statbuf.f_bsize, - (unsigned long long)statbuf.f_blocks, - (unsigned long long)statbuf.f_bfree); - tprintf("f_bavail=%llu, f_files=%llu, f_ffree=%llu, f_fsid={%d, %d}", - (unsigned long long)statbuf.f_bavail, - (unsigned long long)statbuf.f_files, - (unsigned long long)statbuf.f_ffree, - statbuf.f_fsid.__val[0], statbuf.f_fsid.__val[1]); - tprintf(", f_namelen=%lu", (unsigned long)statbuf.f_namelen); - tprintf(", f_frsize=%lu", (unsigned long)statbuf.f_frsize); - tprintf(", f_flags=%lu}", (unsigned long)statbuf.f_frsize); -} - -static int -do_statfs64_fstatfs64(struct tcb *tcp) -{ - if (entering(tcp)) { - tprintf(", %lu, ", tcp->u_arg[1]); - } else { - if (tcp->u_arg[1] == sizeof(struct statfs64)) - printstatfs64(tcp, tcp->u_arg[2]); - else if (tcp->u_arg[1] == sizeof(struct compat_statfs64) -#ifdef COMPAT_STATFS64_PADDED_SIZE - || tcp->u_arg[1] == COMPAT_STATFS64_PADDED_SIZE -#endif - ) - printcompat_statfs64(tcp, tcp->u_arg[2]); - else - tprints("{???}"); - } - return 0; -} - -int -sys_statfs64(struct tcb *tcp) -{ - if (entering(tcp)) - printpath(tcp, tcp->u_arg[0]); - return do_statfs64_fstatfs64(tcp); -} - -int -sys_fstatfs64(struct tcb *tcp) -{ - if (entering(tcp)) - printfd(tcp, tcp->u_arg[0]); - return do_statfs64_fstatfs64(tcp); -} -#endif /* HAVE_STRUCT_STATFS64 */ - -#ifdef ALPHA -int -osf_statfs(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - } else { - printstatfs(tcp, tcp->u_arg[1]); - tprintf(", %lu", tcp->u_arg[2]); - } - return 0; -} - -int -osf_fstatfs(struct tcb *tcp) -{ - if (entering(tcp)) { - tprintf("%lu, ", tcp->u_arg[0]); - } else { - printstatfs(tcp, tcp->u_arg[1]); - tprintf(", %lu", tcp->u_arg[2]); + print_struct_statfs(tcp, tcp->u_arg[1]); } return 0; } -#endif /* ALPHA */