1/* 2* Copyright (c) 2016 Fujitsu Ltd. 3* Author: Xiao Yang <yangx.jy@cn.fujitsu.com> 4* 5* This program is free software; you can redistribute it and/or modify it 6* under the terms of version 2 of the GNU General Public License as 7* published by the Free Software Foundation. 8* 9* This program is distributed in the hope that it would be useful, but 10* WITHOUT ANY WARRANTY; without even the implied warranty of 11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12* 13* You should have received a copy of the GNU General Public License 14* alone with this program. 15*/ 16 17/* 18* Test Name: llistxattr03 19* 20* Description: 21* llistxattr is identical to listxattr. an empty buffer of size zero 22* can return the current size of the list of extended attribute names, 23* which can be used to estimate a suitable buffer. 24*/ 25 26#include "config.h" 27#include <errno.h> 28#include <sys/types.h> 29 30#ifdef HAVE_ATTR_XATTR_H 31# include <attr/xattr.h> 32#endif 33 34#include "tst_test.h" 35 36#ifdef HAVE_ATTR_XATTR_H 37 38#define SECURITY_KEY "security.ltptest" 39#define VALUE "test" 40#define VALUE_SIZE 4 41 42static const char *filename[] = {"testfile1", "testfile2"}; 43 44static int check_suitable_buf(const char *name, long size) 45{ 46 int n; 47 char buf[size]; 48 49 n = llistxattr(name, buf, size); 50 if (n == -1) 51 return 0; 52 else 53 return 1; 54} 55 56static void verify_llistxattr(unsigned int n) 57{ 58 const char *name = filename[n]; 59 60 TEST(llistxattr(name, NULL, 0)); 61 if (TEST_RETURN == -1) { 62 tst_res(TFAIL | TERRNO, "llistxattr() failed"); 63 return; 64 } 65 66 if (check_suitable_buf(name, TEST_RETURN)) 67 tst_res(TPASS, "llistxattr() succeed with suitable buffer"); 68 else 69 tst_res(TFAIL, "llistxattr() failed with small buffer"); 70} 71 72static void setup(void) 73{ 74 int ret; 75 76 SAFE_TOUCH(filename[0], 0644, NULL); 77 78 SAFE_TOUCH(filename[1], 0644, NULL); 79 80 ret = lsetxattr(filename[1], SECURITY_KEY, VALUE, VALUE_SIZE, XATTR_CREATE); 81 if (ret == -1) { 82 if (errno == ENOTSUP) { 83 tst_brk(TCONF, "no xattr support in fs or " 84 "mounted without user_xattr option"); 85 } else { 86 tst_brk(TBROK | TERRNO, "lsetxattr() failed"); 87 } 88 } 89} 90 91static struct tst_test test = { 92 .tid = "llistxattr02", 93 .needs_tmpdir = 1, 94 .needs_root = 1, 95 .test = verify_llistxattr, 96 .tcnt = ARRAY_SIZE(filename), 97 .setup = setup, 98}; 99 100#else /* HAVE_ATTR_XATTR_H */ 101 TST_TEST_TCONF("<attr/xattr.h> does not exist."); 102#endif 103