4 #define D_NAME_LEN_MAX 256
9 unsigned short d_reclen;
14 print_old_dirent(struct tcb *tcp, long addr)
17 typedef struct kernel_dirent old_dirent_t;
22 unsigned short d_reclen;
28 if (!verbose(tcp) || umove(tcp, addr, &d) < 0) {
29 tprintf("%#lx", addr);
33 tprintf("{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=",
34 (unsigned long) d.d_ino, (unsigned long) d.d_off, d.d_reclen);
35 if (d.d_reclen > D_NAME_LEN_MAX)
36 d.d_reclen = D_NAME_LEN_MAX;
37 printpathn(tcp, addr + offsetof(old_dirent_t, d_name), d.d_reclen);
42 sys_readdir(struct tcb *tcp)
45 printfd(tcp, tcp->u_arg[0]);
48 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
49 tprintf("%#lx", tcp->u_arg[1]);
51 print_old_dirent(tcp, tcp->u_arg[1]);
52 /* Not much point in printing this out, it is always 1. */
53 if (tcp->u_arg[2] != 1)
54 tprintf(", %lu", tcp->u_arg[2]);
59 #include "xlat/direnttypes.h"
62 sys_getdents(struct tcb *tcp)
64 unsigned int i, len, dents = 0;
68 printfd(tcp, tcp->u_arg[0]);
72 if (syserror(tcp) || !verbose(tcp)) {
73 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
77 /* Beware of insanely large or too small values in tcp->u_rval */
78 if (tcp->u_rval > 1024*1024)
80 else if (tcp->u_rval < (int) sizeof(struct kernel_dirent))
89 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
90 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
100 for (i = 0; len && i <= len - sizeof(struct kernel_dirent); ) {
101 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
104 int oob = d->d_reclen < sizeof(struct kernel_dirent) ||
105 i + d->d_reclen - 1 >= len;
106 int d_name_len = oob ? len - i : d->d_reclen;
107 d_name_len -= offsetof(struct kernel_dirent, d_name) + 1;
108 if (d_name_len > D_NAME_LEN_MAX)
109 d_name_len = D_NAME_LEN_MAX;
111 tprintf("%s{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=",
112 i ? " " : "", d->d_ino, d->d_off, d->d_reclen);
114 if (print_quoted_string(d->d_name, d_name_len,
115 QUOTE_0_TERMINATED) > 0) {
119 tprints(", d_type=");
123 printxval(direnttypes, buf[i + d->d_reclen - 1], "DT_???");
127 if (d->d_reclen < sizeof(struct kernel_dirent)) {
128 tprints("/* d_reclen < sizeof(struct kernel_dirent) */");
136 tprintf("/* %u entries */", dents);
137 tprintf(", %lu", tcp->u_arg[2]);
143 sys_getdents64(struct tcb *tcp)
145 /* the minimum size of a valid dirent64 structure */
146 const unsigned int d_name_offset = offsetof(struct dirent64, d_name);
148 unsigned int i, len, dents = 0;
152 printfd(tcp, tcp->u_arg[0]);
156 if (syserror(tcp) || !verbose(tcp)) {
157 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
161 /* Beware of insanely large or too small tcp->u_rval */
162 if (tcp->u_rval > 1024*1024)
164 else if (tcp->u_rval < (int) d_name_offset)
173 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
174 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
184 for (i = 0; len && i <= len - d_name_offset; ) {
185 struct dirent64 *d = (struct dirent64 *) &buf[i];
188 if (d->d_reclen >= d_name_offset
189 && i + d->d_reclen <= len) {
190 d_name_len = d->d_reclen - d_name_offset;
192 d_name_len = len - i - d_name_offset;
194 if (d_name_len > D_NAME_LEN_MAX)
195 d_name_len = D_NAME_LEN_MAX;
197 tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64
198 ", d_reclen=%u, d_type=",
203 printxval(direnttypes, d->d_type, "DT_???");
205 tprints(", d_name=");
206 if (print_quoted_string(d->d_name, d_name_len,
207 QUOTE_0_TERMINATED) > 0) {
213 if (d->d_reclen < d_name_offset) {
214 tprints("/* d_reclen < offsetof(struct dirent64, d_name) */");
223 tprintf("/* %u entries */", dents);
224 tprintf(", %lu", tcp->u_arg[2]);