1#include "defs.h"
2
3static int
4decode_readlink(struct tcb *tcp, int offset)
5{
6	if (entering(tcp)) {
7		printpath(tcp, tcp->u_arg[offset]);
8		tprints(", ");
9	} else {
10		if (syserror(tcp))
11			tprintf("%#lx", tcp->u_arg[offset + 1]);
12		else
13			/* Used to use printpathn(), but readlink
14			 * neither includes NUL in the returned count,
15			 * nor actually writes it into memory.
16			 * printpathn() would decide on printing
17			 * "..." continuation based on garbage
18			 * past return buffer's end.
19			 */
20			printstr(tcp, tcp->u_arg[offset + 1], tcp->u_rval);
21		tprintf(", %lu", tcp->u_arg[offset + 2]);
22	}
23	return 0;
24}
25
26SYS_FUNC(readlink)
27{
28	return decode_readlink(tcp, 0);
29}
30
31SYS_FUNC(readlinkat)
32{
33	if (entering(tcp))
34		print_dirfd(tcp, tcp->u_arg[0]);
35	return decode_readlink(tcp, 1);
36}
37