file.c: move readlink and readlinkat parsers to a separate file
* readlink.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* file.c (decode_readlink, sys_readlink, sys_readlinkat): Move
to readlink.c.
diff --git a/readlink.c b/readlink.c
new file mode 100644
index 0000000..efa8e9f
--- /dev/null
+++ b/readlink.c
@@ -0,0 +1,38 @@
+#include "defs.h"
+
+static int
+decode_readlink(struct tcb *tcp, int offset)
+{
+ if (entering(tcp)) {
+ printpath(tcp, tcp->u_arg[offset]);
+ tprints(", ");
+ } else {
+ if (syserror(tcp))
+ tprintf("%#lx", tcp->u_arg[offset + 1]);
+ else
+ /* Used to use printpathn(), but readlink
+ * neither includes NUL in the returned count,
+ * nor actually writes it into memory.
+ * printpathn() would decide on printing
+ * "..." continuation based on garbage
+ * past return buffer's end.
+ */
+ printstr(tcp, tcp->u_arg[offset + 1], tcp->u_rval);
+ tprintf(", %lu", tcp->u_arg[offset + 2]);
+ }
+ return 0;
+}
+
+int
+sys_readlink(struct tcb *tcp)
+{
+ return decode_readlink(tcp, 0);
+}
+
+int
+sys_readlinkat(struct tcb *tcp)
+{
+ if (entering(tcp))
+ print_dirfd(tcp, tcp->u_arg[0]);
+ return decode_readlink(tcp, 1);
+}