10d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com/* 20d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * Copyright (c) 2014 Fujitsu Ltd. 30d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * Author: Xing Gu <gux.fnst@cn.fujitsu.com> 40d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 50d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * This program is free software; you can redistribute it and/or modify it 60d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * under the terms of version 2 of the GNU General Public License as 70d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * published by the Free Software Foundation. 80d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 90d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * This program is distributed in the hope that it would be useful, but 100d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * WITHOUT ANY WARRANTY; without even the implied warranty of 110d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 120d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 130d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * You should have received a copy of the GNU General Public License along 140d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * with this program; if not, write the Free Software Foundation, Inc., 150d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 160d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com */ 170d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com/* 180d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * Description: 190d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * Verify that, 200d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 1)openat() succeeds to open a file in append mode, when 210d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 'flags' is set to O_APPEND. 220d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 2)openat() succeeds to enable the close-on-exec flag for a 230d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * file descriptor, when 'flags' is set to O_CLOEXEC. 240d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 3)openat() succeeds to allow files whose sizes cannot be 250d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * represented in an off_t but can be represented in an off64_t 260d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * to be opened, when 'flags' is set to O_LARGEFILE. 270d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 4)openat() succeeds to not update the file last access time 280d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * (st_atime in the inode) when the file is read, when 'flags' 290d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * is set to O_NOATIME. 300d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 5)openat() succeeds to open the file failed if the file is a 310d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * symbolic link, when 'flags' is set to O_NOFOLLOW. 320d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * 6)openat() succeeds to truncate the file to length 0 if the file 330d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * already exists and is a regular file and the open mode allows 340d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com * writing, when 'flags' is set to O_TRUNC. 350d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com */ 360d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 370d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#define _GNU_SOURCE 380d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 390d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <sys/types.h> 400d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <sys/stat.h> 410d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <fcntl.h> 420d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <unistd.h> 430d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <sys/wait.h> 440d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <stdlib.h> 450d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <stdio.h> 460d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <stdint.h> 470d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include <mntent.h> 480d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 490d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include "test.h" 500d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include "safe_macros.h" 510d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include "lapi/fcntl.h" 520d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#include "openat.h" 530d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 540d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#define TEST_APP "openat02_child" 550d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 560d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#define TEST_FILE "test_file" 570d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#define SFILE "sfile" 580d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#define LARGE_FILE "large_file" 590d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 600d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com#define STR "abcdefg" 610d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 620d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void setup(void); 630d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void cleanup(void); 640d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 650d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void testfunc_append(void); 660d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void testfunc_cloexec(void); 670d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void testfunc_largefile(void); 680d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void testfunc_noatime(void); 690d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void testfunc_nofollow(void); 700d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void testfunc_trunc(void); 710d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 720d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comstatic void (*testfunc[])(void) = { 730d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com testfunc_append, 740d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com testfunc_cloexec, 750d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com testfunc_largefile, 760d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com testfunc_noatime, 770d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com testfunc_nofollow, 780d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com testfunc_trunc, 790d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com}; 800d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 810d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comchar *TCID = "openat02"; 820d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comint TST_TOTAL = ARRAY_SIZE(testfunc); 830d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 840d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comint main(int ac, char **av) 850d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 860d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com int lc; 870d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com int i; 880d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 89d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 900d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 910d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com setup(); 920d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 930d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com for (lc = 0; TEST_LOOPING(lc); lc++) { 940d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_count = 0; 950d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 960d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com for (i = 0; i < TST_TOTAL; i++) 970d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com (*testfunc[i])(); 980d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 990d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1000d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com cleanup(); 1010d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_exit(); 1020d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 1030d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1040d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid setup(void) 1050d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 1060d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST_PAUSE; 1070d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1080d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_sig(FORK, DEF_HANDLER, cleanup); 1090d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1100d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_tmpdir(); 1110d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1120d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_FILE_PRINTF(cleanup, TEST_FILE, "test file"); 1130d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1140d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_SYMLINK(cleanup, TEST_FILE, SFILE); 1150d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 1160d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1170d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid testfunc_append(void) 1180d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 1190d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com off_t file_offset; 1200d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1210d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_FILE_PRINTF(cleanup, TEST_FILE, "test file"); 1220d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1230d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST(openat(AT_FDCWD, TEST_FILE, O_APPEND | O_RDWR, 0777)); 1240d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1250d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (TEST_RETURN == -1) { 1260d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL | TTERRNO, "openat failed"); 1270d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 1280d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 1290d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1300d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_WRITE(cleanup, 1, TEST_RETURN, STR, sizeof(STR) - 1); 1310d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1320d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com file_offset = SAFE_LSEEK(cleanup, TEST_RETURN, 0, SEEK_CUR); 1330d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1340d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (file_offset > (off_t)(sizeof(STR) - 1)) 1350d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TPASS, "test O_APPEND for openat success"); 1360d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com else 1370d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL, "test O_APPEND for openat failed"); 1380d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1390d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, TEST_RETURN); 1400d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 1410d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1420d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid testfunc_cloexec(void) 1430d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 1440d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com pid_t pid; 1450d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com int status; 1460d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com char buf[20]; 1470d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1480d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if ((tst_kvercmp(2, 6, 23)) < 0) { 1490d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TCONF, "test O_CLOEXEC flags for openat " 1500d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com "needs kernel 2.6.23 or higher"); 1510d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 1520d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 1530d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1540d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST(openat(AT_FDCWD, TEST_FILE, O_CLOEXEC | O_RDWR, 0777)); 1550d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1560d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (TEST_RETURN == -1) { 1570d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL | TTERRNO, "openat failed"); 1580d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 1590d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 1600d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1610d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com sprintf(buf, "%ld", TEST_RETURN); 1620d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1630d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com pid = tst_fork(); 1640d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1650d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (pid < 0) 1660d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_brkm(TBROK | TERRNO, cleanup, "fork() failed"); 1670d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1680d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (pid == 0) { 1690d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (execlp(TEST_APP, TEST_APP, buf, NULL)) 1700d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com exit(2); 1710d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 1720d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1730d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, TEST_RETURN); 1740d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1750d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (wait(&status) == -1) 1760d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_brkm(TBROK | TERRNO, cleanup, "wait() failed"); 1770d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1780d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (WIFEXITED(status)) { 1790d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com switch ((int8_t)WEXITSTATUS(status)) { 1800d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com case 0: 1810d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TPASS, "test O_CLOEXEC for openat success"); 1820d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com break; 1830d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com case 1: 1840d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL, "test O_CLOEXEC for openat failed"); 1850d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com break; 1860d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com default: 1870d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_brkm(TBROK, cleanup, "execlp() failed"); 1880d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 1890d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } else { 1900d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_brkm(TBROK, cleanup, 1910d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com "openat2_exec exits with unexpected error"); 1920d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 1930d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 1940d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 1950d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid testfunc_largefile(void) 1960d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 1970d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com int fd; 1980d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com off64_t offset; 1990d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2000d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com fd = SAFE_OPEN(cleanup, LARGE_FILE, 2010d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com O_LARGEFILE | O_RDWR | O_CREAT, 0777); 2020d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2030d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com offset = lseek64(fd, 4.1*1024*1024*1024, SEEK_SET); 2040d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (offset == -1) 2050d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_brkm(TBROK | TERRNO, cleanup, "lseek64 failed"); 2060d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2070d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_WRITE(cleanup, 1, fd, STR, sizeof(STR) - 1); 2080d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2090d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, fd); 2100d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2110d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST(openat(AT_FDCWD, LARGE_FILE, O_LARGEFILE | O_RDONLY, 0777)); 2120d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2130d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (TEST_RETURN == -1) { 2140d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL, "test O_LARGEFILE for openat failed"); 2150d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } else { 2160d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TPASS, "test O_LARGEFILE for openat success"); 2170d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, TEST_RETURN); 2180d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 2190d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 2200d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2210d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid testfunc_noatime(void) 2220d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 2230d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com struct stat file_stat, file_newstat; 2240d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com char buf; 2250d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com const char *flags[] = {"noatime", "relatime", NULL}; 2260d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com int ret; 2270d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2280d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if ((tst_kvercmp(2, 6, 8)) < 0) { 2290d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TCONF, "test O_NOATIME flags for openat " 2300d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com "needs kernel 2.6.8 or higher"); 2310d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 2320d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 2330d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2340d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com ret = tst_path_has_mnt_flags(cleanup, NULL, flags); 2350d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (ret > 0) { 2360d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TCONF, "test O_NOATIME flag for openat needs " 2370d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com "filesystems which are mounted without " 2380d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com "noatime and relatime"); 2390d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 2400d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 2410d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2420d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_STAT(cleanup, TEST_FILE, &file_stat); 2430d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2440d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com sleep(1); 2450d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2460d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST(openat(AT_FDCWD, TEST_FILE, O_NOATIME | O_RDONLY, 0777)); 2470d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2480d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (TEST_RETURN == -1) { 2490d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL | TTERRNO, "openat failed"); 2500d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 2510d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 2520d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2530d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_READ(cleanup, 1, TEST_RETURN, &buf, 1); 2540d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2550d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, TEST_RETURN); 2560d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2570d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_STAT(cleanup, TEST_FILE, &file_newstat); 2580d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2590d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (file_stat.st_atime == file_newstat.st_atime) 2600d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TPASS, "test O_NOATIME for openat success"); 2610d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com else 2620d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL, "test O_NOATIME for openat failed"); 2630d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 2640d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2650d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid testfunc_nofollow(void) 2660d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 2670d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST(openat(AT_FDCWD, SFILE, O_NOFOLLOW | O_RDONLY, 0777)); 2680d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2690d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (TEST_RETURN == -1 && TEST_ERRNO == ELOOP) { 2700d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TPASS, "test O_NOFOLLOW for openat success"); 2710d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } else { 2720d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL, "test O_NOFOLLOW for openat failed"); 2730d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, TEST_RETURN); 2740d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 2750d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 2760d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2770d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid testfunc_trunc(void) 2780d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 2790d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com struct stat file_stat; 2800d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2810d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com TEST(openat(AT_FDCWD, TEST_FILE, O_TRUNC | O_RDWR, 0777)); 2820d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2830d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (TEST_RETURN == -1) { 2840d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL | TTERRNO, "openat failed"); 2850d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com return; 2860d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com } 2870d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2880d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_FSTAT(cleanup, TEST_RETURN, &file_stat); 2890d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2900d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com if (file_stat.st_size == 0) 2910d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TPASS, "test O_TRUNC for openat success"); 2920d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com else 2930d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_resm(TFAIL, "test O_TRUNC for openat failed"); 2940d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2950d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com SAFE_CLOSE(cleanup, TEST_RETURN); 2960d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 2970d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com 2980d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.comvoid cleanup(void) 2990d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com{ 3000d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com tst_rmdir(); 3010d1cfbea0f99f476a2aa6f8bce142e22c1dddfe2gux.fnst@cn.fujitsu.com} 302