]> granicus.if.org Git - strace/blob - xattr.c
print_xattr_list: use printaddr
[strace] / xattr.c
1 #include "defs.h"
2
3 #ifdef HAVE_SYS_XATTR_H
4 # include <sys/xattr.h>
5 #endif
6
7 #include "xlat/xattrflags.h"
8
9 static void
10 print_xattr_val(struct tcb *tcp,
11                 unsigned long addr,
12                 unsigned long insize,
13                 unsigned long size)
14 {
15         char *buf;
16         unsigned int len;
17
18         if (insize == 0)
19                 goto failed;
20
21         len = size;
22         if (size != (unsigned long) len)
23                 goto failed;
24
25         if (!len) {
26                 tprintf(", \"\", %ld", insize);
27                 return;
28         }
29
30         buf = malloc(len);
31         if (!buf)
32                 goto failed;
33
34         if (umoven(tcp, arg, len, buf) < 0) {
35                 free(buf);
36                 goto failed;
37         }
38
39         /* Don't print terminating NUL if there is one. */
40         if (buf[len - 1] == '\0')
41                 --len;
42
43         tprints(", ");
44         print_quoted_string(buf, len, 0);
45         tprintf(", %ld", insize);
46
47         free(buf);
48         return;
49
50 failed:
51         tprintf(", 0x%lx, %ld", arg, insize);
52 }
53
54 SYS_FUNC(setxattr)
55 {
56         if (entering(tcp)) {
57                 printpath(tcp, tcp->u_arg[0]);
58                 tprints(", ");
59                 printstr(tcp, tcp->u_arg[1], -1);
60                 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
61                 tprints(", ");
62                 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
63         }
64         return 0;
65 }
66
67 SYS_FUNC(fsetxattr)
68 {
69         if (entering(tcp)) {
70                 printfd(tcp, tcp->u_arg[0]);
71                 tprints(", ");
72                 printstr(tcp, tcp->u_arg[1], -1);
73                 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
74                 tprints(", ");
75                 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
76         }
77         return 0;
78 }
79
80 SYS_FUNC(getxattr)
81 {
82         if (entering(tcp)) {
83                 printpath(tcp, tcp->u_arg[0]);
84                 tprints(", ");
85                 printstr(tcp, tcp->u_arg[1], -1);
86         } else {
87                 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
88         }
89         return 0;
90 }
91
92 SYS_FUNC(fgetxattr)
93 {
94         if (entering(tcp)) {
95                 printfd(tcp, tcp->u_arg[0]);
96                 tprints(", ");
97                 printstr(tcp, tcp->u_arg[1], -1);
98         } else {
99                 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
100         }
101         return 0;
102 }
103
104 static void
105 print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size)
106 {
107         if (syserror(tcp)) {
108                 printaddr(addr);
109         } else {
110                 unsigned long len =
111                         (size < (unsigned long) tcp->u_rval) ?
112                                 size : (unsigned long) tcp->u_rval;
113                 printstr(tcp, addr, len);
114         }
115         tprintf(", %lu", size);
116 }
117
118 SYS_FUNC(listxattr)
119 {
120         if (entering(tcp)) {
121                 printpath(tcp, tcp->u_arg[0]);
122                 tprints(", ");
123         } else {
124                 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
125         }
126         return 0;
127 }
128
129 SYS_FUNC(flistxattr)
130 {
131         if (entering(tcp)) {
132                 printfd(tcp, tcp->u_arg[0]);
133                 tprints(", ");
134         } else {
135                 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
136         }
137         return 0;
138 }
139
140 SYS_FUNC(removexattr)
141 {
142         if (entering(tcp)) {
143                 printpath(tcp, tcp->u_arg[0]);
144                 tprints(", ");
145                 printstr(tcp, tcp->u_arg[1], -1);
146         }
147         return 0;
148 }
149
150 SYS_FUNC(fremovexattr)
151 {
152         if (entering(tcp)) {
153                 printfd(tcp, tcp->u_arg[0]);
154                 tprints(", ");
155                 printstr(tcp, tcp->u_arg[1], -1);
156         }
157         return 0;
158 }