(root)/
strace-6.5/
tests/
xattr.c
       1  /*
       2   * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@strace.io>
       3   * Copyright (c) 2015-2021 The strace developers.
       4   * All rights reserved.
       5   *
       6   * SPDX-License-Identifier: GPL-2.0-or-later
       7   */
       8  
       9  #include "tests.h"
      10  
      11  #ifdef HAVE_SYS_XATTR_H
      12  
      13  # include <stdio.h>
      14  # include <sys/xattr.h>
      15  
      16  # ifndef XATTR_SIZE_MAX
      17  #  define XATTR_SIZE_MAX 65536
      18  # endif
      19  
      20  int
      21  main(void)
      22  {
      23  	static const char name[] = "strace.test";
      24  	static const char c_value[] = "foo\0bar";
      25  	static const char q_value[] = "foo\\0bar";
      26  
      27  	const char *const z_value = tail_memdup(c_value, sizeof(c_value));
      28  	char *const efault = tail_alloc(1) + 1;
      29  	const char *const value = tail_memdup(c_value, sizeof(c_value) - 1);
      30  	char *const big = tail_alloc(XATTR_SIZE_MAX + 1);
      31  	long rc;
      32  	const char *errstr;
      33  
      34  	rc = fsetxattr(-1, 0, 0, 0, XATTR_CREATE);
      35  	printf("fsetxattr(-1, NULL, NULL, 0, XATTR_CREATE) = %s\n",
      36  	       sprintrc(rc));
      37  
      38  	rc = fsetxattr(-1, 0, z_value, 0, XATTR_CREATE);
      39  	printf("fsetxattr(-1, NULL, \"\", 0, XATTR_CREATE) = %s\n",
      40  	       sprintrc(rc));
      41  
      42  	rc = fsetxattr(-1, name, big, XATTR_SIZE_MAX + 1, XATTR_CREATE);
      43  	printf("fsetxattr(-1, \"%s\", %p, %u, XATTR_CREATE) = %s\n",
      44  	       name, big, XATTR_SIZE_MAX + 1, sprintrc(rc));
      45  
      46  	rc = fsetxattr(-1, name, value, sizeof(c_value), XATTR_CREATE);
      47  	printf("fsetxattr(-1, \"%s\", %p, %u, XATTR_CREATE) = %s\n",
      48  	       name, value, (unsigned) sizeof(c_value), sprintrc(rc));
      49  
      50  	rc = fsetxattr(-1, name, z_value, sizeof(c_value), XATTR_REPLACE);
      51  	printf("fsetxattr(-1, \"%s\", \"%s\", %u, XATTR_REPLACE) = %s\n",
      52  	       name, q_value, (unsigned) sizeof(c_value), sprintrc(rc));
      53  
      54  	rc = fsetxattr(-1, name, value, sizeof(c_value) - 1, XATTR_CREATE|XATTR_REPLACE);
      55  	printf("fsetxattr(-1, \"%s\", \"%s\", %u, XATTR_CREATE|XATTR_REPLACE)"
      56  	       " = %s\n",
      57  	       name, q_value, (unsigned) sizeof(c_value) - 1, sprintrc(rc));
      58  
      59  	rc = setxattr(".", name, z_value, sizeof(c_value), XATTR_CREATE);
      60  	printf("setxattr(\".\", \"%s\", \"%s\", %u, XATTR_CREATE) = %s\n",
      61  	       name, q_value, (unsigned) sizeof(c_value), sprintrc(rc));
      62  
      63  	rc = lsetxattr(".", name, value, sizeof(c_value) - 1, XATTR_CREATE);
      64  	printf("lsetxattr(\".\", \"%s\", \"%s\", %u, XATTR_CREATE) = %s\n",
      65  	       name, q_value, (unsigned) sizeof(c_value) - 1, sprintrc(rc));
      66  
      67  	rc = fgetxattr(-1, name, efault, 4);
      68  	printf("fgetxattr(-1, \"%s\", %p, 4) = %s\n",
      69  	       name, efault, sprintrc(rc));
      70  
      71  	rc = getxattr(".", name, big, XATTR_SIZE_MAX + 1);
      72  	printf("getxattr(\".\", \"%s\", %p, %u) = %s\n",
      73  	       name, big, XATTR_SIZE_MAX + 1, sprintrc(rc));
      74  
      75  	rc = lgetxattr(".", name, big + 1, XATTR_SIZE_MAX);
      76  	printf("lgetxattr(\".\", \"%s\", %p, %u) = %s\n",
      77  	       name, big + 1, XATTR_SIZE_MAX, sprintrc(rc));
      78  
      79  	rc = flistxattr(-1, efault, 4);
      80  	printf("flistxattr(-1, %p, 4) = %s\n", efault, sprintrc(rc));
      81  
      82  	rc = llistxattr("", efault + 1, 4);
      83  	printf("llistxattr(\"\", %p, 4) = %s\n", efault + 1, sprintrc(rc));
      84  
      85  	rc = listxattr(".", big, 0);
      86  	printf("listxattr(\".\", %p, 0) = %s\n", big, sprintrc(rc));
      87  
      88  	rc = listxattr(".", big, XATTR_SIZE_MAX + 1);
      89  	errstr = sprintrc(rc);
      90  	printf("listxattr(\".\", ");
      91  	if (rc < 0)
      92  		printf("%p", big);
      93  	else {
      94  		const int ellipsis = rc > DEFAULT_STRLEN;
      95  
      96  		print_quoted_memory(big, ellipsis ? DEFAULT_STRLEN : rc);
      97  		if (ellipsis)
      98  			fputs("...", stdout);
      99  	}
     100  	printf(", %u) = %s\n", XATTR_SIZE_MAX + 1, errstr);
     101  
     102  	rc = fremovexattr(-1, name);
     103  	printf("fremovexattr(-1, \"%s\") = %s\n", name, sprintrc(rc));
     104  
     105  	rc = removexattr(".", name);
     106  	printf("removexattr(\".\", \"%s\") = %s\n", name, sprintrc(rc));
     107  
     108  	rc = lremovexattr(".", name);
     109  	printf("lremovexattr(\".\", \"%s\") = %s\n", name, sprintrc(rc));
     110  
     111  	puts("+++ exited with 0 +++");
     112  	return 0;
     113  }
     114  
     115  #else
     116  
     117  SKIP_MAIN_UNDEFINED("HAVE_SYS_XATTR_H")
     118  
     119  #endif