blob: efa8e9f8bb88ff23e6ad38133b938ce132ea7484 [file] [log] [blame]
Dmitry V. Levin46245b32014-12-06 03:53:16 +00001#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
26int
27sys_readlink(struct tcb *tcp)
28{
29 return decode_readlink(tcp, 0);
30}
31
32int
33sys_readlinkat(struct tcb *tcp)
34{
35 if (entering(tcp))
36 print_dirfd(tcp, tcp->u_arg[0]);
37 return decode_readlink(tcp, 1);
38}