]> granicus.if.org Git - strace/blob - print_statfs.c
Add support for long options
[strace] / print_statfs.c
1 /*
2  * Copyright (c) 2014-2018 Dmitry V. Levin <ldv@altlinux.org>
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: LGPL-2.1-or-later
6  */
7
8 #include "defs.h"
9 #include "statfs.h"
10 #include "xlat/fsmagic.h"
11 #include "xlat/statfs_flags.h"
12
13 static void
14 print_statfs_type(const char *const prefix, const unsigned long long magic)
15 {
16         tprints(prefix);
17         printxval(fsmagic, magic, NULL);
18 }
19
20 #if defined HAVE_STRUCT_STATFS_F_FLAGS || defined HAVE_STRUCT_STATFS64_F_FLAGS
21 static void
22 print_statfs_flags(const char *const prefix, const unsigned long long flags)
23 {
24         if (flags & ST_VALID) {
25                 tprints(prefix);
26                 printflags64(statfs_flags, flags, "ST_???");
27         }
28 }
29 #endif /* HAVE_STRUCT_STATFS_F_FLAGS || HAVE_STRUCT_STATFS64_F_FLAGS */
30
31 static void
32 print_statfs_number(const char *const prefix, const unsigned long long number)
33 {
34         tprints(prefix);
35         tprintf("%llu",  number);
36 }
37
38 void
39 print_struct_statfs(struct tcb *const tcp, const kernel_ulong_t addr)
40 {
41 #ifdef HAVE_STRUCT_STATFS
42         struct strace_statfs b;
43
44         if (!fetch_struct_statfs(tcp, addr, &b))
45                 return;
46
47         print_statfs_type("{f_type=", b.f_type);
48         print_statfs_number(", f_bsize=", b.f_bsize);
49         print_statfs_number(", f_blocks=", b.f_blocks);
50         print_statfs_number(", f_bfree=", b.f_bfree);
51         print_statfs_number(", f_bavail=", b.f_bavail);
52         print_statfs_number(", f_files=", b.f_files);
53         print_statfs_number(", f_ffree=", b.f_ffree);
54 # if defined HAVE_STRUCT_STATFS_F_FSID_VAL \
55   || defined HAVE_STRUCT_STATFS_F_FSID___VAL
56         print_statfs_number(", f_fsid={val=[", b.f_fsid[0]);
57         print_statfs_number(", ", b.f_fsid[1]);
58         tprints("]}");
59 # endif
60         print_statfs_number(", f_namelen=", b.f_namelen);
61 # ifdef HAVE_STRUCT_STATFS_F_FRSIZE
62         print_statfs_number(", f_frsize=", b.f_frsize);
63 # endif
64 # ifdef HAVE_STRUCT_STATFS_F_FLAGS
65         print_statfs_flags(", f_flags=", b.f_flags);
66 # endif
67         tprints("}");
68 #else
69         printaddr(addr);
70 #endif
71 }
72
73 void
74 print_struct_statfs64(struct tcb *const tcp, const kernel_ulong_t addr,
75                       const kernel_ulong_t size)
76 {
77 #ifdef HAVE_STRUCT_STATFS64
78         struct strace_statfs b;
79
80         if (!fetch_struct_statfs64(tcp, addr, size, &b))
81                 return;
82
83         print_statfs_type("{f_type=", b.f_type);
84         print_statfs_number(", f_bsize=", b.f_bsize);
85         print_statfs_number(", f_blocks=", b.f_blocks);
86         print_statfs_number(", f_bfree=", b.f_bfree);
87         print_statfs_number(", f_bavail=", b.f_bavail);
88         print_statfs_number(", f_files=", b.f_files);
89         print_statfs_number(", f_ffree=", b.f_ffree);
90 # if defined HAVE_STRUCT_STATFS64_F_FSID_VAL \
91   || defined HAVE_STRUCT_STATFS64_F_FSID___VAL
92         print_statfs_number(", f_fsid={val=[", b.f_fsid[0]);
93         print_statfs_number(", ", b.f_fsid[1]);
94         tprints("]}");
95 # endif
96         print_statfs_number(", f_namelen=", b.f_namelen);
97 # ifdef HAVE_STRUCT_STATFS64_F_FRSIZE
98         print_statfs_number(", f_frsize=", b.f_frsize);
99 # endif
100 # ifdef HAVE_STRUCT_STATFS64_F_FLAGS
101         print_statfs_flags(", f_flags=", b.f_flags);
102 # endif
103         tprints("}");
104 #else
105         printaddr(addr);
106 #endif
107 }