7 unsigned short d_reclen;
12 print_old_dirent(struct tcb *tcp, long addr)
15 typedef struct kernel_dirent old_dirent_t;
20 unsigned short d_reclen;
26 if (!verbose(tcp) || umove(tcp, addr, &d) < 0) {
27 tprintf("%#lx", addr);
31 tprintf("{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=\"",
32 (unsigned long) d.d_ino, (unsigned long) d.d_off, d.d_reclen);
35 printpathn(tcp, addr + offsetof(old_dirent_t, d_name), d.d_reclen);
40 sys_readdir(struct tcb *tcp)
43 printfd(tcp, tcp->u_arg[0]);
46 if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
47 tprintf("%#lx", tcp->u_arg[1]);
49 print_old_dirent(tcp, tcp->u_arg[1]);
50 /* Not much point in printing this out, it is always 1. */
51 if (tcp->u_arg[2] != 1)
52 tprintf(", %lu", tcp->u_arg[2]);
57 #include "xlat/direnttypes.h"
60 sys_getdents(struct tcb *tcp)
62 unsigned int i, len, dents = 0;
66 printfd(tcp, tcp->u_arg[0]);
70 if (syserror(tcp) || !verbose(tcp)) {
71 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
75 /* Beware of insanely large or too small values in tcp->u_rval */
76 if (tcp->u_rval > 1024*1024)
78 else if (tcp->u_rval < (int) sizeof(struct kernel_dirent))
87 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
88 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
98 for (i = 0; len && i <= len - sizeof(struct kernel_dirent); ) {
99 struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
102 int oob = d->d_reclen < sizeof(struct kernel_dirent) ||
103 i + d->d_reclen - 1 >= len;
104 int d_name_len = oob ? len - i : d->d_reclen;
105 d_name_len -= offsetof(struct kernel_dirent, d_name) + 1;
107 tprintf("%s{d_ino=%lu, d_off=%lu, ",
108 i ? " " : "", d->d_ino, d->d_off);
109 tprintf("d_reclen=%u, d_name=\"%.*s\", d_type=",
110 d->d_reclen, d_name_len, d->d_name);
114 printxval(direnttypes, buf[i + d->d_reclen - 1], "DT_???");
118 if (d->d_reclen < sizeof(struct kernel_dirent)) {
119 tprints("/* d_reclen < sizeof(struct kernel_dirent) */");
127 tprintf("/* %u entries */", dents);
128 tprintf(", %lu", tcp->u_arg[2]);
134 sys_getdents64(struct tcb *tcp)
136 /* the minimum size of a valid dirent64 structure */
137 const unsigned int d_name_offset = offsetof(struct dirent64, d_name);
139 unsigned int i, len, dents = 0;
143 printfd(tcp, tcp->u_arg[0]);
147 if (syserror(tcp) || !verbose(tcp)) {
148 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
152 /* Beware of insanely large or too small tcp->u_rval */
153 if (tcp->u_rval > 1024*1024)
155 else if (tcp->u_rval < (int) d_name_offset)
164 if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
165 tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
175 for (i = 0; len && i <= len - d_name_offset; ) {
176 struct dirent64 *d = (struct dirent64 *) &buf[i];
179 if (d->d_reclen >= d_name_offset
180 && i + d->d_reclen <= len) {
181 d_name_len = d->d_reclen - d_name_offset;
183 d_name_len = len - i - d_name_offset;
186 tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64
187 ", d_reclen=%u, d_type=",
192 printxval(direnttypes, d->d_type, "DT_???");
193 tprintf(", d_name=\"%.*s\"}",
194 d_name_len, d->d_name);
196 if (d->d_reclen < d_name_offset) {
197 tprints("/* d_reclen < offsetof(struct dirent64, d_name) */");
206 tprintf("/* %u entries */", dents);
207 tprintf(", %lu", tcp->u_arg[2]);