All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH v2 0/4] Convert syscalls/dup2/dup2{01...05} to new API
@ 2021-09-15 15:51 ` QI Fuli
  2021-09-15 15:51     ` QI Fuli
                     ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: QI Fuli @ 2021-09-15 15:51 UTC (permalink / raw)
  To: ltp; +Cc: QI Fuli

From: QI Fuli <qi.fuli@fujitsu.com>

Convert syscalls/dup2/dup2{01...05} to new API

QI Fuli (4):
  syscalls/dup2/dup201: Convert to new API
  syscalls/dup2/dup202: Convert to new API and merge dup204 into dup202
  syscalls/dup2/dup203: Convert to new API
  syscalls/dup2/dup205: Convert to new API

 testcases/kernel/syscalls/dup2/dup201.c | 174 +++------------
 testcases/kernel/syscalls/dup2/dup202.c | 190 +++++-----------
 testcases/kernel/syscalls/dup2/dup203.c | 282 +++++++++---------------
 testcases/kernel/syscalls/dup2/dup204.c | 128 -----------
 testcases/kernel/syscalls/dup2/dup205.c | 167 +++++---------
 5 files changed, 243 insertions(+), 698 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/dup2/dup204.c

-- 
2.31.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [LTP] [PATCH v2 1/4] syscalls/dup2/dup201: Convert to new API
@ 2021-09-15 15:51     ` QI Fuli
  2021-09-16  6:30         ` xuyang2018.jy
  0 siblings, 1 reply; 11+ messages in thread
From: QI Fuli @ 2021-09-15 15:51 UTC (permalink / raw)
  To: ltp; +Cc: QI Fuli

From: QI Fuli <qi.fuli@fujitsu.com>

Signed-off-by: QI Fuli <qi.fuli@fujitsu.com>
---
 testcases/kernel/syscalls/dup2/dup201.c | 174 +++++-------------------
 1 file changed, 33 insertions(+), 141 deletions(-)

diff --git a/testcases/kernel/syscalls/dup2/dup201.c b/testcases/kernel/syscalls/dup2/dup201.c
index 4fa34466a..8e47a2244 100644
--- a/testcases/kernel/syscalls/dup2/dup201.c
+++ b/testcases/kernel/syscalls/dup2/dup201.c
@@ -1,163 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
- *
- *   Copyright (c) International Business Machines  Corp., 2001
- *
- *   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
+ * Copyright (c) International Business Machines  Corp., 2001
  */
 
-/*
- * NAME
- *	dup201.c
- *
- * DESCRIPTION
- *	Negative tests for dup2() with bad fd (EBADF)
- *
- * ALGORITHM
- * 	Setup:
- *	a.	Setup signal handling.
- *	b.	Pause for SIGUSR1 if option specified.
- *
- * 	Test:
- *	a.	Loop if the proper options are given.
- *	b.	Loop through the test cases
- * 	c.	Execute dup2() system call
- *	d.	Check return code, if system call failed (return=-1), test
- *		for EBADF.
- *
- * 	Cleanup:
- * 	a.	Print errno log and/or timing stats if options given
+/*\
+ * [Description]
  *
- * USAGE:  <for command-line>
- *  dup201 [-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.
+ * Negative tests for dup2() with bad fd (EBADF)
+ * First fd argument is less than 0
+ * First fd argument is getdtablesize()
+ * Second fd argument is less than 0
+ * Second fd argument is getdtablesize()
  *
- * HISTORY
- *	07/2001 Ported by Wayne Boyer
- *	01/2002 Removed EMFILE test - Paul Larson
- *
- * RESTRICTIONS
- * 	NONE
  */
 
-#include <sys/types.h>
-#include <fcntl.h>
 #include <errno.h>
-#include <sys/time.h>
-#include <sys/resource.h>
 #include <unistd.h>
-#include <signal.h>
-#include "test.h"
-
-void setup(void);
-void cleanup(void);
-
-char *TCID = "dup201";
-int TST_TOTAL = 4;
+#include "tst_test.h"
 
-int maxfd;
-int goodfd = 5;
-int badfd = -1;
-int mystdout = 0;
+static int maxfd;
+static int goodfd = 5;
+static int badfd = -1;
+static int mystdout = 0;
 
-struct test_case_t {
+static struct tcase {
 	int *ofd;
 	int *nfd;
-	int error;
-	void (*setupfunc) ();
-} TC[] = {
-	/* First fd argument is less than 0 - EBADF */
-	{&badfd, &goodfd, EBADF, NULL},
-	    /* First fd argument is getdtablesize() - EBADF */
-	{&maxfd, &goodfd, EBADF, NULL},
-	    /* Second fd argument is less than 0 - EBADF */
-	{&mystdout, &badfd, EBADF, NULL},
-	    /* Second fd argument is getdtablesize() - EBADF */
-	{&mystdout, &maxfd, EBADF, NULL},
+} tcases[] = {
+	{&badfd, &goodfd},
+	{&maxfd, &goodfd},
+	{&mystdout, &badfd},
+	{&mystdout, &maxfd},
 };
 
-int main(int ac, char **av)
-{
-	int lc;
-	int i;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/* loop through the test cases */
-
-		for (i = 0; i < TST_TOTAL; i++) {
-
-			/* call the test case setup routine if necessary */
-			if (TC[i].setupfunc != NULL)
-				(*TC[i].setupfunc) ();
-
-			TEST(dup2(*TC[i].ofd, *TC[i].nfd));
-
-			if (TEST_RETURN != -1) {
-				tst_resm(TFAIL, "call succeeded unexpectedly");
-				continue;
-			}
-
-			if (TEST_ERRNO == TC[i].error) {
-				tst_resm(TPASS,
-					 "failed as expected - errno = %d : %s",
-					 TEST_ERRNO, strerror(TEST_ERRNO));
-			} else {
-				tst_resm(TFAIL | TTERRNO,
-					 "failed unexpectedly; "
-					 "expected %d: %s", TC[i].error,
-					 strerror(TC[i].error));
-			}
-		}
-	}
-	cleanup();
-
-	tst_exit();
-}
-
-/*
- * setup() - performs all ONE TIME setup for this test.
- */
-void setup(void)
+static void setup(void)
 {
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
 	/* get some test specific values */
 	maxfd = getdtablesize();
 }
 
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at
- *	       completion or premature exit.
- */
-void cleanup(void)
+static void run(unsigned int i)
 {
-	tst_rmdir();
+	struct tcase *tc = tcases + i;
+
+	TST_EXP_FAIL2(dup2(*tc->ofd, *tc->nfd), EBADF,
+			"failed as expected - %s", strerror(EBADF));
 }
+
+static struct tst_test test = {
+	.tcnt = ARRAY_SIZE(tcases),
+	.test = run,
+	.setup = setup,
+};
-- 
2.31.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [LTP] [PATCH v2 2/4] syscalls/dup2/dup202: Convert to new API and merge dup204 into dup202
@ 2021-09-15 15:51     ` QI Fuli
  2021-09-16  7:13         ` xuyang2018.jy
  0 siblings, 1 reply; 11+ messages in thread
From: QI Fuli @ 2021-09-15 15:51 UTC (permalink / raw)
  To: ltp; +Cc: QI Fuli

From: QI Fuli <qi.fuli@fujitsu.com>

Signed-off-by: QI Fuli <qi.fuli@fujitsu.com>
---
 testcases/kernel/syscalls/dup2/dup202.c | 190 +++++++-----------------
 testcases/kernel/syscalls/dup2/dup204.c | 128 ----------------
 2 files changed, 52 insertions(+), 266 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/dup2/dup204.c

diff --git a/testcases/kernel/syscalls/dup2/dup202.c b/testcases/kernel/syscalls/dup2/dup202.c
index c87769fa9..fd8aeb84e 100644
--- a/testcases/kernel/syscalls/dup2/dup202.c
+++ b/testcases/kernel/syscalls/dup2/dup202.c
@@ -1,167 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
- *
- *   Copyright (c) International Business Machines  Corp., 2001
- *
- *   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
+ * Copyright (c) International Business Machines  Corp., 2001
  */
 
-/*
- * NAME
- *	dup202.c
- *
- * DESCRIPTION
- *	Is the access mode the same for both file descriptors?
- *		0: read only ?	"0444"
- *		1: write only ? "0222"
- *		2: read/write ? "0666"
- *
- * ALGORITHM
- *	Creat a file with each access mode; dup each file descriptor;
- *	stat each file descriptor and compare modes of each pair
- *
- * USAGE:  <for command-line>
- *  dup202 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
- *     where,  -c n : Run n copies concurrently.
- *             -f   : Turn off functionality Testing.
- *             -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.
- *
- * HISTORY
- *	07/2001 Ported by Wayne Boyer
+/*\
+ * [Description]
  *
- * RESTRICTIONS
- *	None
+ * Is the access mode the same for both file descriptors?
+ *	0: read only ?	"0444"
+ *	1: write only ? "0222"
+ *	2: read/write ? "0666"
  */
 
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <errno.h>
-#include <fcntl.h>
 #include <stdio.h>
-#include "test.h"
-#include "safe_macros.h"
+#include "tst_test.h"
+#include "tst_safe_macros.h"
 
-char *TCID = "dup202";
-int TST_TOTAL = 3;
-
-void setup(void);
-void cleanup(void);
-
-char testfile[40];
-int fail;
-int newfd;
+static char testfile[40];
 
 /* set these to a known index into our local file descriptor table */
-int duprdo = 10, dupwro = 20, duprdwr = 30;
+static int duprdo = 10, dupwro = 20, duprdwr = 30;
 
-struct test_case_t {
+static struct tcase {
 	int *nfd;
 	mode_t mode;
-} TC[] = {
-	/* The first test creat(es) a file with mode 0444 */
-	{
-	&duprdo, (S_IRUSR | S_IRGRP | S_IROTH)},
-	    /* The second test creat(es) a file with mode 0222 */
-	{
-	&dupwro, (S_IWUSR | S_IWGRP | S_IWOTH)},
-	    /* The third test creat(es) a file with mode 0666 */
-	{
-	&duprdwr,
-		    (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH)}
+} tcases[]= {
+	{&duprdo, (S_IRUSR | S_IRGRP | S_IROTH)},
+	{&dupwro, (S_IWUSR | S_IWGRP | S_IWOTH)},
+	{&duprdwr, (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH)},
 };
 
-int main(int ac, char **av)
+static void setup(void)
 {
-	int lc;
-	int i, ofd;
-	struct stat oldbuf, newbuf;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/* loop through the test cases */
-		for (i = 0; i < TST_TOTAL; i++) {
-
-			if ((ofd = creat(testfile, TC[i].mode)) == -1)
-				tst_brkm(TBROK | TERRNO, cleanup,
-					 "creat failed");
-
-			TEST(dup2(ofd, *TC[i].nfd));
-
-			if (TEST_RETURN == -1) {
-				tst_resm(TFAIL | TTERRNO,
-					 "call failed unexpectedly");
-				continue;
-			}
+	umask(0);
+	sprintf(testfile, "dup202.%d", getpid());
+}
 
-			/* stat the original file */
-			SAFE_FSTAT(cleanup, ofd, &oldbuf);
+static void run(unsigned int i)
+{
+	int ofd;
+	struct stat oldbuf, newbuf;
+	struct tcase *tc = tcases + i;
 
-			/* stat the duped file */
-			SAFE_FSTAT(cleanup, *TC[i].nfd, &newbuf);
+	ofd = SAFE_OPEN(testfile, O_CREAT, tc->mode);
 
-			if (oldbuf.st_mode != newbuf.st_mode)
-				tst_resm(TFAIL, "original and dup "
-					 "modes do not match");
-			else
-				tst_resm(TPASS, "fstat shows new and "
-					 "old modes are the same");
+	TEST(dup2(ofd, *tc->nfd));
 
-			/* remove the file so that we can use it again */
-			if (close(*TC[i].nfd) == -1)
-				perror("close failed");
-			if (close(ofd) == -1)
-				perror("close failed");
-			if (unlink(testfile) == -1)
-				perror("unlink failed");
-		}
+	if (TST_RET == -1) {
+		tst_res(TFAIL | TTERRNO, "call failed unexpectedly");
+		return;
 	}
 
-	cleanup();
-	tst_exit();
-}
-
-/*
- * setup() - performs all ONE TIME setup for this test.
- */
-void setup(void)
-{
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
+	/* stat the original file */
+	SAFE_FSTAT(ofd, &oldbuf);
 
-	TEST_PAUSE;
+	/* stat the duped file */
+	SAFE_FSTAT(*tc->nfd, &newbuf);
 
-	tst_tmpdir();
+	if (oldbuf.st_mode != newbuf.st_mode)
+		tst_res(TFAIL, "original and duped modes do not match");
+	else
+		tst_res(TPASS, "original and duped modes are the same");
 
-	(void)umask(0);
+	if (oldbuf.st_ino != newbuf.st_ino)
+		tst_res(TFAIL, "original and duped inodes do not match");
+	else
+		tst_res(TPASS, "original and duped inodes are the same");
 
-	sprintf(testfile, "dup202.%d", getpid());
+	SAFE_CLOSE(*tc->nfd);
+	SAFE_CLOSE(ofd);
 }
 
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at
- *	       completion or premature exit.
- */
-void cleanup(void)
-{
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.needs_tmpdir = 1,
+	.tcnt = ARRAY_SIZE(tcases),
+	.test = run,
+	.setup = setup,
+};
diff --git a/testcases/kernel/syscalls/dup2/dup204.c b/testcases/kernel/syscalls/dup2/dup204.c
deleted file mode 100644
index a357bc17e..000000000
--- a/testcases/kernel/syscalls/dup2/dup204.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- *   Copyright (c) International Business Machines  Corp., 2001
- *
- *   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
- */
-
-/*
- * NAME
- *	dup204.c
- *
- * DESCRIPTION
- *	Testcase to check the basic functionality of dup2(2).
- *
- * ALGORITHM
- *	attempt to call dup2() on read/write ends of a pipe
- *
- * USAGE:  <for command-line>
- *  dup204 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
- *     where,  -c n : Run n copies concurrently.
- *             -f   : Turn off functionality Testing.
- *             -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.
- *
- * RESTRICTION
- *	NONE
- */
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <signal.h>
-#include <string.h>
-#include "test.h"
-#include "safe_macros.h"
-
-void setup();
-void cleanup();
-
-char *TCID = "dup204";
-int TST_TOTAL = 2;
-
-int fd[2];
-int nfd[2];
-
-int main(int ac, char **av)
-{
-	int lc;
-	int i;
-	struct stat oldbuf, newbuf;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/* loop through the test cases */
-		for (i = 0; i < TST_TOTAL; i++) {
-			TEST(dup2(fd[i], nfd[i]));
-
-			if (TEST_RETURN == -1) {
-				tst_resm(TFAIL, "call failed unexpectedly");
-				continue;
-			}
-
-			SAFE_FSTAT(cleanup, fd[i], &oldbuf);
-			SAFE_FSTAT(cleanup, nfd[i], &newbuf);
-
-			if (oldbuf.st_ino != newbuf.st_ino)
-				tst_resm(TFAIL, "original and duped "
-					 "inodes do not match");
-			else
-				tst_resm(TPASS, "original and duped "
-					 "inodes are the same");
-
-			SAFE_CLOSE(cleanup, TEST_RETURN);
-		}
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-void setup(void)
-{
-	fd[0] = -1;
-
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	SAFE_PIPE(cleanup, fd);
-}
-
-void cleanup(void)
-{
-	int i;
-
-	for (i = 0; i < (int)ARRAY_SIZE(fd); i++) {
-		close(fd[i]);
-		close(nfd[i]);
-	}
-
-	tst_rmdir();
-}
-- 
2.31.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [LTP] [PATCH v2 3/4] syscalls/dup2/dup203: Convert to new API
@ 2021-09-15 15:51     ` QI Fuli
  2021-09-16  8:23         ` xuyang2018.jy
  0 siblings, 1 reply; 11+ messages in thread
From: QI Fuli @ 2021-09-15 15:51 UTC (permalink / raw)
  To: ltp; +Cc: QI Fuli

From: QI Fuli <qi.fuli@fujitsu.com>

Signed-off-by: QI Fuli <qi.fuli@fujitsu.com>
---
 testcases/kernel/syscalls/dup2/dup203.c | 282 +++++++++---------------
 1 file changed, 101 insertions(+), 181 deletions(-)

diff --git a/testcases/kernel/syscalls/dup2/dup203.c b/testcases/kernel/syscalls/dup2/dup203.c
index e6f281adf..a840f4638 100644
--- a/testcases/kernel/syscalls/dup2/dup203.c
+++ b/testcases/kernel/syscalls/dup2/dup203.c
@@ -1,208 +1,128 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
- *
- *   Copyright (c) International Business Machines  Corp., 2001
- *
- *   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
+ * Copyright (c) International Business Machines  Corp., 2001
  */
 
-/*
- * NAME
- *	dup203.c
- *
- * DESCRIPTION
+/*\
+ * [Description]
  *	Testcase to check the basic functionality of dup2().
- *
- * ALGORITHM
- *	1.	Attempt to dup2() on an open file descriptor.
- *	2.	Attempt to dup2() on a close file descriptor.
- *
- * USAGE:  <for command-line>
- *  dup203 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
- *     where,  -c n : Run n copies concurrently.
- *             -f   : Turn off functionality Testing.
- *             -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.
- *
- * HISTORY
- *	07/2001 Ported by Wayne Boyer
- *
- * RESTRICTIONS
- *	NONE
+ *	1. Attempt to dup2() on an open file descriptor.
+ *	2. Attempt to dup2() on a close file descriptor.
  */
 
-#include <fcntl.h>
-#include <sys/param.h>
 #include <errno.h>
-#include <string.h>
-#include "test.h"
-#include "safe_macros.h"
+#include <stdio.h>
+#include "tst_test.h"
+#include "tst_safe_macros.h"
+
+static int fd0, fd1, fd2, rval;
+static char filename0[40], filename1[40];
+static char buf[40];
+
+static void verify_open(void);
+static void verify_close(void);
+
+static struct tcase {
+	char *desc;
+	void (*verify)();
+} tcases [] = {
+	{"Test duping over an open fd", verify_open},
+	{"Test close on exec flag", verify_close},
+};
+
+static void verify_open(void)
+{
+	sprintf(filename0, "dup203.file0.%d\n", getpid());
+	sprintf(filename1, "dup203.file1.%d\n", getpid());
+	unlink(filename0);
+	unlink(filename1);
+
+	fd0 = SAFE_CREAT(filename0, 0666);
+	SAFE_WRITE(1, fd0, filename0, strlen(filename0));
+	SAFE_CLOSE(fd0);
+
+	fd1 = SAFE_CREAT(filename1, 0666);
+	SAFE_WRITE(1, fd1, filename1, strlen(filename1));
+	SAFE_CLOSE(fd1);
+
+	fd0 = SAFE_OPEN(filename0, O_RDONLY);
+	fd1 = SAFE_OPEN(filename1, O_RDONLY);
+
+	TEST(dup2(fd0, fd1));
+
+	if ((fd2 = TST_RET) == -1)
+		tst_res(TFAIL, "call failed unexpectedly");
+	else {
+		if (fd1 != fd2) {
+			tst_res(TFAIL, "file descriptors don't match");
+			return;
+		}
 
-void setup(void);
-void cleanup(void);
+		memset(buf, 0, sizeof(buf));
+		SAFE_READ(0, fd2, buf, sizeof(buf));
+		if (strcmp(buf, filename0) != 0)
+			tst_res(TFAIL, "read from file got bad data");
+		tst_res(TPASS, "dup2 test 1 functionality is correct");
+	}
 
-char *TCID = "dup203";
-int TST_TOTAL = 1;
+	SAFE_CLOSE(fd0);
+	SAFE_CLOSE(fd1);
+	close(fd2);
+}
 
-int main(int ac, char **av)
+static void verify_close(void)
 {
-	int fd0, fd1, fd2, rval;
-	char filename0[40], filename1[40];
-	char buf[40];
-
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-//block1:
-		tst_resm(TINFO, "Enter block 1");
-		tst_resm(TINFO, "Test duping over an open fd");
-
-		sprintf(filename0, "dup202.file0.%d\n", getpid());
-		sprintf(filename1, "dup202.file1.%d\n", getpid());
-		unlink(filename0);
-		unlink(filename1);
-
-		if ((fd0 = creat(filename0, 0666)) == -1)
-			tst_brkm(TBROK, cleanup, "cannot create first file");
-		if (write(fd0, filename0, strlen(filename0)) == -1)
-			tst_brkm(TBROK, cleanup, "filename0: write(2) failed");
-
-		if ((fd1 = creat(filename1, 0666)) == -1)
-			tst_brkm(TBROK, cleanup, "Cannot create second file");
-		if (write(fd1, filename1, strlen(filename1)) == -1)
-			tst_brkm(TBROK, cleanup, "filename1: write(2) failed");
-
-		SAFE_CLOSE(cleanup, fd0);
-		if ((fd0 = open(filename0, O_RDONLY)) == -1)
-			tst_brkm(TBROK, cleanup, "open(2) on filename0 failed");
-
-		SAFE_CLOSE(cleanup, fd1);
-		if ((fd1 = open(filename1, O_RDONLY)) == -1)
-			tst_brkm(TBROK, cleanup, "open(2) on filename1 failed");
-
-		TEST(dup2(fd0, fd1));
-
-		if ((fd2 = TEST_RETURN) == -1) {
-			tst_resm(TFAIL, "call failed unexpectedly");
-		} else {
-			if (fd1 != fd2) {
-				tst_resm(TFAIL, "file descriptors don't match");
-				break;
-			}
-
-			memset(buf, 0, sizeof(buf));
-			if (read(fd2, buf, sizeof(buf)) == -1)
-				tst_brkm(TBROK, cleanup, "read(2) failed");
-			if (strcmp(buf, filename0) != 0)
-				tst_resm(TFAIL, "read from file got bad data");
-			tst_resm(TPASS, "dup2 test 1 functionality is correct");
-		}
-
-		close(fd0);
-		close(fd1);
-		close(fd2);
-		unlink(filename0);
-		unlink(filename1);
+	sprintf(filename0, "dup203.%d\n", getpid());
+	unlink(filename0);
 
-		tst_resm(TINFO, "Exit block 1");
+	fd0 = SAFE_CREAT(filename0, 0666);
+	SAFE_FCNTL(fd0, F_SETFD, 1);
 
-//block2:
-		tst_resm(TINFO, "Enter block 2");
-		tst_resm(TINFO, "Test close on exec flag");
+	fd2 = SAFE_CREAT(filename1, 0666);
 
-		sprintf(filename0, "dup02.%d\n", getpid());
-		unlink(filename0);
+	/* SAFE_CLOSE() sets the fd to -1 avoid it here */
+	rval = fd2;
+	SAFE_CLOSE(rval);
 
-		if ((fd0 = creat(filename0, 0666)) == -1) {
-			tst_brkm(TBROK, cleanup, "Cannot create first file");
-		}
-		if (fcntl(fd0, F_SETFD, 1) == -1) {
-			tst_brkm(TBROK, cleanup, "setting close on exec flag "
-				 "on fd0 failed");
-		}
+	TEST(dup2(fd0, fd2));
 
-		if ((fd2 = creat(filename1, 0666)) == -1) {
-			tst_brkm(TBROK, cleanup, "Cannot create second file");
+	if ((fd1 = TST_RET) == -1)
+		tst_res(TFAIL, "call failed unexpectedly");
+	else {
+		if (fd1 != fd2) {
+			tst_res(TFAIL, "bad dup2 descriptor %d", fd1);
+			return;
 		}
-
-		/* SAFE_CLOSE() sets the fd to -1 avoid it here */
-		rval = fd2;
-		SAFE_CLOSE(cleanup, rval);
-
-		TEST(dup2(fd0, fd2));
-
-		if ((fd1 = TEST_RETURN) == -1) {
-			tst_resm(TFAIL, "call failed unexpectedly");
-		} else {
-			if (fd1 != fd2) {
-				tst_resm(TFAIL, "bad dup2 descriptor %d", fd1);
-				break;
-			}
-
-			if ((rval = fcntl(fd1, F_GETFD, 0)) != 0) {
-				tst_resm(TBROK | TERRNO,
-					 "fcntl F_GETFD on fd1 failed; expected a "
-					 "return value of 0x0, got %#x", rval);
-				break;
-			}
-			if ((rval = (fcntl(fd0, F_GETFL, 0) & O_ACCMODE)) !=
-			    O_WRONLY) {
-				tst_resm(TFAIL, "fctnl F_GETFL bad rval on fd0 "
-					 "Expected %#x got %#x", O_WRONLY,
-					 rval);
-			}
-			tst_resm(TPASS, "dup2 test 2 functionality is correct");
+		rval = SAFE_FCNTL(fd1, F_GETFD, 0);
+		if (rval != 0) {
+			tst_res(TFAIL | TERRNO,
+				"fcntl F_GETFD on fd1 failed; expected a "
+				"return value of 0x0, got %#x", rval);
+			return;
 		}
-
-		close(fd0);
-		close(fd1);
-
-		unlink(filename0);
-		unlink(filename1);
-		tst_resm(TINFO, "Exit block 2");
+		rval = SAFE_FCNTL(fd0, F_GETFD, 0);
+		if ((rval & O_ACCMODE) != O_WRONLY)
+			tst_res(TFAIL, "fctnl F_GETFL bad rval on fd0 "
+				"Expected %#x got %#x", O_WRONLY, rval);
+		tst_res(TPASS, "dup2 test 2 functionality is correct");
 	}
 
-	cleanup();
-	tst_exit();
+	SAFE_CLOSE(fd0);
+	SAFE_CLOSE(fd1);
 }
 
-/*
- * setup() - performs all ONE TIME setup for this test.
- */
-void setup(void)
+static void run(unsigned int i)
 {
+	struct tcase *tc = tcases + i;
 
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
+	tst_res(TINFO, tc->desc);
+	tc->verify();
 
-	TEST_PAUSE;
-
-	tst_tmpdir();
 }
 
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at
- *	       completion or premature exit.
- */
-void cleanup(void)
-{
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.tcnt = ARRAY_SIZE(tcases),
+	.needs_tmpdir = 1,
+	.test = run,
+};
-- 
2.31.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [LTP] [PATCH v2 4/4] syscalls/dup2/dup205: Convert to new API
@ 2021-09-15 15:51     ` QI Fuli
  2021-09-16  8:42         ` xuyang2018.jy
  0 siblings, 1 reply; 11+ messages in thread
From: QI Fuli @ 2021-09-15 15:51 UTC (permalink / raw)
  To: ltp; +Cc: QI Fuli

From: QI Fuli <qi.fuli@fujitsu.com>

Signed-off-by: QI Fuli <qi.fuli@fujitsu.com>
---
 testcases/kernel/syscalls/dup2/dup205.c | 167 ++++++++----------------
 1 file changed, 57 insertions(+), 110 deletions(-)

diff --git a/testcases/kernel/syscalls/dup2/dup205.c b/testcases/kernel/syscalls/dup2/dup205.c
index 0b324531f..1f4796659 100644
--- a/testcases/kernel/syscalls/dup2/dup205.c
+++ b/testcases/kernel/syscalls/dup2/dup205.c
@@ -1,134 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /*
+ * Copyright (c) International Business Machines  Corp., 2002
  *
- *   Copyright (c) International Business Machines  Corp., 2002
- *
- *   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.
+ */
+
+/*\
+ * [Description]
  *
- *   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.
+ * Negative test for dup2() with max open file descriptors.
  *
- *   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
  */
 
 /* Ported from SPIE, section2/iosuite/dup6.c, by Airong Zhang */
 
-/*======================================================================
-	=================== TESTPLAN SEGMENT ===================
->KEYS:  < dup2()
->WHAT:  < Does dup return -1 on the 21st file?
->HOW:   < Create up to _NFILE files and check for -1 return on the
-	< next attempt
-	< Should check NOFILE as well as _NFILE.  19-Jun-84 Dale.
->BUGS:  <
-======================================================================*/
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <fcntl.h>
+#include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
-#include "test.h"
-
-char *TCID = "dup205";
-int TST_TOTAL = 1;
-int *fildes;
-int min;
-int local_flag;
-
-#define PASSED 1
-#define FAILED 0
-
-static void setup(void);
-static void cleanup(void);
-
-int main(int ac, char *av[])
-{
-	int ifile;
-	char pfilname[40];
-	int serrno;
-
-	int lc;
-
-	ifile = -1;
-
-	tst_parse_opts(ac, av, NULL, NULL);
+#include "tst_test.h"
+#include "tst_safe_macros.h"
 
-	local_flag = PASSED;
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		sprintf(pfilname, "./dup205.%d\n", getpid());
-		unlink(pfilname);
-		serrno = 0;
-		if ((fildes[0] = creat(pfilname, 0666)) == -1)
-			tst_brkm(TBROK | TERRNO, cleanup, "creat failed");
-		else {
-			fildes[fildes[0]] = fildes[0];
-			for (ifile = fildes[0] + 1; ifile < min + 10; ifile++) {
-				if ((fildes[ifile] = dup2(fildes[ifile - 1],
-							  ifile)) == -1) {
-					serrno = errno;
-					break;
-				} else {
-					if (fildes[ifile] != ifile) {
-						tst_brkm(TFAIL, cleanup,
-							 "got wrong descriptor "
-							 "number back (%d != %d)",
-							 fildes[ifile], ifile);
-					}
-				}
-			}	/* end for */
-			if (ifile < min) {
-				tst_resm(TFAIL, "Not enough files duped");
-				local_flag = FAILED;
-			} else if (ifile > min) {
-				tst_resm(TFAIL, "Too many files duped");
-				local_flag = FAILED;
-			}
-			if (serrno != EBADF && serrno != EMFILE &&
-			    serrno != EINVAL) {
-				tst_resm(TFAIL, "bad errno on dup2 failure");
-				local_flag = FAILED;
-			}
-		}
-		unlink(pfilname);
-		for (ifile = fildes[0]; ifile < min + 10; ifile++)
-			close(fildes[ifile]);
-		if (local_flag == PASSED) {
-			tst_resm(TPASS, "Test passed.");
-		} else {
-			tst_resm(TFAIL, "Test failed.");
-		}
-
-	}
-	cleanup();
-	tst_exit();
-}
+static int *fildes;
+static int min;
 
 static void setup(void)
 {
-	tst_tmpdir();
-
 	min = getdtablesize();	/* get number of files allowed open */
 	fildes = malloc((min + 10) * sizeof(int));
 	if (fildes == NULL)
-		tst_brkm(TBROK | TERRNO, cleanup, "malloc error");
+		tst_brk(TBROK | TERRNO, "malloc error");
 }
 
 static void cleanup(void)
 {
 	if (fildes != NULL)
 		free(fildes);
-	tst_rmdir();
 }
+
+static void run(void)
+{
+	int ifile;
+	char pfilname[40];
+
+	ifile = -1;
+
+	sprintf(pfilname, "./dup205.%d\n", getpid());
+	unlink(pfilname);
+
+	fildes[0] = SAFE_CREAT(pfilname, 0666);
+	fildes[fildes[0]] = fildes[0];
+	for (ifile = fildes[0] + 1; ifile < min + 10; ifile++) {
+		TEST(dup2(fildes[ifile - 1], ifile));
+		if ((fildes[ifile] = TST_RET) == -1)
+			break;
+		if (fildes[ifile] != ifile)
+			tst_brk(TFAIL, "got wrong descriptor number back "
+				"(%d != %d)", fildes[ifile], ifile);
+	}	/* end for */
+
+	if (TST_ERR != EBADF)
+		tst_res(TFAIL, "bad errno on dup2 failure");
+
+	if (ifile < min)
+		tst_res(TFAIL, "Not enough files duped");
+	else if (ifile > min)
+		tst_res(TFAIL, "Too many files duped");
+	else
+		tst_res(TPASS, "Test passed.");
+
+	unlink(pfilname);
+	for (ifile = fildes[0]; ifile < min + 10; ifile++)
+		close(fildes[ifile]);
+}
+
+static struct tst_test test = {
+	.needs_tmpdir = 1,
+	.test_all = run,
+	.setup = setup,
+	.cleanup = cleanup,
+};
-- 
2.31.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [LTP] [PATCH v2 1/4] syscalls/dup2/dup201: Convert to new API
@ 2021-09-16  6:30         ` xuyang2018.jy
  2021-09-16  7:10             ` qi.fuli
  0 siblings, 1 reply; 11+ messages in thread
From: xuyang2018.jy @ 2021-09-16  6:30 UTC (permalink / raw)
  To: QI Fuli; +Cc: qi.fuli, ltp

Hi Qi

> From: QI Fuli<qi.fuli@fujitsu.com>
>
> Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
> ---
>   testcases/kernel/syscalls/dup2/dup201.c | 174 +++++-------------------
>   1 file changed, 33 insertions(+), 141 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/dup2/dup201.c b/testcases/kernel/syscalls/dup2/dup201.c
> index 4fa34466a..8e47a2244 100644
> --- a/testcases/kernel/syscalls/dup2/dup201.c
> +++ b/testcases/kernel/syscalls/dup2/dup201.c
> @@ -1,163 +1,55 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
Remove this empty line.
>   /*
> - *
> - *   Copyright (c) International Business Machines  Corp., 2001
> - *
> - *   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
> + * Copyright (c) International Business Machines  Corp., 2001
>    */
>
> -/*
> - * NAME
> - *	dup201.c
> - *
> - * DESCRIPTION
> - *	Negative tests for dup2() with bad fd (EBADF)
> - *
> - * ALGORITHM
> - * 	Setup:
> - *	a.	Setup signal handling.
> - *	b.	Pause for SIGUSR1 if option specified.
> - *
> - * 	Test:
> - *	a.	Loop if the proper options are given.
> - *	b.	Loop through the test cases
> - * 	c.	Execute dup2() system call
> - *	d.	Check return code, if system call failed (return=-1), test
> - *		for EBADF.
> - *
> - * 	Cleanup:
> - * 	a.	Print errno log and/or timing stats if options given
> +/*\
> + * [Description]
>    *
> - * USAGE:<for command-line>
> - *  dup201 [-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.
> + * Negative tests for dup2() with bad fd (EBADF)
> + * First fd argument is less than 0
> + * First fd argument is getdtablesize()
> + * Second fd argument is less than 0
> + * Second fd argument is getdtablesize()
>    *
> - * HISTORY
> - *	07/2001 Ported by Wayne Boyer
> - *	01/2002 Removed EMFILE test - Paul Larson
I think we should keep this history info.
> - *
> - * RESTRICTIONS
> - * 	NONE
>    */
>
> -#include<sys/types.h>
> -#include<fcntl.h>
>   #include<errno.h>
> -#include<sys/time.h>
> -#include<sys/resource.h>
>   #include<unistd.h>
> -#include<signal.h>
> -#include "test.h"
> -
> -void setup(void);
> -void cleanup(void);
> -
> -char *TCID = "dup201";
> -int TST_TOTAL = 4;
> +#include "tst_test.h"
>
> -int maxfd;
> -int goodfd = 5;
> -int badfd = -1;
> -int mystdout = 0;
> +static int maxfd;
> +static int goodfd = 5;
> +static int badfd = -1;
> +static int mystdout = 0;
"static int mystdout" is enough and don't need to assign.
static int maxfd,mystdout;
>
> -struct test_case_t {
> +static struct tcase {
>   	int *ofd;
>   	int *nfd;
> -	int error;
> -	void (*setupfunc) ();
> -} TC[] = {
> -	/* First fd argument is less than 0 - EBADF */
> -	{&badfd,&goodfd, EBADF, NULL},
> -	    /* First fd argument is getdtablesize() - EBADF */
> -	{&maxfd,&goodfd, EBADF, NULL},
> -	    /* Second fd argument is less than 0 - EBADF */
> -	{&mystdout,&badfd, EBADF, NULL},
> -	    /* Second fd argument is getdtablesize() - EBADF */
> -	{&mystdout,&maxfd, EBADF, NULL},
> +} tcases[] = {
> +	{&badfd,&goodfd},
> +	{&maxfd,&goodfd},
> +	{&mystdout,&badfd},
> +	{&mystdout,&maxfd},
>   };
>
> -int main(int ac, char **av)
> -{
> -	int lc;
> -	int i;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		/* loop through the test cases */
> -
> -		for (i = 0; i<  TST_TOTAL; i++) {
> -
> -			/* call the test case setup routine if necessary */
> -			if (TC[i].setupfunc != NULL)
> -				(*TC[i].setupfunc) ();
> -
> -			TEST(dup2(*TC[i].ofd, *TC[i].nfd));
> -
> -			if (TEST_RETURN != -1) {
> -				tst_resm(TFAIL, "call succeeded unexpectedly");
> -				continue;
> -			}
> -
> -			if (TEST_ERRNO == TC[i].error) {
> -				tst_resm(TPASS,
> -					 "failed as expected - errno = %d : %s",
> -					 TEST_ERRNO, strerror(TEST_ERRNO));
> -			} else {
> -				tst_resm(TFAIL | TTERRNO,
> -					 "failed unexpectedly; "
> -					 "expected %d: %s", TC[i].error,
> -					 strerror(TC[i].error));
> -			}
> -		}
> -	}
> -	cleanup();
> -
> -	tst_exit();
> -}
> -
> -/*
> - * setup() - performs all ONE TIME setup for this test.
> - */
> -void setup(void)
> +static void setup(void)
>   {
> -
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> -
> -	TEST_PAUSE;
> -
> -	tst_tmpdir();
> -
>   	/* get some test specific values */
>   	maxfd = getdtablesize();
>   }
>
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - *	       completion or premature exit.
> - */
> -void cleanup(void)
> +static void run(unsigned int i)
>   {
> -	tst_rmdir();
> +	struct tcase *tc = tcases + i;
> +
> +	TST_EXP_FAIL2(dup2(*tc->ofd, *tc->nfd), EBADF,
> +			"failed as expected - %s", strerror(EBADF));
Since TST_EXP_FAIL2 macro will print errno number and string automaully.
We don't need to print the duplicated info.
your info:
dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)

use    TST_EXP_FAIL2(dup2(*tc->ofd, *tc->nfd), EBADF,
                        "dup2(%d, %d)", *tc->ofd, *tc->nfd);
info as below:
dup201.c:47: TPASS: dup2(-1, 5) : EBADF (9)
dup201.c:47: TPASS: dup2(1024, 5) : EBADF (9)
dup201.c:47: TPASS: dup2(0, -1) : EBADF (9)
dup201.c:47: TPASS: dup2(0, 1024) : EBADF (9)

other than these nits, this patch looks good to me
Reviewed-by: Yang Xu <xuyang2018.jy@fujitsu.com>

Best Regards
Yang Xu


>   }
> +
> +static struct tst_test test = {
> +	.tcnt = ARRAY_SIZE(tcases),
> +	.test = run,
> +	.setup = setup,
> +};

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [LTP] [PATCH v2 1/4] syscalls/dup2/dup201: Convert to new API
@ 2021-09-16  7:10             ` qi.fuli
  0 siblings, 0 replies; 11+ messages in thread
From: qi.fuli @ 2021-09-16  7:10 UTC (permalink / raw)
  To: xuyang2018.jy, QI Fuli; +Cc: ltp

> 
> Hi Qi
> 
> > From: QI Fuli<qi.fuli@fujitsu.com>
> >
> > Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
> > ---
> >   testcases/kernel/syscalls/dup2/dup201.c | 174 +++++-------------------
> >   1 file changed, 33 insertions(+), 141 deletions(-)
> >
> > diff --git a/testcases/kernel/syscalls/dup2/dup201.c
> > b/testcases/kernel/syscalls/dup2/dup201.c
> > index 4fa34466a..8e47a2244 100644
> > --- a/testcases/kernel/syscalls/dup2/dup201.c
> > +++ b/testcases/kernel/syscalls/dup2/dup201.c
> > @@ -1,163 +1,55 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +
> Remove this empty line.
> >   /*
> > - *
> > - *   Copyright (c) International Business Machines  Corp., 2001
> > - *
> > - *   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
> > + * Copyright (c) International Business Machines  Corp., 2001
> >    */
> >
> > -/*
> > - * NAME
> > - *	dup201.c
> > - *
> > - * DESCRIPTION
> > - *	Negative tests for dup2() with bad fd (EBADF)
> > - *
> > - * ALGORITHM
> > - * 	Setup:
> > - *	a.	Setup signal handling.
> > - *	b.	Pause for SIGUSR1 if option specified.
> > - *
> > - * 	Test:
> > - *	a.	Loop if the proper options are given.
> > - *	b.	Loop through the test cases
> > - * 	c.	Execute dup2() system call
> > - *	d.	Check return code, if system call failed (return=-1), test
> > - *		for EBADF.
> > - *
> > - * 	Cleanup:
> > - * 	a.	Print errno log and/or timing stats if options given
> > +/*\
> > + * [Description]
> >    *
> > - * USAGE:<for command-line>
> > - *  dup201 [-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.
> > + * Negative tests for dup2() with bad fd (EBADF)
> > + * First fd argument is less than 0
> > + * First fd argument is getdtablesize()
> > + * Second fd argument is less than 0
> > + * Second fd argument is getdtablesize()
> >    *
> > - * HISTORY
> > - *	07/2001 Ported by Wayne Boyer
> > - *	01/2002 Removed EMFILE test - Paul Larson
> I think we should keep this history info.
> > - *
> > - * RESTRICTIONS
> > - * 	NONE
> >    */
> >
> > -#include<sys/types.h>
> > -#include<fcntl.h>
> >   #include<errno.h>
> > -#include<sys/time.h>
> > -#include<sys/resource.h>
> >   #include<unistd.h>
> > -#include<signal.h>
> > -#include "test.h"
> > -
> > -void setup(void);
> > -void cleanup(void);
> > -
> > -char *TCID = "dup201";
> > -int TST_TOTAL = 4;
> > +#include "tst_test.h"
> >
> > -int maxfd;
> > -int goodfd = 5;
> > -int badfd = -1;
> > -int mystdout = 0;
> > +static int maxfd;
> > +static int goodfd = 5;
> > +static int badfd = -1;
> > +static int mystdout = 0;
> "static int mystdout" is enough and don't need to assign.
> static int maxfd,mystdout;
> >
> > -struct test_case_t {
> > +static struct tcase {
> >   	int *ofd;
> >   	int *nfd;
> > -	int error;
> > -	void (*setupfunc) ();
> > -} TC[] = {
> > -	/* First fd argument is less than 0 - EBADF */
> > -	{&badfd,&goodfd, EBADF, NULL},
> > -	    /* First fd argument is getdtablesize() - EBADF */
> > -	{&maxfd,&goodfd, EBADF, NULL},
> > -	    /* Second fd argument is less than 0 - EBADF */
> > -	{&mystdout,&badfd, EBADF, NULL},
> > -	    /* Second fd argument is getdtablesize() - EBADF */
> > -	{&mystdout,&maxfd, EBADF, NULL},
> > +} tcases[] = {
> > +	{&badfd,&goodfd},
> > +	{&maxfd,&goodfd},
> > +	{&mystdout,&badfd},
> > +	{&mystdout,&maxfd},
> >   };
> >
> > -int main(int ac, char **av)
> > -{
> > -	int lc;
> > -	int i;
> > -
> > -	tst_parse_opts(ac, av, NULL, NULL);
> > -
> > -	setup();
> > -
> > -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> > -
> > -		tst_count = 0;
> > -
> > -		/* loop through the test cases */
> > -
> > -		for (i = 0; i<  TST_TOTAL; i++) {
> > -
> > -			/* call the test case setup routine if necessary */
> > -			if (TC[i].setupfunc != NULL)
> > -				(*TC[i].setupfunc) ();
> > -
> > -			TEST(dup2(*TC[i].ofd, *TC[i].nfd));
> > -
> > -			if (TEST_RETURN != -1) {
> > -				tst_resm(TFAIL, "call succeeded
> unexpectedly");
> > -				continue;
> > -			}
> > -
> > -			if (TEST_ERRNO == TC[i].error) {
> > -				tst_resm(TPASS,
> > -					 "failed as expected - errno
> = %d : %s",
> > -					 TEST_ERRNO,
> strerror(TEST_ERRNO));
> > -			} else {
> > -				tst_resm(TFAIL | TTERRNO,
> > -					 "failed unexpectedly; "
> > -					 "expected %d: %s", TC[i].error,
> > -					 strerror(TC[i].error));
> > -			}
> > -		}
> > -	}
> > -	cleanup();
> > -
> > -	tst_exit();
> > -}
> > -
> > -/*
> > - * setup() - performs all ONE TIME setup for this test.
> > - */
> > -void setup(void)
> > +static void setup(void)
> >   {
> > -
> > -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> > -
> > -	TEST_PAUSE;
> > -
> > -	tst_tmpdir();
> > -
> >   	/* get some test specific values */
> >   	maxfd = getdtablesize();
> >   }
> >
> > -/*
> > - * cleanup() - performs all ONE TIME cleanup for this test at
> > - *	       completion or premature exit.
> > - */
> > -void cleanup(void)
> > +static void run(unsigned int i)
> >   {
> > -	tst_rmdir();
> > +	struct tcase *tc = tcases + i;
> > +
> > +	TST_EXP_FAIL2(dup2(*tc->ofd, *tc->nfd), EBADF,
> > +			"failed as expected - %s", strerror(EBADF));
> Since TST_EXP_FAIL2 macro will print errno number and string automaully.
> We don't need to print the duplicated info.
> your info:
> dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
> dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
> dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
> dup201.c:47: TPASS: failed as expected - Bad file descriptor : EBADF (9)
> 
> use    TST_EXP_FAIL2(dup2(*tc->ofd, *tc->nfd), EBADF,
>                         "dup2(%d, %d)", *tc->ofd, *tc->nfd); info as below:
> dup201.c:47: TPASS: dup2(-1, 5) : EBADF (9)
> dup201.c:47: TPASS: dup2(1024, 5) : EBADF (9)
> dup201.c:47: TPASS: dup2(0, -1) : EBADF (9)
> dup201.c:47: TPASS: dup2(0, 1024) : EBADF (9)
> 
> other than these nits, this patch looks good to me
> Reviewed-by: Yang Xu <xuyang2018.jy@fujitsu.com>
> 
> Best Regards
> Yang Xu

Hi Xu,

Thank you for the comments.
I will fix them and send a v3 patch.

Best,
QI

> 
> 
> >   }
> > +
> > +static struct tst_test test = {
> > +	.tcnt = ARRAY_SIZE(tcases),
> > +	.test = run,
> > +	.setup = setup,
> > +};

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [LTP] [PATCH v2 2/4] syscalls/dup2/dup202: Convert to new API and merge dup204 into dup202
@ 2021-09-16  7:13         ` xuyang2018.jy
  2021-09-16  7:49             ` xuyang2018.jy
  0 siblings, 1 reply; 11+ messages in thread
From: xuyang2018.jy @ 2021-09-16  7:13 UTC (permalink / raw)
  To: QI Fuli; +Cc: qi.fuli, ltp

Hi Qi
> From: QI Fuli<qi.fuli@fujitsu.com>
>
> Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
> ---
>   testcases/kernel/syscalls/dup2/dup202.c | 190 +++++++-----------------
>   testcases/kernel/syscalls/dup2/dup204.c | 128 ----------------
>   2 files changed, 52 insertions(+), 266 deletions(-)
>   delete mode 100644 testcases/kernel/syscalls/dup2/dup204.c
>
> diff --git a/testcases/kernel/syscalls/dup2/dup202.c b/testcases/kernel/syscalls/dup2/dup202.c
> index c87769fa9..fd8aeb84e 100644
> --- a/testcases/kernel/syscalls/dup2/dup202.c
> +++ b/testcases/kernel/syscalls/dup2/dup202.c
> @@ -1,167 +1,81 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
>   /*
> - *
> - *   Copyright (c) International Business Machines  Corp., 2001
> - *
> - *   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
> + * Copyright (c) International Business Machines  Corp., 2001
>    */
>
> -/*
> - * NAME
> - *	dup202.c
> - *
> - * DESCRIPTION
> - *	Is the access mode the same for both file descriptors?
> - *		0: read only ?	"0444"
> - *		1: write only ? "0222"
> - *		2: read/write ? "0666"
> - *
> - * ALGORITHM
> - *	Creat a file with each access mode; dup each file descriptor;
> - *	stat each file descriptor and compare modes of each pair
> - *
> - * USAGE:<for command-line>
> - *  dup202 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
> - *     where,  -c n : Run n copies concurrently.
> - *             -f   : Turn off functionality Testing.
> - *             -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.
> - *
> - * HISTORY
> - *	07/2001 Ported by Wayne Boyer
> +/*\
> + * [Description]
>    *
> - * RESTRICTIONS
> - *	None
Test whether the access mode and inode number are same for both file 
descriptors.
> + * Is the access mode the same for both file descriptors?
> + *	0: read only ?	"0444"
> + *	1: write only ? "0222"
> + *	2: read/write ? "0666"
>    */
>
> -#include<sys/types.h>
> -#include<sys/stat.h>
>   #include<errno.h>
> -#include<fcntl.h>
>   #include<stdio.h>
> -#include "test.h"
> -#include "safe_macros.h"
> +#include "tst_test.h"
> +#include "tst_safe_macros.h"
>
> -char *TCID = "dup202";
> -int TST_TOTAL = 3;
> -
> -void setup(void);
> -void cleanup(void);
> -
> -char testfile[40];
> -int fail;
> -int newfd;
> +static char testfile[40];
>
>   /* set these to a known index into our local file descriptor table */
> -int duprdo = 10, dupwro = 20, duprdwr = 30;
> +static int duprdo = 10, dupwro = 20, duprdwr = 30;
>
> -struct test_case_t {
> +static struct tcase {
>   	int *nfd;
>   	mode_t mode;
> -} TC[] = {
> -	/* The first test creat(es) a file with mode 0444 */
> -	{
> -	&duprdo, (S_IRUSR | S_IRGRP | S_IROTH)},
> -	    /* The second test creat(es) a file with mode 0222 */
> -	{
> -	&dupwro, (S_IWUSR | S_IWGRP | S_IWOTH)},
> -	    /* The third test creat(es) a file with mode 0666 */
> -	{
> -	&duprdwr,
> -		    (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH)}
> +} tcases[]= {
> +	{&duprdo, (S_IRUSR | S_IRGRP | S_IROTH)},
> +	{&dupwro, (S_IWUSR | S_IWGRP | S_IWOTH)},
> +	{&duprdwr, (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH)},
>   };
>
> -int main(int ac, char **av)
> +static void setup(void)
>   {
> -	int lc;
> -	int i, ofd;
> -	struct stat oldbuf, newbuf;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		/* loop through the test cases */
> -		for (i = 0; i<  TST_TOTAL; i++) {
> -
> -			if ((ofd = creat(testfile, TC[i].mode)) == -1)
> -				tst_brkm(TBROK | TERRNO, cleanup,
> -					 "creat failed");
> -
> -			TEST(dup2(ofd, *TC[i].nfd));
> -
> -			if (TEST_RETURN == -1) {
> -				tst_resm(TFAIL | TTERRNO,
> -					 "call failed unexpectedly");
> -				continue;
> -			}
> +	umask(0);
> +	sprintf(testfile, "dup202.%d", getpid());
> +}
>
> -			/* stat the original file */
> -			SAFE_FSTAT(cleanup, ofd,&oldbuf);
> +static void run(unsigned int i)
> +{
> +	int ofd;
> +	struct stat oldbuf, newbuf;
> +	struct tcase *tc = tcases + i;
>
> -			/* stat the duped file */
> -			SAFE_FSTAT(cleanup, *TC[i].nfd,&newbuf);
> +	ofd = SAFE_OPEN(testfile, O_CREAT, tc->mode);
>
> -			if (oldbuf.st_mode != newbuf.st_mode)
> -				tst_resm(TFAIL, "original and dup "
> -					 "modes do not match");
> -			else
> -				tst_resm(TPASS, "fstat shows new and "
> -					 "old modes are the same");
> +	TEST(dup2(ofd, *tc->nfd));
>
> -			/* remove the file so that we can use it again */
> -			if (close(*TC[i].nfd) == -1)
> -				perror("close failed");
> -			if (close(ofd) == -1)
> -				perror("close failed");
> -			if (unlink(testfile) == -1)
> -				perror("unlink failed");
> -		}
> +	if (TST_RET == -1) {
> +		tst_res(TFAIL | TTERRNO, "call failed unexpectedly");
> +		return;
>   	}
This case fails on my machine when using -i parameters
[root@localhost dup2]# ./dup202 -i 2
tst_test.c:1353: TINFO: Timeout per run is 0h 05m 00s
dup202.c:65: TPASS: original and duped modes are the same
dup202.c:70: TPASS: original and duped inodes are the same
dup202.c:65: TPASS: original and duped modes are the same
dup202.c:70: TPASS: original and duped inodes are the same
dup202.c:65: TPASS: original and duped modes are the same
dup202.c:70: TPASS: original and duped inodes are the same
dup202.c:52: TFAIL: call failed unexpectedly: EBADF (9)
dup202.c:52: TFAIL: call failed unexpectedly: EBADF (9)
dup202.c:52: TFAIL: call failed unexpectedly: EBADF (9)

It seems newfd has turned into -1 and see dup2 man-page it said
"  If newfd was open, any errors that would have been reported at 
close(2) time are lost.  If this is of concern, then―unless the program 
is single-threaded and does not allocate  file  descriptors  in  signal
        handlers―the correct approach is not to close newfd before 
calling dup2(), because of the race condition described above."

Maybe we should remove the close for newfd, but old api case  also 
close. I am not very clear for this.


Best Regards
Yang Xu
>
> -	cleanup();
> -	tst_exit();
> -}
> -
> -/*
> - * setup() - performs all ONE TIME setup for this test.
> - */
> -void setup(void)
> -{
> -
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> +	/* stat the original file */
> +	SAFE_FSTAT(ofd,&oldbuf);
>
> -	TEST_PAUSE;
> +	/* stat the duped file */
> +	SAFE_FSTAT(*tc->nfd,&newbuf);
>
> -	tst_tmpdir();
> +	if (oldbuf.st_mode != newbuf.st_mode)
> +		tst_res(TFAIL, "original and duped modes do not match");
> +	else
> +		tst_res(TPASS, "original and duped modes are the same");
>
> -	(void)umask(0);
> +	if (oldbuf.st_ino != newbuf.st_ino)
> +		tst_res(TFAIL, "original and duped inodes do not match");
> +	else
> +		tst_res(TPASS, "original and duped inodes are the same");
>
> -	sprintf(testfile, "dup202.%d", getpid());
> +	SAFE_CLOSE(*tc->nfd);
> +	SAFE_CLOSE(ofd);
>   }
>
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - *	       completion or premature exit.
> - */
> -void cleanup(void)
> -{
> -	tst_rmdir();
> -}
> +static struct tst_test test = {
> +	.needs_tmpdir = 1,
> +	.tcnt = ARRAY_SIZE(tcases),
> +	.test = run,
> +	.setup = setup,
> +};
> diff --git a/testcases/kernel/syscalls/dup2/dup204.c b/testcases/kernel/syscalls/dup2/dup204.c
> deleted file mode 100644
> index a357bc17e..000000000
> --- a/testcases/kernel/syscalls/dup2/dup204.c
> +++ /dev/null
> @@ -1,128 +0,0 @@
> -/*
> - *
> - *   Copyright (c) International Business Machines  Corp., 2001
> - *
> - *   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
> - */
> -
> -/*
> - * NAME
> - *	dup204.c
> - *
> - * DESCRIPTION
> - *	Testcase to check the basic functionality of dup2(2).
> - *
> - * ALGORITHM
> - *	attempt to call dup2() on read/write ends of a pipe
> - *
> - * USAGE:<for command-line>
> - *  dup204 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
> - *     where,  -c n : Run n copies concurrently.
> - *             -f   : Turn off functionality Testing.
> - *             -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.
> - *
> - * RESTRICTION
> - *	NONE
> - */
> -
> -#ifndef _GNU_SOURCE
> -#define _GNU_SOURCE
> -#endif
> -#include<sys/types.h>
> -#include<fcntl.h>
> -#include<sys/stat.h>
> -#include<errno.h>
> -#include<signal.h>
> -#include<string.h>
> -#include "test.h"
> -#include "safe_macros.h"
> -
> -void setup();
> -void cleanup();
> -
> -char *TCID = "dup204";
> -int TST_TOTAL = 2;
> -
> -int fd[2];
> -int nfd[2];
> -
> -int main(int ac, char **av)
> -{
> -	int lc;
> -	int i;
> -	struct stat oldbuf, newbuf;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		/* loop through the test cases */
> -		for (i = 0; i<  TST_TOTAL; i++) {
> -			TEST(dup2(fd[i], nfd[i]));
> -
> -			if (TEST_RETURN == -1) {
> -				tst_resm(TFAIL, "call failed unexpectedly");
> -				continue;
> -			}
> -
> -			SAFE_FSTAT(cleanup, fd[i],&oldbuf);
> -			SAFE_FSTAT(cleanup, nfd[i],&newbuf);
> -
> -			if (oldbuf.st_ino != newbuf.st_ino)
> -				tst_resm(TFAIL, "original and duped "
> -					 "inodes do not match");
> -			else
> -				tst_resm(TPASS, "original and duped "
> -					 "inodes are the same");
> -
> -			SAFE_CLOSE(cleanup, TEST_RETURN);
> -		}
> -	}
> -
> -	cleanup();
> -	tst_exit();
> -}
> -
> -void setup(void)
> -{
> -	fd[0] = -1;
> -
> -	tst_sig(FORK, DEF_HANDLER, cleanup);
> -
> -	TEST_PAUSE;
> -
> -	tst_tmpdir();
> -
> -	SAFE_PIPE(cleanup, fd);
> -}
> -
> -void cleanup(void)
> -{
> -	int i;
> -
> -	for (i = 0; i<  (int)ARRAY_SIZE(fd); i++) {
> -		close(fd[i]);
> -		close(nfd[i]);
> -	}
> -
> -	tst_rmdir();
> -}

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [LTP] [PATCH v2 2/4] syscalls/dup2/dup202: Convert to new API and merge dup204 into dup202
@ 2021-09-16  7:49             ` xuyang2018.jy
  0 siblings, 0 replies; 11+ messages in thread
From: xuyang2018.jy @ 2021-09-16  7:49 UTC (permalink / raw)
  To: QI Fuli; +Cc: qi.fuli, ltp

Hi Qi

Also, when I read dup2 man-page, I also find old an new fd also share
the offset as below:
   " After a successful return, the old and new file descriptors may be 
used interchangeably.  Since the two file descriptors refer to the same 
open file description, they  share  file  offset  and  file  status
        flags; for example, if the file offset is modified by using 
lseek(2) on one of the file descriptors, the offset is also changed for 
the other file descriptor."

We can add this check into here or adding a new case.

Best Regards
Yang Xu
> Hi Qi
>> From: QI Fuli<qi.fuli@fujitsu.com>
>>
>> Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
>> ---
>> testcases/kernel/syscalls/dup2/dup202.c | 190 +++++++-----------------
>> testcases/kernel/syscalls/dup2/dup204.c | 128 ----------------
>> 2 files changed, 52 insertions(+), 266 deletions(-)
>> delete mode 100644 testcases/kernel/syscalls/dup2/dup204.c
>>
>> diff --git a/testcases/kernel/syscalls/dup2/dup202.c
>> b/testcases/kernel/syscalls/dup2/dup202.c
>> index c87769fa9..fd8aeb84e 100644
>> --- a/testcases/kernel/syscalls/dup2/dup202.c
>> +++ b/testcases/kernel/syscalls/dup2/dup202.c
>> @@ -1,167 +1,81 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +
>> /*
>> - *
>> - * Copyright (c) International Business Machines Corp., 2001
>> - *
>> - * 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
>> + * Copyright (c) International Business Machines Corp., 2001
>> */
>>
>> -/*
>> - * NAME
>> - * dup202.c
>> - *
>> - * DESCRIPTION
>> - * Is the access mode the same for both file descriptors?
>> - * 0: read only ? "0444"
>> - * 1: write only ? "0222"
>> - * 2: read/write ? "0666"
>> - *
>> - * ALGORITHM
>> - * Creat a file with each access mode; dup each file descriptor;
>> - * stat each file descriptor and compare modes of each pair
>> - *
>> - * USAGE:<for command-line>
>> - * dup202 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
>> - * where, -c n : Run n copies concurrently.
>> - * -f : Turn off functionality Testing.
>> - * -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.
>> - *
>> - * HISTORY
>> - * 07/2001 Ported by Wayne Boyer
>> +/*\
>> + * [Description]
>> *
>> - * RESTRICTIONS
>> - * None
> Test whether the access mode and inode number are same for both file
> descriptors.
>> + * Is the access mode the same for both file descriptors?
>> + * 0: read only ? "0444"
>> + * 1: write only ? "0222"
>> + * 2: read/write ? "0666"
>> */
>>
>> -#include<sys/types.h>
>> -#include<sys/stat.h>
>> #include<errno.h>
>> -#include<fcntl.h>
>> #include<stdio.h>
>> -#include "test.h"
>> -#include "safe_macros.h"
>> +#include "tst_test.h"
>> +#include "tst_safe_macros.h"
>>
>> -char *TCID = "dup202";
>> -int TST_TOTAL = 3;
>> -
>> -void setup(void);
>> -void cleanup(void);
>> -
>> -char testfile[40];
>> -int fail;
>> -int newfd;
>> +static char testfile[40];
>>
>> /* set these to a known index into our local file descriptor table */
>> -int duprdo = 10, dupwro = 20, duprdwr = 30;
>> +static int duprdo = 10, dupwro = 20, duprdwr = 30;
>>
>> -struct test_case_t {
>> +static struct tcase {
>> int *nfd;
>> mode_t mode;
>> -} TC[] = {
>> - /* The first test creat(es) a file with mode 0444 */
>> - {
>> - &duprdo, (S_IRUSR | S_IRGRP | S_IROTH)},
>> - /* The second test creat(es) a file with mode 0222 */
>> - {
>> - &dupwro, (S_IWUSR | S_IWGRP | S_IWOTH)},
>> - /* The third test creat(es) a file with mode 0666 */
>> - {
>> - &duprdwr,
>> - (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH)}
>> +} tcases[]= {
>> + {&duprdo, (S_IRUSR | S_IRGRP | S_IROTH)},
>> + {&dupwro, (S_IWUSR | S_IWGRP | S_IWOTH)},
>> + {&duprdwr, (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP |
>> S_IWOTH)},
>> };
>>
>> -int main(int ac, char **av)
>> +static void setup(void)
>> {
>> - int lc;
>> - int i, ofd;
>> - struct stat oldbuf, newbuf;
>> -
>> - tst_parse_opts(ac, av, NULL, NULL);
>> -
>> - setup();
>> -
>> - for (lc = 0; TEST_LOOPING(lc); lc++) {
>> -
>> - tst_count = 0;
>> -
>> - /* loop through the test cases */
>> - for (i = 0; i< TST_TOTAL; i++) {
>> -
>> - if ((ofd = creat(testfile, TC[i].mode)) == -1)
>> - tst_brkm(TBROK | TERRNO, cleanup,
>> - "creat failed");
>> -
>> - TEST(dup2(ofd, *TC[i].nfd));
>> -
>> - if (TEST_RETURN == -1) {
>> - tst_resm(TFAIL | TTERRNO,
>> - "call failed unexpectedly");
>> - continue;
>> - }
>> + umask(0);
>> + sprintf(testfile, "dup202.%d", getpid());
>> +}
>>
>> - /* stat the original file */
>> - SAFE_FSTAT(cleanup, ofd,&oldbuf);
>> +static void run(unsigned int i)
>> +{
>> + int ofd;
>> + struct stat oldbuf, newbuf;
>> + struct tcase *tc = tcases + i;
>>
>> - /* stat the duped file */
>> - SAFE_FSTAT(cleanup, *TC[i].nfd,&newbuf);
>> + ofd = SAFE_OPEN(testfile, O_CREAT, tc->mode);
>>
>> - if (oldbuf.st_mode != newbuf.st_mode)
>> - tst_resm(TFAIL, "original and dup "
>> - "modes do not match");
>> - else
>> - tst_resm(TPASS, "fstat shows new and "
>> - "old modes are the same");
>> + TEST(dup2(ofd, *tc->nfd));
>>
>> - /* remove the file so that we can use it again */
>> - if (close(*TC[i].nfd) == -1)
>> - perror("close failed");
>> - if (close(ofd) == -1)
>> - perror("close failed");
>> - if (unlink(testfile) == -1)
>> - perror("unlink failed");
>> - }
>> + if (TST_RET == -1) {
>> + tst_res(TFAIL | TTERRNO, "call failed unexpectedly");
>> + return;
>> }
> This case fails on my machine when using -i parameters
> [root@localhost dup2]# ./dup202 -i 2
> tst_test.c:1353: TINFO: Timeout per run is 0h 05m 00s
> dup202.c:65: TPASS: original and duped modes are the same
> dup202.c:70: TPASS: original and duped inodes are the same
> dup202.c:65: TPASS: original and duped modes are the same
> dup202.c:70: TPASS: original and duped inodes are the same
> dup202.c:65: TPASS: original and duped modes are the same
> dup202.c:70: TPASS: original and duped inodes are the same
> dup202.c:52: TFAIL: call failed unexpectedly: EBADF (9)
> dup202.c:52: TFAIL: call failed unexpectedly: EBADF (9)
> dup202.c:52: TFAIL: call failed unexpectedly: EBADF (9)
>
> It seems newfd has turned into -1 and see dup2 man-page it said
> " If newfd was open, any errors that would have been reported at
> close(2) time are lost. If this is of concern, then―unless the program
> is single-threaded and does not allocate file descriptors in signal
> handlers―the correct approach is not to close newfd before calling
> dup2(), because of the race condition described above."
>
> Maybe we should remove the close for newfd, but old api case also close.
> I am not very clear for this.
>
>
> Best Regards
> Yang Xu
>>
>> - cleanup();
>> - tst_exit();
>> -}
>> -
>> -/*
>> - * setup() - performs all ONE TIME setup for this test.
>> - */
>> -void setup(void)
>> -{
>> -
>> - tst_sig(NOFORK, DEF_HANDLER, cleanup);
>> + /* stat the original file */
>> + SAFE_FSTAT(ofd,&oldbuf);
>>
>> - TEST_PAUSE;
>> + /* stat the duped file */
>> + SAFE_FSTAT(*tc->nfd,&newbuf);
>>
>> - tst_tmpdir();
>> + if (oldbuf.st_mode != newbuf.st_mode)
>> + tst_res(TFAIL, "original and duped modes do not match");
>> + else
>> + tst_res(TPASS, "original and duped modes are the same");
>>
>> - (void)umask(0);
>> + if (oldbuf.st_ino != newbuf.st_ino)
>> + tst_res(TFAIL, "original and duped inodes do not match");
>> + else
>> + tst_res(TPASS, "original and duped inodes are the same");
>>
>> - sprintf(testfile, "dup202.%d", getpid());
>> + SAFE_CLOSE(*tc->nfd);
>> + SAFE_CLOSE(ofd);
>> }
>>
>> -/*
>> - * cleanup() - performs all ONE TIME cleanup for this test at
>> - * completion or premature exit.
>> - */
>> -void cleanup(void)
>> -{
>> - tst_rmdir();
>> -}
>> +static struct tst_test test = {
>> + .needs_tmpdir = 1,
>> + .tcnt = ARRAY_SIZE(tcases),
>> + .test = run,
>> + .setup = setup,
>> +};
>> diff --git a/testcases/kernel/syscalls/dup2/dup204.c
>> b/testcases/kernel/syscalls/dup2/dup204.c
>> deleted file mode 100644
>> index a357bc17e..000000000
>> --- a/testcases/kernel/syscalls/dup2/dup204.c
>> +++ /dev/null
>> @@ -1,128 +0,0 @@
>> -/*
>> - *
>> - * Copyright (c) International Business Machines Corp., 2001
>> - *
>> - * 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
>> - */
>> -
>> -/*
>> - * NAME
>> - * dup204.c
>> - *
>> - * DESCRIPTION
>> - * Testcase to check the basic functionality of dup2(2).
>> - *
>> - * ALGORITHM
>> - * attempt to call dup2() on read/write ends of a pipe
>> - *
>> - * USAGE:<for command-line>
>> - * dup204 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
>> - * where, -c n : Run n copies concurrently.
>> - * -f : Turn off functionality Testing.
>> - * -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.
>> - *
>> - * RESTRICTION
>> - * NONE
>> - */
>> -
>> -#ifndef _GNU_SOURCE
>> -#define _GNU_SOURCE
>> -#endif
>> -#include<sys/types.h>
>> -#include<fcntl.h>
>> -#include<sys/stat.h>
>> -#include<errno.h>
>> -#include<signal.h>
>> -#include<string.h>
>> -#include "test.h"
>> -#include "safe_macros.h"
>> -
>> -void setup();
>> -void cleanup();
>> -
>> -char *TCID = "dup204";
>> -int TST_TOTAL = 2;
>> -
>> -int fd[2];
>> -int nfd[2];
>> -
>> -int main(int ac, char **av)
>> -{
>> - int lc;
>> - int i;
>> - struct stat oldbuf, newbuf;
>> -
>> - tst_parse_opts(ac, av, NULL, NULL);
>> -
>> - setup();
>> -
>> - for (lc = 0; TEST_LOOPING(lc); lc++) {
>> -
>> - tst_count = 0;
>> -
>> - /* loop through the test cases */
>> - for (i = 0; i< TST_TOTAL; i++) {
>> - TEST(dup2(fd[i], nfd[i]));
>> -
>> - if (TEST_RETURN == -1) {
>> - tst_resm(TFAIL, "call failed unexpectedly");
>> - continue;
>> - }
>> -
>> - SAFE_FSTAT(cleanup, fd[i],&oldbuf);
>> - SAFE_FSTAT(cleanup, nfd[i],&newbuf);
>> -
>> - if (oldbuf.st_ino != newbuf.st_ino)
>> - tst_resm(TFAIL, "original and duped "
>> - "inodes do not match");
>> - else
>> - tst_resm(TPASS, "original and duped "
>> - "inodes are the same");
>> -
>> - SAFE_CLOSE(cleanup, TEST_RETURN);
>> - }
>> - }
>> -
>> - cleanup();
>> - tst_exit();
>> -}
>> -
>> -void setup(void)
>> -{
>> - fd[0] = -1;
>> -
>> - tst_sig(FORK, DEF_HANDLER, cleanup);
>> -
>> - TEST_PAUSE;
>> -
>> - tst_tmpdir();
>> -
>> - SAFE_PIPE(cleanup, fd);
>> -}
>> -
>> -void cleanup(void)
>> -{
>> - int i;
>> -
>> - for (i = 0; i< (int)ARRAY_SIZE(fd); i++) {
>> - close(fd[i]);
>> - close(nfd[i]);
>> - }
>> -
>> - tst_rmdir();
>> -}

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [LTP] [PATCH v2 3/4] syscalls/dup2/dup203: Convert to new API
@ 2021-09-16  8:23         ` xuyang2018.jy
  0 siblings, 0 replies; 11+ messages in thread
From: xuyang2018.jy @ 2021-09-16  8:23 UTC (permalink / raw)
  To: QI Fuli; +Cc: qi.fuli, ltp

Hi Qi
> From: QI Fuli<qi.fuli@fujitsu.com>
>
> Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
> ---
>   testcases/kernel/syscalls/dup2/dup203.c | 282 +++++++++---------------
>   1 file changed, 101 insertions(+), 181 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/dup2/dup203.c b/testcases/kernel/syscalls/dup2/dup203.c
> index e6f281adf..a840f4638 100644
> --- a/testcases/kernel/syscalls/dup2/dup203.c
> +++ b/testcases/kernel/syscalls/dup2/dup203.c
> @@ -1,208 +1,128 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
>   /*
> - *
> - *   Copyright (c) International Business Machines  Corp., 2001
> - *
> - *   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
> + * Copyright (c) International Business Machines  Corp., 2001
>    */
>
> -/*
> - * NAME
> - *	dup203.c
> - *
> - * DESCRIPTION
> +/*\
> + * [Description]
>    *	Testcase to check the basic functionality of dup2().
> - *
> - * ALGORITHM
> - *	1.	Attempt to dup2() on an open file descriptor.
> - *	2.	Attempt to dup2() on a close file descriptor.
> - *
> - * USAGE:<for command-line>
> - *  dup203 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
> - *     where,  -c n : Run n copies concurrently.
> - *             -f   : Turn off functionality Testing.
> - *             -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.
> - *
> - * HISTORY
> - *	07/2001 Ported by Wayne Boyer
> - *
> - * RESTRICTIONS
> - *	NONE
> + *	1. Attempt to dup2() on an open file descriptor.
> + *	2. Attempt to dup2() on a close file descriptor.
>    */
>
> -#include<fcntl.h>
> -#include<sys/param.h>
>   #include<errno.h>
> -#include<string.h>
> -#include "test.h"
> -#include "safe_macros.h"
> +#include<stdio.h>
> +#include "tst_test.h"
> +#include "tst_safe_macros.h"
> +
> +static int fd0, fd1, fd2, rval;
rval is only used in verfiy_close, so it doesn't need to declare as static.
> +static char filename0[40], filename1[40];
> +static char buf[40];
> +
> +static void verify_open(void);
> +static void verify_close(void);
> +
> +static struct tcase {
> +	char *desc;
> +	void (*verify)();
> +} tcases [] = {
> +	{"Test duping over an open fd", verify_open},
> +	{"Test close on exec flag", verify_close},
> +};
> +
> +static void verify_open(void)
> +{
> +	sprintf(filename0, "dup203.file0.%d\n", getpid());
> +	sprintf(filename1, "dup203.file1.%d\n", getpid());
This can been moved into setup function instead of here, so we don't 
call it repeatly when using -i parameters.
> +	unlink(filename0);
> +	unlink(filename1);
> +
> +	fd0 = SAFE_CREAT(filename0, 0666);
> +	SAFE_WRITE(1, fd0, filename0, strlen(filename0));
> +	SAFE_CLOSE(fd0);
> +
> +	fd1 = SAFE_CREAT(filename1, 0666);
> +	SAFE_WRITE(1, fd1, filename1, strlen(filename1));
> +	SAFE_CLOSE(fd1);
> +
> +	fd0 = SAFE_OPEN(filename0, O_RDONLY);
> +	fd1 = SAFE_OPEN(filename1, O_RDONLY);
> +
> +	TEST(dup2(fd0, fd1));
> +
> +	if ((fd2 = TST_RET) == -1)
I prefer to use two lines to replace this
fd2 = TST_RET;
if (TST_RET == -1)
> +		tst_res(TFAIL, "call failed unexpectedly");
> +	else {
> +		if (fd1 != fd2) {
> +			tst_res(TFAIL, "file descriptors don't match");
> +			return;
> +		}
>
> -void setup(void);
> -void cleanup(void);
> +		memset(buf, 0, sizeof(buf));
> +		SAFE_READ(0, fd2, buf, sizeof(buf));
> +		if (strcmp(buf, filename0) != 0)
> +			tst_res(TFAIL, "read from file got bad data");
> +		tst_res(TPASS, "dup2 test 1 functionality is correct");
IMO, we don't use the big else branch.  I will list my code in last.
> +	}
>
> -char *TCID = "dup203";
> -int TST_TOTAL = 1;
> +	SAFE_CLOSE(fd0);
> +	SAFE_CLOSE(fd1);
> +	close(fd2);
In actually, fd2 close failed, I think we should remove newfd close.


diff with your patch:
--- a/testcases/kernel/syscalls/dup2/dup203.c
+++ b/testcases/kernel/syscalls/dup2/dup203.c
@@ -16,7 +16,7 @@
  #include "tst_test.h"
  #include "tst_safe_macros.h"

-static int fd0, fd1, fd2, rval;
+static int fd0, fd1, fd2;
  static char filename0[40], filename1[40];
  static char buf[40];

@@ -33,11 +33,6 @@ static struct tcase {

  static void verify_open(void)
  {
-       sprintf(filename0, "dup203.file0.%d\n", getpid());
-       sprintf(filename1, "dup203.file1.%d\n", getpid());
-       unlink(filename0);
-       unlink(filename1);
-
         fd0 = SAFE_CREAT(filename0, 0666);
         SAFE_WRITE(1, fd0, filename0, strlen(filename0));
         SAFE_CLOSE(fd0);
@@ -51,30 +46,33 @@ static void verify_open(void)

         TEST(dup2(fd0, fd1));

-       if ((fd2 = TST_RET) == -1)
+       fd2 = TST_RET;
+       if (TST_RET == -1) {
                 tst_res(TFAIL, "call failed unexpectedly");
-       else {
-               if (fd1 != fd2) {
-                       tst_res(TFAIL, "file descriptors don't match");
-                       return;
-               }
-
-               memset(buf, 0, sizeof(buf));
-               SAFE_READ(0, fd2, buf, sizeof(buf));
-               if (strcmp(buf, filename0) != 0)
-                       tst_res(TFAIL, "read from file got bad data");
-               tst_res(TPASS, "dup2 test 1 functionality is correct");
+               goto free;
+       }
+       if (fd1 != fd2) {
+               tst_res(TFAIL, "file descriptors don't match");
+               goto free;
         }

+       memset(buf, 0, sizeof(buf));
+       SAFE_READ(0, fd2, buf, sizeof(buf));
+       if (strcmp(buf, filename0) != 0)
+               tst_res(TFAIL, "read from file got bad data");
+       else
+               tst_res(TPASS, "dup2 test 1 functionality is correct");
+
+free:
         SAFE_CLOSE(fd0);
         SAFE_CLOSE(fd1);
-       close(fd2);
+       SAFE_UNLINK(filename0);
+       SAFE_UNLINK(filename1);
  }

  static void verify_close(void)
  {
-       sprintf(filename0, "dup203.%d\n", getpid());
-       unlink(filename0);
+       int rval, rc=0;

         fd0 = SAFE_CREAT(filename0, 0666);
         SAFE_FCNTL(fd0, F_SETFD, 1);
@@ -87,29 +85,36 @@ static void verify_close(void)

         TEST(dup2(fd0, fd2));

-       if ((fd1 = TST_RET) == -1)
+       fd1 = TST_RET;
+       if (TST_RET == -1) {
                 tst_res(TFAIL, "call failed unexpectedly");
-       else {
-               if (fd1 != fd2) {
-                       tst_res(TFAIL, "bad dup2 descriptor %d", fd1);
-                       return;
-               }
-               rval = SAFE_FCNTL(fd1, F_GETFD, 0);
-               if (rval != 0) {
-                       tst_res(TFAIL | TERRNO,
-                               "fcntl F_GETFD on fd1 failed; expected a "
-                               "return value of 0x0, got %#x", rval);
-                       return;
-               }
-               rval = SAFE_FCNTL(fd0, F_GETFD, 0);
-               if ((rval & O_ACCMODE) != O_WRONLY)
-                       tst_res(TFAIL, "fctnl F_GETFL bad rval on fd0 "
-                               "Expected %#x got %#x", O_WRONLY, rval);
-               tst_res(TPASS, "dup2 test 2 functionality is correct");
+               goto free;
+       }
+       if (fd1 != fd2) {
+               tst_res(TFAIL, "bad dup2 descriptor %d", fd1);
+               goto free;
         }
+       rval = SAFE_FCNTL(fd1, F_GETFD, 0);
+       if (rval != 0) {
+               tst_res(TFAIL, "fcntl F_GETFD on fd1 failed; expected a "
+                       "return value of 0x0, got %#x", rval);
+               rc++;
+       }
+
+       rval = SAFE_FCNTL(fd0, F_GETFD, 0);
+       if ((rval & O_ACCMODE) != O_WRONLY) {
+               tst_res(TFAIL, "fctnl F_GETFL bad rval on fd0 "
+                       "Expected %#x got %#x", O_WRONLY, rval);
+               rc++;
+       }
+       if (!rc)
+               tst_res(TPASS, "dup2 test 2 functionality is correct");

+free:
         SAFE_CLOSE(fd0);
         SAFE_CLOSE(fd1);
+       SAFE_UNLINK(filename0);
+       SAFE_UNLINK(filename1);
  }

  static void run(unsigned int i)
@@ -118,10 +123,19 @@ static void run(unsigned int i)

         tst_res(TINFO, tc->desc);
         tc->verify();
+}
+
+static void setup(void)
+{
+       int pid;

+       pid = getpid();
+       sprintf(filename0, "dup203.file0.%d\n", pid);
+       sprintf(filename1, "dup203.file1.%d\n", pid);
  }

  static struct tst_test test = {
+       .setup = setup,
         .tcnt = ARRAY_SIZE(tcases),
         .needs_tmpdir = 1,
         .test = run,


Best Regards
Yang Xu

> +}
>
> -int main(int ac, char **av)
> +static void verify_close(void)
>   {
> -	int fd0, fd1, fd2, rval;
> -	char filename0[40], filename1[40];
> -	char buf[40];
> -
> -	int lc;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -//block1:
> -		tst_resm(TINFO, "Enter block 1");
> -		tst_resm(TINFO, "Test duping over an open fd");
> -
> -		sprintf(filename0, "dup202.file0.%d\n", getpid());
> -		sprintf(filename1, "dup202.file1.%d\n", getpid());
> -		unlink(filename0);
> -		unlink(filename1);
> -
> -		if ((fd0 = creat(filename0, 0666)) == -1)
> -			tst_brkm(TBROK, cleanup, "cannot create first file");
> -		if (write(fd0, filename0, strlen(filename0)) == -1)
> -			tst_brkm(TBROK, cleanup, "filename0: write(2) failed");
> -
> -		if ((fd1 = creat(filename1, 0666)) == -1)
> -			tst_brkm(TBROK, cleanup, "Cannot create second file");
> -		if (write(fd1, filename1, strlen(filename1)) == -1)
> -			tst_brkm(TBROK, cleanup, "filename1: write(2) failed");
> -
> -		SAFE_CLOSE(cleanup, fd0);
> -		if ((fd0 = open(filename0, O_RDONLY)) == -1)
> -			tst_brkm(TBROK, cleanup, "open(2) on filename0 failed");
> -
> -		SAFE_CLOSE(cleanup, fd1);
> -		if ((fd1 = open(filename1, O_RDONLY)) == -1)
> -			tst_brkm(TBROK, cleanup, "open(2) on filename1 failed");
> -
> -		TEST(dup2(fd0, fd1));
> -
> -		if ((fd2 = TEST_RETURN) == -1) {
> -			tst_resm(TFAIL, "call failed unexpectedly");
> -		} else {
> -			if (fd1 != fd2) {
> -				tst_resm(TFAIL, "file descriptors don't match");
> -				break;
> -			}
> -
> -			memset(buf, 0, sizeof(buf));
> -			if (read(fd2, buf, sizeof(buf)) == -1)
> -				tst_brkm(TBROK, cleanup, "read(2) failed");
> -			if (strcmp(buf, filename0) != 0)
> -				tst_resm(TFAIL, "read from file got bad data");
> -			tst_resm(TPASS, "dup2 test 1 functionality is correct");
> -		}
> -
> -		close(fd0);
> -		close(fd1);
> -		close(fd2);
> -		unlink(filename0);
> -		unlink(filename1);
> +	sprintf(filename0, "dup203.%d\n", getpid());
> +	unlink(filename0);
>
> -		tst_resm(TINFO, "Exit block 1");
> +	fd0 = SAFE_CREAT(filename0, 0666);
> +	SAFE_FCNTL(fd0, F_SETFD, 1);
>
> -//block2:
> -		tst_resm(TINFO, "Enter block 2");
> -		tst_resm(TINFO, "Test close on exec flag");
> +	fd2 = SAFE_CREAT(filename1, 0666);
>
> -		sprintf(filename0, "dup02.%d\n", getpid());
> -		unlink(filename0);
> +	/* SAFE_CLOSE() sets the fd to -1 avoid it here */
> +	rval = fd2;
> +	SAFE_CLOSE(rval);
>
> -		if ((fd0 = creat(filename0, 0666)) == -1) {
> -			tst_brkm(TBROK, cleanup, "Cannot create first file");
> -		}
> -		if (fcntl(fd0, F_SETFD, 1) == -1) {
> -			tst_brkm(TBROK, cleanup, "setting close on exec flag "
> -				 "on fd0 failed");
> -		}
> +	TEST(dup2(fd0, fd2));
>
> -		if ((fd2 = creat(filename1, 0666)) == -1) {
> -			tst_brkm(TBROK, cleanup, "Cannot create second file");
> +	if ((fd1 = TST_RET) == -1)
> +		tst_res(TFAIL, "call failed unexpectedly");
> +	else {
> +		if (fd1 != fd2) {
> +			tst_res(TFAIL, "bad dup2 descriptor %d", fd1);
> +			return;
>   		}
> -
> -		/* SAFE_CLOSE() sets the fd to -1 avoid it here */
> -		rval = fd2;
> -		SAFE_CLOSE(cleanup, rval);
> -
> -		TEST(dup2(fd0, fd2));
> -
> -		if ((fd1 = TEST_RETURN) == -1) {
> -			tst_resm(TFAIL, "call failed unexpectedly");
> -		} else {
> -			if (fd1 != fd2) {
> -				tst_resm(TFAIL, "bad dup2 descriptor %d", fd1);
> -				break;
> -			}
> -
> -			if ((rval = fcntl(fd1, F_GETFD, 0)) != 0) {
> -				tst_resm(TBROK | TERRNO,
> -					 "fcntl F_GETFD on fd1 failed; expected a "
> -					 "return value of 0x0, got %#x", rval);
> -				break;
> -			}
> -			if ((rval = (fcntl(fd0, F_GETFL, 0)&  O_ACCMODE)) !=
> -			    O_WRONLY) {
> -				tst_resm(TFAIL, "fctnl F_GETFL bad rval on fd0 "
> -					 "Expected %#x got %#x", O_WRONLY,
> -					 rval);
> -			}
> -			tst_resm(TPASS, "dup2 test 2 functionality is correct");
> +		rval = SAFE_FCNTL(fd1, F_GETFD, 0);
> +		if (rval != 0) {
> +			tst_res(TFAIL | TERRNO,
> +				"fcntl F_GETFD on fd1 failed; expected a "
> +				"return value of 0x0, got %#x", rval);
> +			return;
>   		}
> -
> -		close(fd0);
> -		close(fd1);
> -
> -		unlink(filename0);
> -		unlink(filename1);
> -		tst_resm(TINFO, "Exit block 2");
> +		rval = SAFE_FCNTL(fd0, F_GETFD, 0);
> +		if ((rval&  O_ACCMODE) != O_WRONLY)
> +			tst_res(TFAIL, "fctnl F_GETFL bad rval on fd0 "
> +				"Expected %#x got %#x", O_WRONLY, rval);
> +		tst_res(TPASS, "dup2 test 2 functionality is correct");
>   	}
>
> -	cleanup();
> -	tst_exit();
> +	SAFE_CLOSE(fd0);
> +	SAFE_CLOSE(fd1);
>   }
>
> -/*
> - * setup() - performs all ONE TIME setup for this test.
> - */
> -void setup(void)
> +static void run(unsigned int i)
>   {
> +	struct tcase *tc = tcases + i;
>
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> +	tst_res(TINFO, tc->desc);
> +	tc->verify();
>
> -	TEST_PAUSE;
> -
> -	tst_tmpdir();
>   }
>
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - *	       completion or premature exit.
> - */
> -void cleanup(void)
> -{
> -	tst_rmdir();
> -}
> +static struct tst_test test = {
> +	.tcnt = ARRAY_SIZE(tcases),
> +	.needs_tmpdir = 1,
> +	.test = run,
> +};

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [LTP] [PATCH v2 4/4] syscalls/dup2/dup205: Convert to new API
@ 2021-09-16  8:42         ` xuyang2018.jy
  0 siblings, 0 replies; 11+ messages in thread
From: xuyang2018.jy @ 2021-09-16  8:42 UTC (permalink / raw)
  To: QI Fuli; +Cc: qi.fuli, ltp

Hi Qi
> From: QI Fuli<qi.fuli@fujitsu.com>
>
> Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
> ---
>   testcases/kernel/syscalls/dup2/dup205.c | 167 ++++++++----------------
>   1 file changed, 57 insertions(+), 110 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/dup2/dup205.c b/testcases/kernel/syscalls/dup2/dup205.c
> index 0b324531f..1f4796659 100644
> --- a/testcases/kernel/syscalls/dup2/dup205.c
> +++ b/testcases/kernel/syscalls/dup2/dup205.c
> @@ -1,134 +1,81 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
>   /*
> + * Copyright (c) International Business Machines  Corp., 2002
>    *
> - *   Copyright (c) International Business Machines  Corp., 2002
> - *
> - *   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.
> + */
> +
> +/*\
> + * [Description]
>    *
> - *   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.
> + * Negative test for dup2() with max open file descriptors.
>    *
> - *   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
>    */
>
>   /* Ported from SPIE, section2/iosuite/dup6.c, by Airong Zhang */
>
> -/*======================================================================
> -	=================== TESTPLAN SEGMENT ===================
> ->KEYS:<  dup2()
> ->WHAT:<  Does dup return -1 on the 21st file?
> ->HOW:<  Create up to _NFILE files and check for -1 return on the
> -	<  next attempt
> -	<  Should check NOFILE as well as _NFILE.  19-Jun-84 Dale.
> ->BUGS:<
> -======================================================================*/
> -
> -#include<sys/param.h>
> -#include<sys/types.h>
> -#include<sys/stat.h>
> -#include<errno.h>
> -#include<fcntl.h>
> +#include<stdlib.h>
>   #include<stdio.h>
>   #include<unistd.h>
> -#include "test.h"
> -
> -char *TCID = "dup205";
> -int TST_TOTAL = 1;
> -int *fildes;
> -int min;
> -int local_flag;
> -
> -#define PASSED 1
> -#define FAILED 0
> -
> -static void setup(void);
> -static void cleanup(void);
> -
> -int main(int ac, char *av[])
> -{
> -	int ifile;
> -	char pfilname[40];
> -	int serrno;
> -
> -	int lc;
> -
> -	ifile = -1;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> +#include "tst_test.h"
> +#include "tst_safe_macros.h"
>
> -	local_flag = PASSED;
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		sprintf(pfilname, "./dup205.%d\n", getpid());
> -		unlink(pfilname);
> -		serrno = 0;
> -		if ((fildes[0] = creat(pfilname, 0666)) == -1)
> -			tst_brkm(TBROK | TERRNO, cleanup, "creat failed");
> -		else {
> -			fildes[fildes[0]] = fildes[0];
> -			for (ifile = fildes[0] + 1; ifile<  min + 10; ifile++) {
> -				if ((fildes[ifile] = dup2(fildes[ifile - 1],
> -							  ifile)) == -1) {
> -					serrno = errno;
> -					break;
> -				} else {
> -					if (fildes[ifile] != ifile) {
> -						tst_brkm(TFAIL, cleanup,
> -							 "got wrong descriptor "
> -							 "number back (%d != %d)",
> -							 fildes[ifile], ifile);
> -					}
> -				}
> -			}	/* end for */
> -			if (ifile<  min) {
> -				tst_resm(TFAIL, "Not enough files duped");
> -				local_flag = FAILED;
> -			} else if (ifile>  min) {
> -				tst_resm(TFAIL, "Too many files duped");
> -				local_flag = FAILED;
> -			}
> -			if (serrno != EBADF&&  serrno != EMFILE&&
> -			    serrno != EINVAL) {
> -				tst_resm(TFAIL, "bad errno on dup2 failure");
> -				local_flag = FAILED;
> -			}
> -		}
> -		unlink(pfilname);
> -		for (ifile = fildes[0]; ifile<  min + 10; ifile++)
> -			close(fildes[ifile]);
> -		if (local_flag == PASSED) {
> -			tst_resm(TPASS, "Test passed.");
> -		} else {
> -			tst_resm(TFAIL, "Test failed.");
> -		}
> -
> -	}
> -	cleanup();
> -	tst_exit();
> -}
> +static int *fildes;
> +static int min;
>
>   static void setup(void)
>   {
> -	tst_tmpdir();
> -
>   	min = getdtablesize();	/* get number of files allowed open */
>   	fildes = malloc((min + 10) * sizeof(int));
>   	if (fildes == NULL)
> -		tst_brkm(TBROK | TERRNO, cleanup, "malloc error");
> +		tst_brk(TBROK | TERRNO, "malloc error");
We have SAFE_MALLOC marco.
>   }
>
>   static void cleanup(void)
>   {
>   	if (fildes != NULL)
>   		free(fildes);
> -	tst_rmdir();
>   }
> +
> +static void run(void)
> +{
> +	int ifile;
> +	char pfilname[40];
> +
> +	ifile = -1;
> +
> +	sprintf(pfilname, "./dup205.%d\n", getpid());
we can move it into setup function.

Best Regards
Yang Xu
> +	unlink(pfilname);
> +
> +	fildes[0] = SAFE_CREAT(pfilname, 0666);
> +	fildes[fildes[0]] = fildes[0];
> +	for (ifile = fildes[0] + 1; ifile<  min + 10; ifile++) {
> +		TEST(dup2(fildes[ifile - 1], ifile));
> +		if ((fildes[ifile] = TST_RET) == -1)
> +			break;
> +		if (fildes[ifile] != ifile)
> +			tst_brk(TFAIL, "got wrong descriptor number back "
> +				"(%d != %d)", fildes[ifile], ifile);
> +	}	/* end for */
> +
> +	if (TST_ERR != EBADF)
> +		tst_res(TFAIL, "bad errno on dup2 failure");
> +
> +	if (ifile<  min)
> +		tst_res(TFAIL, "Not enough files duped");
> +	else if (ifile>  min)
> +		tst_res(TFAIL, "Too many files duped");
> +	else
> +		tst_res(TPASS, "Test passed.");
> +
> +	unlink(pfilname);
> +	for (ifile = fildes[0]; ifile<  min + 10; ifile++)
> +		close(fildes[ifile]);
> +}
> +
> +static struct tst_test test = {
> +	.needs_tmpdir = 1,
> +	.test_all = run,
> +	.setup = setup,
> +	.cleanup = cleanup,
> +};

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-09-16  8:42 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-15 15:51 [LTP] [PATCH v2 0/4] Convert syscalls/dup2/dup2{01...05} to new API QI Fuli
2021-09-15 15:51 ` QI Fuli
2021-09-15 15:51   ` [LTP] [PATCH v2 1/4] syscalls/dup2/dup201: Convert " QI Fuli
2021-09-15 15:51     ` QI Fuli
2021-09-16  6:30       ` xuyang2018.jy
2021-09-16  6:30         ` xuyang2018.jy
2021-09-16  7:10           ` qi.fuli
2021-09-16  7:10             ` qi.fuli
2021-09-15 15:51   ` [LTP] [PATCH v2 2/4] syscalls/dup2/dup202: Convert to new API and merge dup204 into dup202 QI Fuli
2021-09-15 15:51     ` QI Fuli
2021-09-16  7:13       ` xuyang2018.jy
2021-09-16  7:13         ` xuyang2018.jy
2021-09-16  7:49           ` xuyang2018.jy
2021-09-16  7:49             ` xuyang2018.jy
2021-09-15 15:51   ` [LTP] [PATCH v2 3/4] syscalls/dup2/dup203: Convert to new API QI Fuli
2021-09-15 15:51     ` QI Fuli
2021-09-16  8:23       ` xuyang2018.jy
2021-09-16  8:23         ` xuyang2018.jy
2021-09-15 15:51   ` [LTP] [PATCH v2 4/4] syscalls/dup2/dup205: " QI Fuli
2021-09-15 15:51     ` QI Fuli
2021-09-16  8:42       ` xuyang2018.jy
2021-09-16  8:42         ` xuyang2018.jy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.