From 769ffe979770673397dfaf5f826d463a5534f775 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Sat, 6 Dec 2014 03:53:16 +0000 Subject: [PATCH] file.c: move *xattr parsers to a separate file * xattr.c: New file. * Makefile.am (strace_SOURCES): Add it. * file.c: Move sys_setxattr, sys_fsetxattr, sys_getxattr, sys_fgetxattr, sys_listxattr, sys_flistxattr, sys_removexattr, sys_fremovexattr, and related code to xattr.c. --- Makefile.am | 3 +- file.c | 170 --------------------------------------------------- xattr.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 171 deletions(-) create mode 100644 xattr.c diff --git a/Makefile.am b/Makefile.am index 025b5e0c..54d12051 100644 --- a/Makefile.am +++ b/Makefile.am @@ -70,7 +70,8 @@ strace_SOURCES = \ umount.c \ util.c \ v4l2.c \ - vsprintf.c + vsprintf.c \ + xattr.c if USE_LIBUNWIND strace_SOURCES += unwind.c diff --git a/file.c b/file.c index b61ed06c..48212ec7 100644 --- a/file.c +++ b/file.c @@ -180,12 +180,6 @@ struct __old_kernel_stat { #undef st_ctime #include -#ifdef HAVE_LINUX_XATTR_H -# include -#else -# define XATTR_CREATE 1 -# define XATTR_REPLACE 2 -#endif #ifdef MAJOR_IN_SYSMACROS # include @@ -1687,167 +1681,3 @@ sys_getcwd(struct tcb *tcp) } return 0; } - -#include "xlat/xattrflags.h" - -static void -print_xattr_val(struct tcb *tcp, int failed, - unsigned long arg, - unsigned long insize, - unsigned long size) -{ - if (insize == 0) - failed = 1; - if (!failed) { - unsigned long capacity = 4 * size + 1; - unsigned char *buf = (capacity < size) ? NULL : malloc(capacity); - if (buf == NULL || /* probably a bogus size argument */ - umoven(tcp, arg, size, (char *) &buf[3 * size]) < 0) { - failed = 1; - } - else { - unsigned char *out = buf; - unsigned char *in = &buf[3 * size]; - size_t i; - for (i = 0; i < size; ++i) { - if (in[i] >= ' ' && in[i] <= 0x7e) - *out++ = in[i]; - else { -#define tohex(n) "0123456789abcdef"[n] - *out++ = '\\'; - *out++ = 'x'; - *out++ = tohex(in[i] / 16); - *out++ = tohex(in[i] % 16); - } - } - /* Don't print terminating NUL if there is one. */ - if (i > 0 && in[i - 1] == '\0') - out -= 4; - *out = '\0'; - tprintf(", \"%s\", %ld", buf, insize); - } - free(buf); - } - if (failed) - tprintf(", 0x%lx, %ld", arg, insize); -} - -int -sys_setxattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); - tprints(", "); - printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); - } - return 0; -} - -int -sys_fsetxattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); - tprints(", "); - printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); - } - return 0; -} - -int -sys_getxattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - } else { - print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], - tcp->u_rval); - } - return 0; -} - -int -sys_fgetxattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - } else { - print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], - tcp->u_rval); - } - return 0; -} - -static void -print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size) -{ - if (syserror(tcp)) { - tprintf("%#lx", addr); - } else { - if (!addr) { - tprints("NULL"); - } else { - unsigned long len = - (size < (unsigned long) tcp->u_rval) ? - size : (unsigned long) tcp->u_rval; - printstr(tcp, addr, len); - } - } - tprintf(", %lu", size); -} - -int -sys_listxattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - } else { - print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]); - } - return 0; -} - -int -sys_flistxattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - } else { - print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]); - } - return 0; -} - -int -sys_removexattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - } - return 0; -} - -int -sys_fremovexattr(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - } - return 0; -} diff --git a/xattr.c b/xattr.c new file mode 100644 index 00000000..42c9be8f --- /dev/null +++ b/xattr.c @@ -0,0 +1,172 @@ +#include "defs.h" + +#ifdef HAVE_LINUX_XATTR_H +# include +#else +# define XATTR_CREATE 1 +# define XATTR_REPLACE 2 +#endif + +#include "xlat/xattrflags.h" + +static void +print_xattr_val(struct tcb *tcp, int failed, + unsigned long arg, + unsigned long insize, + unsigned long size) +{ + if (insize == 0) + failed = 1; + if (!failed) { + unsigned long capacity = 4 * size + 1; + unsigned char *buf = (capacity < size) ? NULL : malloc(capacity); + if (buf == NULL || /* probably a bogus size argument */ + umoven(tcp, arg, size, (char *) &buf[3 * size]) < 0) { + failed = 1; + } + else { + unsigned char *out = buf; + unsigned char *in = &buf[3 * size]; + size_t i; + for (i = 0; i < size; ++i) { + if (in[i] >= ' ' && in[i] <= 0x7e) + *out++ = in[i]; + else { +#define tohex(n) "0123456789abcdef"[n] + *out++ = '\\'; + *out++ = 'x'; + *out++ = tohex(in[i] / 16); + *out++ = tohex(in[i] % 16); + } + } + /* Don't print terminating NUL if there is one. */ + if (i > 0 && in[i - 1] == '\0') + out -= 4; + *out = '\0'; + tprintf(", \"%s\", %ld", buf, insize); + } + free(buf); + } + if (failed) + tprintf(", 0x%lx, %ld", arg, insize); +} + +int +sys_setxattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1], -1); + print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); + tprints(", "); + printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); + } + return 0; +} + +int +sys_fsetxattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1], -1); + print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); + tprints(", "); + printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); + } + return 0; +} + +int +sys_getxattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1], -1); + } else { + print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], + tcp->u_rval); + } + return 0; +} + +int +sys_fgetxattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1], -1); + } else { + print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], + tcp->u_rval); + } + return 0; +} + +static void +print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size) +{ + if (syserror(tcp)) { + tprintf("%#lx", addr); + } else { + if (!addr) { + tprints("NULL"); + } else { + unsigned long len = + (size < (unsigned long) tcp->u_rval) ? + size : (unsigned long) tcp->u_rval; + printstr(tcp, addr, len); + } + } + tprintf(", %lu", size); +} + +int +sys_listxattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + } else { + print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]); + } + return 0; +} + +int +sys_flistxattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + } else { + print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]); + } + return 0; +} + +int +sys_removexattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1], -1); + } + return 0; +} + +int +sys_fremovexattr(struct tcb *tcp) +{ + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1], -1); + } + return 0; +} -- 2.34.1