getdents, getdents64: quote filenames

* dirent.c (print_old_dirent): Fix quoting.
(sys_getdents): Print d_name using print_quoted_string.
(sys_getdents64): Likewise.
* tests/getdents.test: Test it.
* tests/getdents.awk: Update.
diff --git a/dirent.c b/dirent.c
index cbebdb7..d30e0d2 100644
--- a/dirent.c
+++ b/dirent.c
@@ -1,6 +1,8 @@
 #include "defs.h"
 #include <dirent.h>
 
+#define D_NAME_LEN_MAX 256
+
 struct kernel_dirent {
 	unsigned long   d_ino;
 	unsigned long   d_off;
@@ -28,12 +30,12 @@
 		return;
 	}
 
-	tprintf("{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=\"",
+	tprintf("{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=",
 		(unsigned long) d.d_ino, (unsigned long) d.d_off, d.d_reclen);
-	if (d.d_reclen > 256)
-		d.d_reclen = 256;
+	if (d.d_reclen > D_NAME_LEN_MAX)
+		d.d_reclen = D_NAME_LEN_MAX;
 	printpathn(tcp, addr + offsetof(old_dirent_t, d_name), d.d_reclen);
-	tprints("\"}");
+	tprints("}");
 }
 
 int
@@ -103,11 +105,18 @@
 				  i + d->d_reclen - 1 >= len;
 			int d_name_len = oob ? len - i : d->d_reclen;
 			d_name_len -= offsetof(struct kernel_dirent, d_name) + 1;
+			if (d_name_len > D_NAME_LEN_MAX)
+				d_name_len = D_NAME_LEN_MAX;
 
-			tprintf("%s{d_ino=%lu, d_off=%lu, ",
-				i ? " " : "", d->d_ino, d->d_off);
-			tprintf("d_reclen=%u, d_name=\"%.*s\", d_type=",
-				d->d_reclen, d_name_len, d->d_name);
+			tprintf("%s{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=",
+				i ? " " : "", d->d_ino, d->d_off, d->d_reclen);
+
+			if (print_quoted_string(d->d_name, d_name_len,
+					        QUOTE_0_TERMINATED) > 0) {
+				tprints("...");
+			}
+
+			tprints(", d_type=");
 			if (oob)
 				tprints("?");
 			else
@@ -182,6 +191,8 @@
 			} else {
 				d_name_len = len - i - d_name_offset;
 			}
+			if (d_name_len > D_NAME_LEN_MAX)
+				d_name_len = D_NAME_LEN_MAX;
 
 			tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64
 				", d_reclen=%u, d_type=",
@@ -190,8 +201,14 @@
 				d->d_off,
 				d->d_reclen);
 			printxval(direnttypes, d->d_type, "DT_???");
-			tprintf(", d_name=\"%.*s\"}",
-				d_name_len, d->d_name);
+
+			tprints(", d_name=");
+			if (print_quoted_string(d->d_name, d_name_len,
+					        QUOTE_0_TERMINATED) > 0) {
+				tprints("...");
+			}
+
+			tprints("}");
 		}
 		if (d->d_reclen < d_name_offset) {
 			tprints("/* d_reclen < offsetof(struct dirent64, d_name) */");