1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Copyright (c) 2018 Linaro Limited. All rights reserved.
4 * Author: Rafael David Tinoco <rafael.tinoco@linaro.org>
5 */
6
7 /*
8 * Test Name: fremovexattr01
9 *
10 * Description:
11 * Like removexattr(2), fremovexattr(2) also removes an extended attribute,
12 * identified by a name, from a file but, instead of using a filename path, it
13 * uses a descriptor. This test verifies that a simple call to fremovexattr(2)
14 * removes, indeed, a previously set attribute key/value from a file.
15 */
16
17 #include "config.h"
18 #include <errno.h>
19 #include <stdlib.h>
20
21 #ifdef HAVE_SYS_XATTR_H
22 # include <sys/xattr.h>
23 #endif
24
25 #include "tst_test.h"
26
27 #ifdef HAVE_SYS_XATTR_H
28
29 #define ENOATTR ENODATA
30
31 #define XATTR_TEST_KEY "user.testkey"
32 #define XATTR_TEST_VALUE "this is a test value"
33 #define XATTR_TEST_VALUE_SIZE 20
34
35 #define MNTPOINT "mntpoint"
36 #define FNAME MNTPOINT"/fremovexattr01testfile"
37
38 static int fd = -1;
39 static char got_value[XATTR_TEST_VALUE_SIZE];
40
verify_fremovexattr(void)41 static void verify_fremovexattr(void)
42 {
43 SAFE_FSETXATTR(fd, XATTR_TEST_KEY, XATTR_TEST_VALUE,
44 XATTR_TEST_VALUE_SIZE, XATTR_CREATE);
45
46 TEST(fremovexattr(fd, XATTR_TEST_KEY));
47
48 if (TST_RET != 0) {
49 tst_res(TFAIL | TTERRNO, "fremovexattr(2) failed");
50 return;
51 }
52
53 TEST(fgetxattr(fd, XATTR_TEST_KEY, got_value, sizeof(got_value)));
54
55 if (TST_RET >= 0) {
56 tst_res(TFAIL, "fremovexattr(2) did not remove attribute");
57 return;
58 }
59
60 if (TST_RET < 0 && TST_ERR != ENOATTR) {
61 tst_brk(TBROK | TTERRNO,
62 "fremovexattr(2) could not verify removal");
63 return;
64 }
65
66 tst_res(TPASS, "fremovexattr(2) removed attribute as expected");
67 }
68
cleanup(void)69 static void cleanup(void)
70 {
71 if (fd > 0)
72 SAFE_CLOSE(fd);
73 }
74
setup(void)75 static void setup(void)
76 {
77 fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0644);
78
79 TEST(fremovexattr(fd, XATTR_TEST_KEY));
80
81 if (TST_RET == -1 && TST_ERR == EOPNOTSUPP)
82 tst_brk(TCONF, "fremovexattr(2) not supported");
83 }
84
85 static struct tst_test test = {
86 .setup = setup,
87 .test_all = verify_fremovexattr,
88 .cleanup = cleanup,
89 .mntpoint = MNTPOINT,
90 .mount_device = 1,
91 .all_filesystems = 1,
92 .needs_root = 1,
93 };
94
95 #else /* HAVE_SYS_XATTR_H */
96 TST_TEST_TCONF("<sys/xattr.h> does not exist");
97 #endif
98