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