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.
This commit is contained in:
Дмитрий Левин 2014-12-06 03:53:16 +00:00
parent 6d20a0b9a3
commit 46245b3541
3 changed files with 39 additions and 37 deletions

View File

@ -53,6 +53,7 @@ strace_SOURCES = \
process.c \
ptp.c \
quota.c \
readlink.c \
reboot.c \
renameat.c \
resource.c \

37
file.c
View File

@ -1319,40 +1319,3 @@ sys_symlinkat(struct tcb *tcp)
}
return 0;
}
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);
}

38
readlink.c Normal file
View File

@ -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);
}