]> granicus.if.org Git - strace/blob - xattr.c
tests: fix format warnings on x32
[strace] / xattr.c
1 /*
2  * Copyright (c) 2002-2005 Roland McGrath <roland@redhat.com>
3  * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
4  * Copyright (c) 2005-2018 Dmitry V. Levin <ldv@altlinux.org>
5  * All rights reserved.
6  *
7  * SPDX-License-Identifier: LGPL-2.1-or-later
8  */
9
10 #include "defs.h"
11
12 #ifdef HAVE_SYS_XATTR_H
13 # include <sys/xattr.h>
14 #endif
15
16 #include "xlat/xattrflags.h"
17
18 #ifndef XATTR_SIZE_MAX
19 # define XATTR_SIZE_MAX 65536
20 #endif
21
22 static void
23 print_xattr_val(struct tcb *const tcp,
24                 const kernel_ulong_t addr,
25                 const kernel_ulong_t insize,
26                 const kernel_ulong_t size)
27 {
28         tprints(", ");
29
30         if (size > XATTR_SIZE_MAX)
31                 printaddr(addr);
32         else
33                 printstr_ex(tcp, addr, size, QUOTE_OMIT_TRAILING_0);
34         tprintf(", %" PRI_klu, insize);
35 }
36
37 SYS_FUNC(setxattr)
38 {
39         printpath(tcp, tcp->u_arg[0]);
40         tprints(", ");
41         printstr(tcp, tcp->u_arg[1]);
42         print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
43         tprints(", ");
44         printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
45         return RVAL_DECODED;
46 }
47
48 SYS_FUNC(fsetxattr)
49 {
50         printfd(tcp, tcp->u_arg[0]);
51         tprints(", ");
52         printstr(tcp, tcp->u_arg[1]);
53         print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
54         tprints(", ");
55         printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
56         return RVAL_DECODED;
57 }
58
59 SYS_FUNC(getxattr)
60 {
61         if (entering(tcp)) {
62                 printpath(tcp, tcp->u_arg[0]);
63                 tprints(", ");
64                 printstr(tcp, tcp->u_arg[1]);
65         } else {
66                 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
67         }
68         return 0;
69 }
70
71 SYS_FUNC(fgetxattr)
72 {
73         if (entering(tcp)) {
74                 printfd(tcp, tcp->u_arg[0]);
75                 tprints(", ");
76                 printstr(tcp, tcp->u_arg[1]);
77         } else {
78                 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
79         }
80         return 0;
81 }
82
83 static void
84 print_xattr_list(struct tcb *const tcp, const kernel_ulong_t addr,
85                  const kernel_ulong_t size)
86 {
87         if (!size || syserror(tcp)) {
88                 printaddr(addr);
89         } else {
90                 printstrn(tcp, addr, tcp->u_rval);
91         }
92         tprintf(", %" PRI_klu, size);
93 }
94
95 SYS_FUNC(listxattr)
96 {
97         if (entering(tcp)) {
98                 printpath(tcp, tcp->u_arg[0]);
99                 tprints(", ");
100         } else {
101                 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
102         }
103         return 0;
104 }
105
106 SYS_FUNC(flistxattr)
107 {
108         if (entering(tcp)) {
109                 printfd(tcp, tcp->u_arg[0]);
110                 tprints(", ");
111         } else {
112                 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
113         }
114         return 0;
115 }
116
117 SYS_FUNC(removexattr)
118 {
119         printpath(tcp, tcp->u_arg[0]);
120         tprints(", ");
121         printstr(tcp, tcp->u_arg[1]);
122         return RVAL_DECODED;
123 }
124
125 SYS_FUNC(fremovexattr)
126 {
127         printfd(tcp, tcp->u_arg[0]);
128         tprints(", ");
129         printstr(tcp, tcp->u_arg[1]);
130         return RVAL_DECODED;
131 }