blob: e7f550bfff1766ae93453ebf13b4499c98b16114 [file] [log] [blame]
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00001/*
2 * Copyright (c) 2002-2005 Roland McGrath <roland@redhat.com>
3 * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
Dmitry V. Levinec9c3172016-05-10 18:52:06 +00004 * Copyright (c) 2005-2016 Dmitry V. Levin <ldv@altlinux.org>
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00005 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000030#include "defs.h"
31
Dmitry V. Levin0c561952015-06-17 19:54:21 +000032#ifdef HAVE_SYS_XATTR_H
33# include <sys/xattr.h>
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000034#endif
35
36#include "xlat/xattrflags.h"
37
Dmitry V. Levinec9c3172016-05-10 18:52:06 +000038#ifndef XATTR_SIZE_MAX
39# define XATTR_SIZE_MAX 65536
40#endif
41
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000042static void
Elliott Hughesd35df492017-02-15 15:19:05 -080043print_xattr_val(struct tcb *const tcp,
44 const kernel_ulong_t addr,
45 const kernel_ulong_t insize,
46 const kernel_ulong_t size)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000047{
Dmitry V. Levin105c35b2015-07-14 23:34:06 +000048 tprints(", ");
49
Elliott Hughesd35df492017-02-15 15:19:05 -080050 if (size > XATTR_SIZE_MAX)
Dmitry V. Levin105c35b2015-07-14 23:34:06 +000051 printaddr(addr);
Elliott Hughesd35df492017-02-15 15:19:05 -080052 else
53 printstr_ex(tcp, addr, size, QUOTE_OMIT_TRAILING_0);
54 tprintf(", %" PRI_klu, insize);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000055}
56
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000057SYS_FUNC(setxattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000058{
Dmitry V. Levin6156d812015-07-14 23:38:58 +000059 printpath(tcp, tcp->u_arg[0]);
60 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -080061 printstr(tcp, tcp->u_arg[1]);
Dmitry V. Levin6156d812015-07-14 23:38:58 +000062 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
63 tprints(", ");
64 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
65 return RVAL_DECODED;
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000066}
67
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000068SYS_FUNC(fsetxattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000069{
Dmitry V. Levin6156d812015-07-14 23:38:58 +000070 printfd(tcp, tcp->u_arg[0]);
71 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -080072 printstr(tcp, tcp->u_arg[1]);
Dmitry V. Levin6156d812015-07-14 23:38:58 +000073 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]);
74 tprints(", ");
75 printflags(xattrflags, tcp->u_arg[4], "XATTR_???");
76 return RVAL_DECODED;
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000077}
78
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000079SYS_FUNC(getxattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000080{
81 if (entering(tcp)) {
82 printpath(tcp, tcp->u_arg[0]);
83 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -080084 printstr(tcp, tcp->u_arg[1]);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000085 } else {
Dmitry V. Levind45548d2015-07-14 23:25:15 +000086 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000087 }
88 return 0;
89}
90
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000091SYS_FUNC(fgetxattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000092{
93 if (entering(tcp)) {
94 printfd(tcp, tcp->u_arg[0]);
95 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -080096 printstr(tcp, tcp->u_arg[1]);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000097 } else {
Dmitry V. Levind45548d2015-07-14 23:25:15 +000098 print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +000099 }
100 return 0;
101}
102
103static void
Elliott Hughesd35df492017-02-15 15:19:05 -0800104print_xattr_list(struct tcb *const tcp, const kernel_ulong_t addr,
105 const kernel_ulong_t size)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000106{
Dmitry V. Levinec9c3172016-05-10 18:52:06 +0000107 if (!size || syserror(tcp)) {
Dmitry V. Levin8ae9c092015-07-14 23:31:35 +0000108 printaddr(addr);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000109 } else {
Elliott Hughesd35df492017-02-15 15:19:05 -0800110 printstrn(tcp, addr, tcp->u_rval);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000111 }
Elliott Hughesd35df492017-02-15 15:19:05 -0800112 tprintf(", %" PRI_klu, size);
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000113}
114
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000115SYS_FUNC(listxattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000116{
117 if (entering(tcp)) {
118 printpath(tcp, tcp->u_arg[0]);
119 tprints(", ");
120 } else {
121 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
122 }
123 return 0;
124}
125
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000126SYS_FUNC(flistxattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000127{
128 if (entering(tcp)) {
129 printfd(tcp, tcp->u_arg[0]);
130 tprints(", ");
131 } else {
132 print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
133 }
134 return 0;
135}
136
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000137SYS_FUNC(removexattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000138{
Dmitry V. Levin6156d812015-07-14 23:38:58 +0000139 printpath(tcp, tcp->u_arg[0]);
140 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800141 printstr(tcp, tcp->u_arg[1]);
Dmitry V. Levin6156d812015-07-14 23:38:58 +0000142 return RVAL_DECODED;
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000143}
144
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000145SYS_FUNC(fremovexattr)
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000146{
Dmitry V. Levin6156d812015-07-14 23:38:58 +0000147 printfd(tcp, tcp->u_arg[0]);
148 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800149 printstr(tcp, tcp->u_arg[1]);
Dmitry V. Levin6156d812015-07-14 23:38:58 +0000150 return RVAL_DECODED;
Dmitry V. Levin769ffe92014-12-06 03:53:16 +0000151}