You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
5.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/******************************************************************************/
/* */
/* Copyright (c) Ulrich Drepper <drepper@redhat.com> */
/* Copyright (c) International Business Machines Corp., 2009 */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
/* the GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program; if not, write to the Free Software */
/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* File: dup3_01.c */
/* */
/* Description: This Program tests the new system call introduced in 2.6.27. */
/* Ulrich´s comment as in: */
/* http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=336dd1f70ff62d7dd8655228caed4c5bfc818c56 */
/* says: */
/* This patch adds the new dup3 syscall. It extends the old dup2 syscall by */
/* one parameter which is meant to hold a flag value. Support for the */
/* O_CLOEXEC flag is added in this patch. The following test must be adjusted */
/* for architectures other than x86 and x86-64 and in case the */
/* syscall numbers changed. */
/* */
/* Usage: <for command-line> */
/* dup3_01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */
/* where, -c n : Run n copies concurrently. */
/* -e : Turn on errno logging. */
/* -i n : Execute test n times. */
/* -I x : Execute test for x seconds. */
/* -P x : Pause for x seconds between iterations. */
/* -t : Turn on syscall timing. */
/* */
/* Total Tests: 1 */
/* */
/* Test Name: dup3_01 */
/* */
/* Author: Ulrich Drepper <drepper@redhat.com> */
/* */
/* History: Created - Jan 13 2009 - Ulrich Drepper <drepper@redhat.com> */
/* Ported to LTP */
/* - Jan 13 2009 - Subrata <subrata@linux.vnet.ibm.com> */
/******************************************************************************/
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>
#include "test.h"
#include "lapi/fcntl.h"
#include "lapi/syscalls.h"
char *TCID = "dup3_01";
int TST_TOTAL = 1;
void cleanup(void)
{
tst_rmdir();
}
void setup(void)
{
TEST_PAUSE;
tst_tmpdir();
}
int main(int argc, char *argv[])
{
int fd, coe;
tst_parse_opts(argc, argv, NULL, NULL);
if ((tst_kvercmp(2, 6, 27)) < 0)
tst_brkm(TCONF, NULL,
"This test can only run on kernels that are 2.6.27 and higher");
setup();
fd = ltp_syscall(__NR_dup3, 1, 4, 0);
if (fd == -1) {
tst_brkm(TFAIL | TERRNO, cleanup, "dup3(0) failed");
}
coe = fcntl(fd, F_GETFD);
if (coe == -1) {
tst_brkm(TBROK | TERRNO, cleanup, "fcntl failed");
}
if (coe & FD_CLOEXEC) {
tst_brkm(TFAIL, cleanup, "dup3(0) set close-on-exec flag");
}
close(fd);
fd = ltp_syscall(__NR_dup3, 1, 4, O_CLOEXEC);
if (fd == -1) {
tst_brkm(TFAIL | TERRNO, cleanup, "dup3(O_CLOEXEC) failed");
}
coe = fcntl(fd, F_GETFD);
if (coe == -1) {
tst_brkm(TBROK | TERRNO, cleanup, "fcntl failed");
}
if ((coe & FD_CLOEXEC) == 0) {
tst_brkm(TFAIL, cleanup,
"dup3(O_CLOEXEC) set close-on-exec flag");
}
close(fd);
tst_resm(TPASS, "dup3(O_CLOEXEC) PASSED");
cleanup();
tst_exit();
}