Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 2002-2005 Roland McGrath <roland (at) redhat.com>
      3  * Copyright (c) 2004 Ulrich Drepper <drepper (at) redhat.com>
      4  * Copyright (c) 2005-2016 Dmitry V. Levin <ldv (at) altlinux.org>
      5  * 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 
     30 #include "defs.h"
     31 
     32 #ifdef HAVE_SYS_XATTR_H
     33 # include <sys/xattr.h>
     34 #endif
     35 
     36 #include "xlat/xattrflags.h"
     37 
     38 #ifndef XATTR_SIZE_MAX
     39 # define XATTR_SIZE_MAX 65536
     40 #endif
     41 
     42 static void
     43 print_xattr_val(struct tcb *const tcp,
     44 		const kernel_ulong_t addr,
     45 		const kernel_ulong_t insize,
     46 		const kernel_ulong_t size)
     47 {
     48 	tprints(", ");
     49 
     50 	if (size > XATTR_SIZE_MAX)
     51 		printaddr(addr);
     52 	else
     53 		printstr_ex(tcp, addr, size, QUOTE_OMIT_TRAILING_0);
     54 	tprintf(", %" PRI_klu, insize);
     55 }
     56 
     57 SYS_FUNC(setxattr)
     58 {
     59 	printpath(tcp, tcp->u_arg[0]);
     60 	tprints(", ");
     61 	printstr(tcp, tcp->u_arg[1]);
     62 	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;
     66 }
     67 
     68 SYS_FUNC(fsetxattr)
     69 {
     70 	printfd(tcp, tcp->u_arg[0]);
     71 	tprints(", ");
     72 	printstr(tcp, tcp->u_arg[1]);
     73 	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;
     77 }
     78 
     79 SYS_FUNC(getxattr)
     80 {
     81 	if (entering(tcp)) {
     82 		printpath(tcp, tcp->u_arg[0]);
     83 		tprints(", ");
     84 		printstr(tcp, tcp->u_arg[1]);
     85 	} else {
     86 		print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
     87 	}
     88 	return 0;
     89 }
     90 
     91 SYS_FUNC(fgetxattr)
     92 {
     93 	if (entering(tcp)) {
     94 		printfd(tcp, tcp->u_arg[0]);
     95 		tprints(", ");
     96 		printstr(tcp, tcp->u_arg[1]);
     97 	} else {
     98 		print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval);
     99 	}
    100 	return 0;
    101 }
    102 
    103 static void
    104 print_xattr_list(struct tcb *const tcp, const kernel_ulong_t addr,
    105 		 const kernel_ulong_t size)
    106 {
    107 	if (!size || syserror(tcp)) {
    108 		printaddr(addr);
    109 	} else {
    110 		printstrn(tcp, addr, tcp->u_rval);
    111 	}
    112 	tprintf(", %" PRI_klu, size);
    113 }
    114 
    115 SYS_FUNC(listxattr)
    116 {
    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 
    126 SYS_FUNC(flistxattr)
    127 {
    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 
    137 SYS_FUNC(removexattr)
    138 {
    139 	printpath(tcp, tcp->u_arg[0]);
    140 	tprints(", ");
    141 	printstr(tcp, tcp->u_arg[1]);
    142 	return RVAL_DECODED;
    143 }
    144 
    145 SYS_FUNC(fremovexattr)
    146 {
    147 	printfd(tcp, tcp->u_arg[0]);
    148 	tprints(", ");
    149 	printstr(tcp, tcp->u_arg[1]);
    150 	return RVAL_DECODED;
    151 }
    152