diff options
| author | Dmitry V. Levin <ldv@altlinux.org> | 2014-12-06 03:53:16 +0000 |
|---|---|---|
| committer | Dmitry V. Levin <ldv@altlinux.org> | 2014-12-11 21:39:12 +0000 |
| commit | db23b3414ce9e3321066b790cf8ca5da9eff961f (patch) | |
| tree | c9b38d68b33a1a6f8760ee41abe464977e41ee52 /mknod.c | |
| parent | 9514ac73c71456fe9082f40bf7c9a8a2278b47aa (diff) | |
| download | android_external_strace-db23b3414ce9e3321066b790cf8ca5da9eff961f.tar.gz android_external_strace-db23b3414ce9e3321066b790cf8ca5da9eff961f.tar.bz2 android_external_strace-db23b3414ce9e3321066b790cf8ca5da9eff961f.zip | |
file.c: move mknod, mknodat, and xmknod parsers to a separate file
* mknod.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* file.c: Move sys_mknod, sys_mknodat, sys_xmknod, and related code
to mknod.c.
Diffstat (limited to 'mknod.c')
| -rw-r--r-- | mknod.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/mknod.c b/mknod.c new file mode 100644 index 00000000..07e9a459 --- /dev/null +++ b/mknod.c @@ -0,0 +1,79 @@ +#include "defs.h" + +#include <fcntl.h> + +#ifdef MAJOR_IN_SYSMACROS +# include <sys/sysmacros.h> +#endif + +#ifdef MAJOR_IN_MKDEV +# include <sys/mkdev.h> +#endif + +static int +decode_mknod(struct tcb *tcp, int offset) +{ + int mode = tcp->u_arg[offset + 1]; + + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[offset]); + tprintf(", %s", sprintmode(mode)); + switch (mode & S_IFMT) { + case S_IFCHR: + case S_IFBLK: +#if defined(SPARC) || defined(SPARC64) + if (current_personality == 1) + tprintf(", makedev(%lu, %lu)", + (unsigned long) ((tcp->u_arg[offset + 2] >> 18) & 0x3fff), + (unsigned long) (tcp->u_arg[offset + 2] & 0x3ffff)); + else +#endif /* SPARC || SPARC64 */ + tprintf(", makedev(%lu, %lu)", + (unsigned long) major(tcp->u_arg[offset + 2]), + (unsigned long) minor(tcp->u_arg[offset + 2])); + break; + default: + break; + } + } + return 0; +} + +int +sys_mknod(struct tcb *tcp) +{ + return decode_mknod(tcp, 0); +} + +int +sys_mknodat(struct tcb *tcp) +{ + if (entering(tcp)) + print_dirfd(tcp, tcp->u_arg[0]); + return decode_mknod(tcp, 1); +} + +#if defined(SPARC) || defined(SPARC64) +int +sys_xmknod(struct tcb *tcp) +{ + int mode = tcp->u_arg[2]; + + if (entering(tcp)) { + tprintf("%ld, ", tcp->u_arg[0]); + printpath(tcp, tcp->u_arg[1]); + tprintf(", %s", sprintmode(mode)); + switch (mode & S_IFMT) { + case S_IFCHR: + case S_IFBLK: + tprintf(", makedev(%lu, %lu)", + (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff), + (unsigned long) (tcp->u_arg[3] & 0x3ffff)); + break; + default: + break; + } + } + return 0; +} +#endif /* SPARC || SPARC64 */ |
