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