All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API
@ 2019-04-03  8:29 Yang Xu
  2019-04-03  8:29 ` [LTP] [PATCH 2/2] syscalls/stat03, 06: " Yang Xu
  2019-04-04 12:58 ` [LTP] [PATCH " Cyril Hrubis
  0 siblings, 2 replies; 8+ messages in thread
From: Yang Xu @ 2019-04-03  8:29 UTC (permalink / raw)
  To: ltp

1) Take use of some safe macros
2) Remove duplicate tests stat01,stat05

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 runtest/quickhit                          |   2 -
 runtest/syscalls                          |   4 -
 testcases/kernel/syscalls/stat/.gitignore |   4 -
 testcases/kernel/syscalls/stat/stat01.c   | 152 -------------
 testcases/kernel/syscalls/stat/stat02.c   | 252 ++++++----------------
 testcases/kernel/syscalls/stat/stat05.c   | 194 -----------------
 6 files changed, 65 insertions(+), 543 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/stat/stat01.c
 delete mode 100644 testcases/kernel/syscalls/stat/stat05.c

diff --git a/runtest/quickhit b/runtest/quickhit
index 74482fd46..31c571eaa 100644
--- a/runtest/quickhit
+++ b/runtest/quickhit
@@ -223,8 +223,6 @@ signal03 signal03
 # and signal sending.
 sigrelse01 sigrelse01
 # Releasing held signals
-stat05 stat05
-# Basic test for stat(2)
 stat06 stat06
 # Negative tests for stat(2)
 statfs01 statfs01
diff --git a/runtest/syscalls b/runtest/syscalls
index cf8189ebd..22fb2462c 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1317,16 +1317,12 @@ tee02 tee02
 
 ssetmask01 ssetmask01
 
-stat01 stat01
-stat01_64 stat01_64
 stat02 stat02
 stat02_64 stat02_64
 stat03 stat03
 stat03_64 stat03_64
 stat04 symlink01 -T stat04
 stat04_64 symlink01 -T stat04_64
-stat05 stat05
-stat05_64 stat05_64
 stat06 stat06
 stat06_64 stat06_64
 
diff --git a/testcases/kernel/syscalls/stat/.gitignore b/testcases/kernel/syscalls/stat/.gitignore
index cb3df91fd..c0bd39d7b 100644
--- a/testcases/kernel/syscalls/stat/.gitignore
+++ b/testcases/kernel/syscalls/stat/.gitignore
@@ -1,10 +1,6 @@
-/stat01
-/stat01_64
 /stat02
 /stat02_64
 /stat03
 /stat03_64
-/stat05
-/stat05_64
 /stat06
 /stat06_64
diff --git a/testcases/kernel/syscalls/stat/stat01.c b/testcases/kernel/syscalls/stat/stat01.c
deleted file mode 100644
index e041311f5..000000000
--- a/testcases/kernel/syscalls/stat/stat01.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) International Business Machines  Corp., 2001
- *  07/2001 John George
- *
- * 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
- */
-/*
- *  Verify that, stat(2) succeeds to get the status of a file and fills the
- *  stat structure elements.
- */
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include <pwd.h>
-
-#include "test.h"
-#include "safe_macros.h"
-
-#define FILE_MODE	0644
-#define TESTFILE	"testfile"
-#define FILE_SIZE       1024
-#define BUF_SIZE	256
-#define MASK		0777
-
-char *TCID = "stat01";
-int TST_TOTAL = 1;
-
-static uid_t user_id;
-static gid_t group_id;
-
-static void setup(void);
-static void cleanup(void);
-
-static void verify(void)
-{
-	struct stat stat_buf;
-	int fail = 0;
-
-	TEST(stat(TESTFILE, &stat_buf));
-
-	if (TEST_RETURN == -1) {
-		tst_resm(TFAIL | TTERRNO, "fstat(%s) failed", TESTFILE);
-		return;
-	}
-
-	if (stat_buf.st_uid != user_id) {
-		tst_resm(TINFO, "stat_buf.st_uid = %i expected %i",
-		         stat_buf.st_uid, user_id);
-		fail++;
-	}
-
-	if (stat_buf.st_gid != group_id) {
-		tst_resm(TINFO, "stat_buf.st_gid = %i expected %i",
-		         stat_buf.st_gid, group_id);
-		fail++;
-	}
-
-	if (stat_buf.st_size != FILE_SIZE) {
-		tst_resm(TINFO, "stat_buf.st_size = %li expected %i",
-		         (long)stat_buf.st_size, FILE_SIZE);
-		fail++;
-	}
-
-        if ((stat_buf.st_mode & MASK) != FILE_MODE) {
-		tst_resm(TINFO, "stat_buf.st_mode = %o expected %o",
-		         (stat_buf.st_mode & MASK), FILE_MODE);
-		fail++;
-	}
-
-	if (fail) {
-		tst_resm(TFAIL, "functionality of fstat incorrect");
-		return;
-	}
-
-	tst_resm(TPASS, "functionality of fstat correct");
-}
-
-int main(int ac, char **av)
-{
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++)
-		verify();
-
-	cleanup();
-	tst_exit();
-}
-
-static void setup(void)
-{
-	struct passwd *ltpuser;
-	char tst_buff[BUF_SIZE];
-	int wbytes;
-	int write_len = 0;
-	int fd;
-
-	tst_require_root();
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	ltpuser = SAFE_GETPWNAM(NULL, "nobody");
-	SAFE_SETUID(NULL, ltpuser->pw_uid);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	umask(022);
-
-	fd = SAFE_OPEN(tst_rmdir, TESTFILE, O_WRONLY | O_CREAT, FILE_MODE);
-
-	/* Fill the test buffer with the known data */
-	memset(tst_buff, 'a', BUF_SIZE - 1);
-
-	/* Write to the file 1k data from the buffer */
-	while (write_len < FILE_SIZE) {
-		if ((wbytes = write(fd, tst_buff, sizeof(tst_buff))) <= 0)
-			tst_brkm(TBROK | TERRNO, cleanup, "write failed");
-		else
-			write_len += wbytes;
-	}
-
-	SAFE_CLOSE(tst_rmdir, fd);
-
-	user_id = getuid();
-	group_id = getgid();
-}
-
-static void cleanup(void)
-{
-	tst_rmdir();
-}
diff --git a/testcases/kernel/syscalls/stat/stat02.c b/testcases/kernel/syscalls/stat/stat02.c
index aeaa7ab82..4e0ab5a03 100644
--- a/testcases/kernel/syscalls/stat/stat02.c
+++ b/testcases/kernel/syscalls/stat/stat02.c
@@ -1,228 +1,106 @@
-/*
- *
- *   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
- */
-
-/*
- * Test Name: stat02
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* Copyright (c) International Business Machines  Corp., 2001
+ *	07/2001 John George
+ *		-Ported
  *
- * Test Description:
  *  Verify that, stat(2) succeeds to get the status of a file and fills the
  *  stat structure elements though process doesn't have read access to the
  *  file.
- *
- * Expected Result:
- *  stat() should return value 0 on success and the stat structure elements
- *  should be filled with specified 'file' information.
- *
- * Algorithm:
- *  Setup:
- *   Setup signal handling.
- *   Create temporary directory.
- *   Pause for SIGUSR1 if option specified.
- *
- *  Test:
- *   Loop if the proper options are given.
- *   Execute system call
- *   Check return code, if system call failed (return=-1)
- *   	Log the errno and Issue a FAIL message.
- *   Otherwise,
- *   	Verify the Functionality of system call
- *      if successful,
- *      	Issue Functionality-Pass message.
- *      Otherwise,
- *		Issue Functionality-Fail message.
- *  Cleanup:
- *   Print errno log and/or timing stats if options given
- *   Delete the temporary directory created.
- *
- * Usage:  <for command-line>
- *  stat02 [-c n] [-e] [-f] [-i n] [-I x] [-p x] [-t]
- *	where,  -c n : Run n copies concurrently.
- *		-e   : Turn on errno logging.
- *		-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 John George
- *		-Ported
- *
- * Restrictions:
- *
  */
-#include <stdio.h>
+
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <errno.h>
-#include <string.h>
-#include <signal.h>
 #include <pwd.h>
+#include "tst_test.h"
 
-#include "test.h"
-#include "safe_macros.h"
-
-#define FILE_MODE	S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
-#define TESTFILE	"testfile"
+#define FILE_MODE       0644
+#define TESTFILE        "testfile"
 #define FILE_SIZE       1024
-#define BUF_SIZE	256
-#define NEW_MODE	0222
-#define MASK		0777
-
-char *TCID = "stat02";
-int TST_TOTAL = 1;
+#define BUF_SIZE        256
+#define NEW_MODE        0222
+#define MASK            0777
 
-uid_t user_id;			/* eff. user id/group id of test process */
+uid_t user_id;
 gid_t group_id;
-char nobody_uid[] = "nobody";
 struct passwd *ltpuser;
 
-void setup();
-void cleanup();
-
-int main(int ac, char **av)
+static void verify_stat(void)
 {
-	struct stat stat_buf;	/* stat structure buffer */
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/*
-		 * Call stat(2) to get the status of
-		 * specified 'file' into stat structure.
-		 */
-		TEST(stat(TESTFILE, &stat_buf));
-
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL,
-				 "stat(%s, &stat_buf) Failed, errno=%d : %s",
-				 TESTFILE, TEST_ERRNO, strerror(TEST_ERRNO));
-		} else {
-			stat_buf.st_mode &= ~S_IFREG;
-			/*
-			 * Verify the data returned by stat(2)
-			 * aganist the expected data.
-			 */
-			if ((stat_buf.st_uid != user_id) ||
-			    (stat_buf.st_gid != group_id) ||
-			    (stat_buf.st_size != FILE_SIZE) ||
-			    ((stat_buf.st_mode & MASK) != NEW_MODE)) {
-				tst_resm(TFAIL, "Functionality of "
-					 "stat(2) on '%s' Failed",
-					 TESTFILE);
-			} else {
-				tst_resm(TPASS, "Functionality of "
-					 "stat(2) on '%s' Succcessful",
-					 TESTFILE);
-			}
-		}
-		tst_count++;	/* incr TEST_LOOP counter */
+	struct stat stat_buf;
+	int fail = 0;
+
+	TEST(stat(TESTFILE, &stat_buf));
+
+	if (TST_RET == -1) {
+		tst_res(TFAIL | TTERRNO, "fstat(%s) failed", TESTFILE);
+		return;
 	}
 
-	cleanup();
-	tst_exit();
-}
+	if (stat_buf.st_uid != user_id) {
+		tst_res(TINFO, "stat_buf.st_uid = %i expected %i",
+			stat_buf.st_uid, user_id);
+		fail++;
+	}
 
-/*
- * void
- * setup() -  Performs setup function for the test.
- *  Creat a temporary directory and change directory to it.
- *  Creat a testfile and write some data into it.
- *  Modify the mode permissions of testfile such that test process
- *  has read-only access to testfile.
- */
-void setup(void)
-{
-	int i, fd;		/* counter, file handle for file */
-	char tst_buff[BUF_SIZE];	/* data buffer for file */
-	int wbytes;		/* no. of bytes written to file */
-	int write_len = 0;
+	if (stat_buf.st_gid != group_id) {
+		tst_res(TINFO, "stat_buf.st_gid = %i expected %i",
+			stat_buf.st_gid, group_id);
+		fail++;
+	}
 
-	tst_require_root();
+	if (stat_buf.st_size != FILE_SIZE) {
+		tst_res(TINFO, "stat_buf.st_size = %li expected %i",
+			(long)stat_buf.st_size, FILE_SIZE);
+		fail++;
+	}
 
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
+	if ((stat_buf.st_mode & MASK) != NEW_MODE) {
+		tst_res(TINFO, "stat_buf.st_mode = %o expected %o",
+			(stat_buf.st_mode & MASK), NEW_MODE);
+		fail++;
+	}
 
-	/* Switch to nobody user for correct error code collection */
-	ltpuser = getpwnam(nobody_uid);
-	if (setuid(ltpuser->pw_uid) == -1) {
-		tst_resm(TINFO, "setuid failed to "
-			 "to set the effective uid to %d", ltpuser->pw_uid);
-		perror("setuid");
+	if (fail) {
+		tst_res(TFAIL, "functionality of stat incorrect");
+		return;
 	}
 
-	/* Pause if that option was specified
-	 * TEST_PAUSE contains the code to fork the test with the -i option.
-	 * You want to make sure you do this before you create your temporary
-	 * directory.
-	 */
-	TEST_PAUSE;
+	tst_res(TPASS, "functionality of stat correct");
+}
+
+void setup(void)
+{
+	int i, fd;
+	char tst_buff[BUF_SIZE];
+	int write_len = 0;
 
-	tst_tmpdir();
+	ltpuser = SAFE_GETPWNAM("nobody");
+	SAFE_SETUID(ltpuser->pw_uid);
 
-	if ((fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(%s, O_RDWR|O_CREAT, %#o) Failed, errno=%d : %s",
-			 TESTFILE, FILE_MODE, errno, strerror(errno));
-	}
+	fd = SAFE_OPEN(TESTFILE, O_WRONLY | O_CREAT, FILE_MODE);
 
-	/* Fill the test buffer with the known data */
 	for (i = 0; i < BUF_SIZE; i++) {
 		tst_buff[i] = 'a';
 	}
 
 	/* Write to the file 1k data from the buffer */
 	while (write_len < FILE_SIZE) {
-		if ((wbytes = write(fd, tst_buff, sizeof(tst_buff))) <= 0) {
-			tst_brkm(TBROK | TERRNO, cleanup, "write to %s failed",
-				 TESTFILE);
-		} else {
-			write_len += wbytes;
-		}
-	}
-
-	if (close(fd) == -1) {
-		tst_resm(TWARN | TERRNO, "closing %s failed", TESTFILE);
+		SAFE_WRITE(1, fd, tst_buff, sizeof(tst_buff));
+		write_len += BUF_SIZE;
 	}
 
-	/* Modify mode permissions on the testfile */
-	SAFE_CHMOD(cleanup, TESTFILE, NEW_MODE);
+	SAFE_CLOSE(fd);
 
-	/* Get the uid/gid of the process */
+	SAFE_CHMOD(TESTFILE, NEW_MODE);
 	user_id = getuid();
 	group_id = getgid();
-
 }
 
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at
- *	       completion or premature exit.
- *  Remove the temporary directory and file created.
- */
-void cleanup(void)
-{
-
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.setup = setup,
+	.test_all = verify_stat,
+	.needs_root = 1,
+	.needs_tmpdir = 1,
+};
diff --git a/testcases/kernel/syscalls/stat/stat05.c b/testcases/kernel/syscalls/stat/stat05.c
deleted file mode 100644
index 300649ade..000000000
--- a/testcases/kernel/syscalls/stat/stat05.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.  Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: stat05.c,v 1.6 2009/11/02 13:57:19 subrata_modak Exp $ */
-/**********************************************************
- *
- *    OS Test - Silicon Graphics, Inc.
- *
- *    TEST IDENTIFIER	: stat05
- *
- *    EXECUTED BY	: anyone
- *
- *    TEST TITLE	: Basic test for stat(2)
- *
- *    PARENT DOCUMENT	: usctpl01
- *
- *    TEST CASE TOTAL	: 1
- *
- *    WALL CLOCK TIME	: 1
- *
- *    CPU TYPES		: ALL
- *
- *    AUTHOR		: William Roske
- *
- *    CO-PILOT		: Dave Fenner
- *
- *    DATE STARTED	: 03/30/92
- *
- *    INITIAL RELEASE	: UNICOS 7.0
- *
- *    TEST CASES
- *
- * 	1.) stat(2) returns...(See Description)
- *
- *    INPUT SPECIFICATIONS
- * 	The standard options for system call tests are accepted.
- *	(See the parse_opts(3) man page).
- *
- *    OUTPUT SPECIFICATIONS
- *$
- *    DURATION
- * 	Terminates - with frequency and infinite modes.
- *
- *    SIGNALS
- * 	Uses SIGUSR1 to pause before test if option set.
- * 	(See the parse_opts(3) man page).
- *
- *    RESOURCES
- * 	None
- *
- *    ENVIRONMENTAL NEEDS
- *      No run-time environmental needs.
- *
- *    SPECIAL PROCEDURAL REQUIREMENTS
- * 	None
- *
- *    INTERCASE DEPENDENCIES
- * 	None
- *
- *    DETAILED DESCRIPTION
- *	This is a Phase I test for the stat(2) system call.  It is intended
- *	to provide a limited exposure of the system call, for now.  It
- *	should/will be extended when full functional tests are written for
- *	stat(2).
- *
- * 	Setup:
- * 	  Setup signal handling.
- *	  Pause for SIGUSR1 if option specified.
- *
- * 	Test:
- *	 Loop if the proper options are given.
- * 	  Execute system call
- *	  Check return code, if system call failed (return=-1)
- *		Log the errno and Issue a FAIL message.
- *	  Otherwise, Issue a PASS message.
- *
- * 	Cleanup:
- * 	  Print errno log and/or timing stats if options given
- *
- *
- *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include "test.h"
-
-void setup();
-void cleanup();
-
-char *TCID = "stat05";
-int TST_TOTAL = 1;
-
-char fname[255];
-int fd;
-struct stat statter;
-
-int main(int ac, char **av)
-{
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/*
-		 * Call stat(2) with F_CLRALF argument on fname
-		 */
-		TEST(stat(fname, &statter));
-
-		/* check return code */
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL, "stat(%s, &statter) failed", fname);
-		} else {
-			tst_resm(TPASS,
-				 "stat(%s, &statter) returned %ld",
-				 fname, TEST_RETURN);
-		}
-
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-/***************************************************************
- * setup() - performs all ONE TIME setup for this test.
- ***************************************************************/
-void setup(void)
-{
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	sprintf(fname, "tfile_%d", getpid());
-	if ((fd = open(fname, O_RDWR | O_CREAT, 0700)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(%s, O_RDWR|O_CREAT,0700) Failed, errno=%d : %s",
-			 fname, errno, strerror(errno));
-	}
-
-	if (close(fd) == -1) {
-		tst_resm(TWARN | TERRNO, "close(%s) failed", fname);
-	}
-}
-
-/***************************************************************
- * cleanup() - performs all ONE TIME cleanup for this test at
- *		completion or premature exit.
- ***************************************************************/
-void cleanup(void)
-{
-
-	tst_rmdir();
-}
-- 
2.18.1




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

* [LTP] [PATCH 2/2] syscalls/stat03, 06: Cleanup && Convert to new API
  2019-04-03  8:29 [LTP] [PATCH 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API Yang Xu
@ 2019-04-03  8:29 ` Yang Xu
  2019-04-04 13:19   ` Cyril Hrubis
  2019-04-04 12:58 ` [LTP] [PATCH " Cyril Hrubis
  1 sibling, 1 reply; 8+ messages in thread
From: Yang Xu @ 2019-04-03  8:29 UTC (permalink / raw)
  To: ltp

1) Take use of some safe macros
2) Remove duplicate tests stat06
3) Add ELOOP check
4) Remove useless struct member

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 runtest/quickhit                          |   2 -
 runtest/syscalls                          |   2 -
 testcases/kernel/syscalls/stat/.gitignore |   2 -
 testcases/kernel/syscalls/stat/stat03.c   | 359 ++++-----------------
 testcases/kernel/syscalls/stat/stat06.c   | 361 ----------------------
 5 files changed, 61 insertions(+), 665 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/stat/stat06.c

diff --git a/runtest/quickhit b/runtest/quickhit
index 31c571eaa..b13ce0887 100644
--- a/runtest/quickhit
+++ b/runtest/quickhit
@@ -223,8 +223,6 @@ signal03 signal03
 # and signal sending.
 sigrelse01 sigrelse01
 # Releasing held signals
-stat06 stat06
-# Negative tests for stat(2)
 statfs01 statfs01
 # Basic test for statfs(2) mounted filesys
 statvfs01 statvfs01
diff --git a/runtest/syscalls b/runtest/syscalls
index 22fb2462c..5f010d2d1 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1323,8 +1323,6 @@ stat03 stat03
 stat03_64 stat03_64
 stat04 symlink01 -T stat04
 stat04_64 symlink01 -T stat04_64
-stat06 stat06
-stat06_64 stat06_64
 
 statfs01 statfs01
 statfs01_64 statfs01_64
diff --git a/testcases/kernel/syscalls/stat/.gitignore b/testcases/kernel/syscalls/stat/.gitignore
index c0bd39d7b..108c8a3f3 100644
--- a/testcases/kernel/syscalls/stat/.gitignore
+++ b/testcases/kernel/syscalls/stat/.gitignore
@@ -2,5 +2,3 @@
 /stat02_64
 /stat03
 /stat03_64
-/stat06
-/stat06_64
diff --git a/testcases/kernel/syscalls/stat/stat03.c b/testcases/kernel/syscalls/stat/stat03.c
index 2e4c83a93..27937f852 100644
--- a/testcases/kernel/syscalls/stat/stat03.c
+++ b/testcases/kernel/syscalls/stat/stat03.c
@@ -1,333 +1,96 @@
-/*
- *
- *   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
- */
-
-/*
- * Test Name: stat03
- *
- * Test Description:
- *   Verify that,
- *   1) stat(2) returns -1 and sets errno to EACCES if search permission is
- *      denied on a component of the path prefix.
- *   2) stat(2) returns -1 and sets errno to ENOENT if the specified file
- *	does not exists or empty string.
- *   3) stat(2) returns -1 and sets errno to EFAULT if pathname points
- *	outside user's accessible address space.
- *   4) stat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname
- *	component is too long.
- *   5) stat(2) returns -1 and sets errno to ENOTDIR if the directory
- *	component in pathname is not a directory.
- *
- * Expected Result:
- *  stat() should fail with return value -1 and set expected errno.
- *
- * Algorithm:
- *  Setup:
- *   Setup signal handling.
- *   Create temporary directory.
- *   Pause for SIGUSR1 if option specified.
- *
- *  Test:
- *   Loop if the proper options are given.
- *   Execute system call
- *   Check return code, if system call failed (return=-1)
- *   	if errno set == expected errno
- *   		Issue sys call fails with expected return value and errno.
- *   	Otherwise,
- *		Issue sys call fails with unexpected errno.
- *   Otherwise,
- *	Issue sys call returns unexpected value.
- *
- *  Cleanup:
- *   Print errno log and/or timing stats if options given
- *   Delete the temporary directory(s)/file(s) created.
- *
- * Usage:  <for command-line>
- *  stat03 [-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.
- *
- * History
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* Copyright (c) International Business Machines  Corp., 2001
  *	07/2001 John George
  *		-Ported
  *
- * Restrictions:
- *
+ * check stat() with various error conditions that should produce
+ * EACCES, EFAULT, ENAMETOOLONG,  ENOENT, ENOTDIR, ELOOP
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
-#include <string.h>
-#include <signal.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/mman.h>
 #include <pwd.h>
+#include "tst_test.h"
 
-#include "test.h"
-#include "safe_macros.h"
+#define TST_EACCES_DIR  "tst_eaccesdir"
+#define TST_EACCES_FILE "tst_eaccesdir/tst"
+#define TST_ENOENT      "tst_enoent/tst"
+#define TST_ENOTDIR_DIR "tst_enotdir/tst"
+#define TST_ENOTDIR_FILE "tst_enotdir"
 
-#define MODE_RWX	S_IRWXU | S_IRWXG | S_IRWXO
-#define FILE_MODE	S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
-#define DIR_TEMP	"testdir_1"
-#define TEST_FILE1	"testdir_1/tfile_1"
-#define TEST_FILE2	"t_file/tfile_2"
+#define MODE_RW	        0666
+#define DIR_MODE        0755
 
-int no_setup();
-int setup1();			/* setup function to test chmod for EACCES */
-int setup2();			/* setup function to test chmod for ENOTDIR */
-int longpath_setup();		/* setup function to test chmod for ENAMETOOLONG */
-char nobody_uid[] = "nobody";
 struct passwd *ltpuser;
 
-char Longpathname[PATH_MAX + 2];
+static char long_dir[PATH_MAX + 2] = {[0 ... PATH_MAX + 1] = 'a'};
+static char loop_dir[PATH_MAX] = ".";
+
+struct tcase;
 
-struct test_case_t {		/* test case struct. to hold ref. test cond's */
+static struct tcase{
 	char *pathname;
-	char *desc;
 	int exp_errno;
-	int (*setupfunc) ();
-} Test_cases[] = {
-	{TEST_FILE1, "No Search permissions to process", EACCES, setup1}, {
-	NULL, "Invalid address", EFAULT, no_setup}, {
-	Longpathname, "Pathname too long", ENAMETOOLONG, longpath_setup}, {
-	"", "Pathname is empty", ENOENT, no_setup}, {
-	TEST_FILE2, "Path contains regular file", ENOTDIR, setup2}, {
-	NULL, NULL, 0, no_setup}
+} TC[] = {
+	{TST_EACCES_FILE, EACCES},
+	{NULL, EFAULT},
+	{long_dir, ENAMETOOLONG},
+	{TST_ENOENT, ENOENT},
+	{TST_ENOTDIR_DIR, ENOTDIR},
+	{loop_dir, ELOOP}
 };
 
-char *TCID = "stat03";
-int TST_TOTAL = ARRAY_SIZE(Test_cases);
-
-void setup();			/* Main setup function for the tests */
-void cleanup();			/* cleanup function for the test */
-
-int main(int ac, char **av)
-{
-	struct stat stat_buf;	/* stat structure buffer */
-	int lc;
-	char *file_name;	/* ptr. for file name whose mode is modified */
-	char *test_desc;	/* test specific error message */
-	int ind;		/* counter to test different test conditions */
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	/*
-	 * Invoke setup function to call individual test setup functions
-	 * to simulate test conditions.
-	 */
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-			file_name = Test_cases[ind].pathname;
-			test_desc = Test_cases[ind].desc;
-
-			/*
-			 * Call stat(2) to test different test conditions.
-			 * verify that it fails with -1 return value and
-			 * sets appropriate errno.
-			 */
-			TEST(stat(file_name, &stat_buf));
-
-			/* Check return code from stat(2) */
-			if (TEST_RETURN == -1) {
-				if (TEST_ERRNO == Test_cases[ind].exp_errno) {
-					tst_resm(TPASS,
-						 "stat() fails, %s, errno:%d",
-						 test_desc, TEST_ERRNO);
-				} else {
-					tst_resm(TFAIL,
-						 "stat() fails, %s, errno:%d, expected errno:%d",
-						 test_desc, TEST_ERRNO,
-						 Test_cases[ind].exp_errno);
-				}
-			} else {
-				tst_resm(TFAIL,
-					 "stat(2) returned %ld, expected -1, errno:%d",
-					 TEST_RETURN,
-					 Test_cases[ind].exp_errno);
-			}
-		}
-		tst_count++;	/* incr TEST_LOOP counter */
-	}
-
-	/*
-	 * Invoke cleanup() to delete the test directory/file(s) created
-	 * in the setup().
-	 */
-	cleanup();
-	tst_exit();
-
-}
-
-/*
- * void
- * setup(void) - performs all ONE TIME setup for this test.
- * 	Exit the test program on receipt of unexpected signals.
- *	Create a temporary directory and change directory to it.
- *	Invoke individual test setup functions according to the order
- *	set in struct. definition.
- */
-void setup(void)
+static void verify_stat(unsigned int n)
 {
-	int ind;
-
-	tst_require_root();
-
-	/* Capture unexpected signals */
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
-	/* Switch to nobody user for correct error code collection */
-	ltpuser = getpwnam(nobody_uid);
-	if (setuid(ltpuser->pw_uid) == -1) {
-		tst_resm(TINFO, "setuid failed to "
-			 "to set the effective uid to %d", ltpuser->pw_uid);
-		perror("setuid");
+	struct tcase *tc = TC + n;
+	struct stat stat_buf;
+
+	TEST(stat(tc->pathname, &stat_buf));
+	if (TST_RET != -1) {
+		tst_res(TFAIL, "stat() returned %ld, expected -1, errno=%d",
+			TST_RET, tc->exp_errno);
+		return;
 	}
 
-	/* Pause if that option was specified
-	 * TEST_PAUSE contains the code to fork the test with the -i option.
-	 * You want to make sure you do this before you create your temporary
-	 * directory.
-	 */
-	TEST_PAUSE;
-
-	/* Make a temp dir and cd to it */
-	tst_tmpdir();
-
-	/* call individual setup functions */
-	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-		if (!Test_cases[ind].pathname)
-			Test_cases[ind].pathname = tst_get_bad_addr(cleanup);
-		Test_cases[ind].setupfunc();
+	if (TST_ERR == tc->exp_errno) {
+		tst_res(TPASS | TTERRNO, "stat() failed as expected");
+	} else {
+		tst_res(TFAIL | TTERRNO,
+			"stat() failed unexpectedly; expected: %d - %s",
+			tc->exp_errno, strerror(tc->exp_errno));
 	}
 }
 
-/*
- * int
- * no_setup() - Some test conditions for stat(2) do not any setup.
- *              Hence, this function just returns 0.
- *  This function simply returns 0.
- */
-int no_setup(void)
+static void setup(void)
 {
-	return 0;
-}
-
-/*
- * int
- * setup1() - setup function for a test condition for which stat(2)
- *	      returns -1 and sets errno to EACCES.
- *  Create a test directory under temporary directory and create a test file
- *  under this directory with mode "0666" permissions.
- *  Modify the mode permissions on test directory such that process will not
- *  have search permissions on test directory.
- *
- *  The function returns 0.
- */
-int setup1(void)
-{
-	int fd;			/* file handle for testfile */
-
-	/* Creat a test directory */
-	SAFE_MKDIR(cleanup, DIR_TEMP, MODE_RWX);
-
-	/* Creat a test file under above test directory */
-	if ((fd = open(TEST_FILE1, O_RDWR | O_CREAT, 0666)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(%s, O_RDWR|O_CREAT, 0666) failed, errno=%d : %s",
-			 TEST_FILE1, errno, strerror(errno));
-	}
-	/* Close the test file */
-	SAFE_CLOSE(cleanup, fd);
+	unsigned int i;
 
-	/* Modify mode permissions on test directory */
-	SAFE_CHMOD(cleanup, DIR_TEMP, FILE_MODE);
-	return 0;
-}
+	ltpuser = SAFE_GETPWNAM("nobody");
+	SAFE_SETUID(ltpuser->pw_uid);
 
-/*
- * int
- * setup2() - setup function for a test condition for which stat(2)
- *	     returns -1 and sets errno to ENOTDIR.
- *
- *  Create a test file under temporary directory so that test tries to
- *  change mode of a testfile "tfile_2" under "t_file" which happens to be
- *  another regular file.
- */
-int setup2(void)
-{
-	int fd;			/* File handle for test file */
+	SAFE_MKDIR(TST_EACCES_DIR, DIR_MODE);
+	SAFE_TOUCH(TST_EACCES_FILE, DIR_MODE, NULL);
+	SAFE_CHMOD(TST_EACCES_DIR, MODE_RW);
 
-	/* Creat a test file under temporary directory */
-	if ((fd = open("t_file", O_RDWR | O_CREAT, MODE_RWX)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(2) on t_file failed, errno=%d : %s",
-			 errno, strerror(errno));
+	for (i = 0; i < ARRAY_SIZE(TC); i++) {
+		if (TC[i].exp_errno == EFAULT)
+			TC[i].pathname = tst_get_bad_addr(NULL);
 	}
-	/* Close the test file created above */
-	SAFE_CLOSE(cleanup, fd);
-	return 0;
-}
 
-/*
- * int
- * longpath_setup() - setup to create a node with a name length exceeding
- *                    the MAX. length of PATH_MAX.
- *   This function retruns 0.
- */
-int longpath_setup(void)
-{
-	int ind;		/* counter variable */
+	SAFE_TOUCH(TST_ENOTDIR_FILE, DIR_MODE, NULL);
 
-	for (ind = 0; ind <= (PATH_MAX + 1); ind++) {
-		Longpathname[ind] = 'a';
-	}
-	return 0;
+	SAFE_MKDIR("test_eloop", DIR_MODE);
+	SAFE_SYMLINK("../test_eloop", "test_eloop/test_eloop");
+	for (i = 0; i < 43; i++)
+		strcat(loop_dir, "/test_eloop");
 }
 
-/*
- * void
- * cleanup() - Performs all ONE TIME cleanup for this test at
- *             completion or premature exit.
- *	Print test timing stats and errno log if test executed with options.
- *	Remove temporary directory and sub-directories/files under it
- *	created during setup().
- *	Exit the test program with normal exit code.
- */
-void cleanup(void)
-{
-
-	/* Restore mode permissions on test directory created in setup2() */
-	if (chmod(DIR_TEMP, MODE_RWX) < 0) {
-		tst_brkm(TFAIL, NULL, "chmod(2) of %s failed", DIR_TEMP);
-	}
-
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.tcnt = ARRAY_SIZE(TC),
+	.needs_tmpdir = 1,
+	.needs_root = 1,
+	.setup = setup,
+	.test = verify_stat,
+};
diff --git a/testcases/kernel/syscalls/stat/stat06.c b/testcases/kernel/syscalls/stat/stat06.c
deleted file mode 100644
index c5eb1da82..000000000
--- a/testcases/kernel/syscalls/stat/stat06.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.  Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: stat06.c,v 1.10 2009/11/02 13:57:19 subrata_modak Exp $ */
-/**********************************************************
- *
- *    OS Test - Silicon Graphics, Inc.
- *
- *    TEST IDENTIFIER	: stat06
- *
- *    EXECUTED BY	: anyone
- *
- *    TEST TITLE	: stat(2) negative path testcases
- *
- *    PARENT DOCUMENT	: None
- *
- *    TEST CASE TOTAL	: 7
- *
- *    WALL CLOCK TIME	: 1
- *
- *    CPU TYPES		: ALL
- *
- *    AUTHOR		: Richard Logan
- *
- *    CO-PILOT		: William Roske
- *
- *    DATE STARTED	: 03/30/94
- *
- *    INITIAL RELEASE	: UNICOS 7.0
- *
- *    TEST CASES
- *
- * 	1-7) See Testcases structure below.
- *
- *    INPUT SPECIFICATIONS
- * 	The standard options for system call tests are accepted.
- *	(See the parse_opts(3) man page).
- *      -h  : print help and exit
- *
- *    OUTPUT SPECIFICATIONS
- *$
- *    DURATION
- * 	Terminates - with frequency and infinite modes.
- *
- *    SIGNALS
- * 	Uses SIGUSR1 to pause before test if option set.
- * 	(See the parse_opts(3) man page).
- *
- *    RESOURCES
- * 	None
- *
- *    ENVIRONMENTAL NEEDS
- * 	The libcuts.a and libsys.a libraries must be included in
- *	the compilation of this test.
- *
- *    SPECIAL PROCEDURAL REQUIREMENTS
- * 	None
- *
- *    INTERCASE DEPENDENCIES
- * 	None
- *
- *    DETAILED DESCRIPTION
- *	This is a Phase I test for the stat(2) system call.  It is intended
- *	to provide a limited exposure of the system call, for now.  It
- *	should/will be extended when full functional tests are written for
- *	stat(2).
- *
- * 	Setup:
- * 	  Setup signal handling.
- *	  Pause for SIGUSR1 if option specified.
- *
- * 	Test:
- *	 Loop if the proper options are given.
- * 	  Execute system call
- *	  Check return code, if system call failed (return=-1)
- *		Log the errno and Issue a FAIL message.
- *	  Otherwise, Issue a PASS message.
- *
- * 	Cleanup:
- * 	  Print errno log and/or timing stats if options given
- *
- *
- *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <unistd.h>
-#include "test.h"
-
-void setup();
-void cleanup();
-
-char *TCID = "stat06";
-
-char *bad_addr = 0;
-
-#if !defined(UCLINUX)
-int high_address_setup();
-char High_address[64];
-#endif
-int longpath_setup();
-int no_setup();
-int filepath_setup();
-char Longpathname[PATH_MAX + 2];
-struct stat statbuf;
-jmp_buf sig11_recover;
-void sig11_handler(int sig);
-
-struct test_case_t {
-	char *pathname;
-	struct stat *stbuf;
-	char *desc;
-	int exp_errno;
-	int (*setupfunc) ();
-} Test_cases[] = {
-	{
-	"nonexistfile", &statbuf, "non-existent file", ENOENT, no_setup}, {
-	"", &statbuf, "path is empty string", ENOENT, no_setup}, {
-	"nefile/file", &statbuf, "path contains a non-existent file",
-		    ENOENT, no_setup}, {
-	"file/file", &statbuf, "path contains a regular file",
-		    ENOTDIR, filepath_setup}, {
-	Longpathname, &statbuf, "pathname too long", ENAMETOOLONG,
-		    longpath_setup},
-#if !defined(UCLINUX)
-	{
-	High_address, &statbuf, "address beyond address space", EFAULT,
-		    high_address_setup}, {
-	(char *)-1, &statbuf, "negative address", EFAULT, no_setup},
-#endif
-	{
-	NULL, NULL, NULL, 0, no_setup}
-};
-
-int TST_TOTAL = ARRAY_SIZE(Test_cases);
-
-/***********************************************************************
- * Main
- ***********************************************************************/
-int main(int ac, char **av)
-{
-	int lc;
-	char *fname;
-	char *desc;
-	int ind;
-	struct stat *stbuf;
-	struct sigaction sa, osa;
-
-    /***************************************************************
-     * parse standard options
-     ***************************************************************/
-	tst_parse_opts(ac, av, NULL, NULL);
-
-    /***************************************************************
-     * perform global setup for test
-     ***************************************************************/
-	setup();
-
-    /***************************************************************
-     * check looping state if -c option given
-     ***************************************************************/
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-
-			fname = Test_cases[ind].pathname;
-			desc = Test_cases[ind].desc;
-			stbuf = Test_cases[ind].stbuf;
-
-			if (stbuf == (struct stat *)-1) {
-				/* special sig11 case */
-				sa.sa_handler = &sig11_handler;
-				sigemptyset(&sa.sa_mask);
-				sa.sa_flags = 0;
-
-				sigaction(SIGSEGV, NULL, &osa);
-				sigaction(SIGSEGV, &sa, NULL);
-
-				if (setjmp(sig11_recover)) {
-					TEST_RETURN = -1;
-					TEST_ERRNO = EFAULT;
-				} else {
-					TEST(stat(fname, stbuf));
-				}
-				sigaction(SIGSEGV, &osa, NULL);
-			} else {
-				/*
-				 *  Call stat(2)
-				 */
-
-				TEST(stat(fname, stbuf));
-			}
-
-			/* check return code */
-			if (TEST_RETURN == -1) {
-				if (TEST_ERRNO ==
-				    Test_cases[ind].exp_errno)
-					tst_resm(TPASS,
-						 "stat(<%s>, &stbuf) Failed, errno=%d",
-						 desc, TEST_ERRNO);
-				else
-					tst_resm(TFAIL,
-						 "stat(<%s>, &stbuf) Failed, errno=%d, expected errno:%d",
-						 desc, TEST_ERRNO,
-						 Test_cases
-						 [ind].exp_errno);
-			} else {
-				tst_resm(TFAIL,
-					 "stat(<%s>, &stbuf) returned %ld, expected -1, errno:%d",
-					 desc, TEST_RETURN,
-					 Test_cases[ind].exp_errno);
-			}
-		}
-
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-/***************************************************************
- * setup() - performs all ONE TIME setup for this test.
- ***************************************************************/
-void setup(void)
-{
-	int ind;
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-#if !defined(UCLINUX)
-	bad_addr = mmap(0, 1, PROT_NONE,
-			MAP_PRIVATE_EXCEPT_UCLINUX | MAP_ANONYMOUS, 0, 0);
-	if (bad_addr == MAP_FAILED) {
-		tst_brkm(TBROK, cleanup, "mmap failed");
-	}
-	Test_cases[6].pathname = bad_addr;
-#endif
-
-	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-		Test_cases[ind].setupfunc();
-	}
-
-}
-
-/***************************************************************
- * cleanup() - performs all ONE TIME cleanup for this test at
- *		completion or premature exit.
- ***************************************************************/
-void cleanup(void)
-{
-
-	tst_rmdir();
-
-}
-
-/******************************************************************
- * no_setup() - does nothing
- ******************************************************************/
-int no_setup(void)
-{
-	return 0;
-}
-
-#if !defined(UCLINUX)
-
-/******************************************************************
- * high_address_setup() - generates an address that should cause a segfault
- ******************************************************************/
-int high_address_setup(void)
-{
-	int ind;
-
-	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-		if (Test_cases[ind].pathname == High_address) {
-			/*if (strcmp(Test_cases[ind].pathname, HIGH_ADDRESS) == 0) { ** */
-			Test_cases[ind].pathname = (char *)(sbrk(0) + 5);
-			break;
-		}
-	}
-	return 0;
-
-}
-#endif
-
-/******************************************************************
- * longpath_setup() - creates a filename that is too long
- ******************************************************************/
-int longpath_setup(void)
-{
-	int ind;
-
-	for (ind = 0; ind <= PATH_MAX + 1; ind++) {
-		Longpathname[ind] = 'a';
-	}
-	return 0;
-
-}
-
-/******************************************************************
- * filepath_setup() creates a file the exists that we will treat as a directory
- ******************************************************************/
-int filepath_setup(void)
-{
-	int fd;
-
-	if ((fd = creat("file", 0777)) == -1) {
-		tst_brkm(TBROK, cleanup, "creat(file) failed, errno:%d %s",
-			 errno, strerror(errno));
-	}
-	close(fd);
-	return 0;
-}
-
-/******************************************************************
- * sig11_handler() - our segfault recover hack
- ******************************************************************/
-void sig11_handler(int sig)
-{
-	longjmp(sig11_recover, 1);
-}
-- 
2.18.1




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

* [LTP] [PATCH 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API
  2019-04-03  8:29 [LTP] [PATCH 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API Yang Xu
  2019-04-03  8:29 ` [LTP] [PATCH 2/2] syscalls/stat03, 06: " Yang Xu
@ 2019-04-04 12:58 ` Cyril Hrubis
  1 sibling, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2019-04-04 12:58 UTC (permalink / raw)
  To: ltp

Hi!
> diff --git a/testcases/kernel/syscalls/stat/stat02.c b/testcases/kernel/syscalls/stat/stat02.c
> index aeaa7ab82..4e0ab5a03 100644
> --- a/testcases/kernel/syscalls/stat/stat02.c
> +++ b/testcases/kernel/syscalls/stat/stat02.c
> @@ -1,228 +1,106 @@
> -/*
> - *
> - *   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
> - */
> -
> -/*
> - * Test Name: stat02
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/* Copyright (c) International Business Machines  Corp., 2001
> + *	07/2001 John George
> + *		-Ported
>   *
> - * Test Description:
>   *  Verify that, stat(2) succeeds to get the status of a file and fills the
>   *  stat structure elements though process doesn't have read access to the
>   *  file.
> - *
> - * Expected Result:
> - *  stat() should return value 0 on success and the stat structure elements
> - *  should be filled with specified 'file' information.
> - *
> - * Algorithm:
> - *  Setup:
> - *   Setup signal handling.
> - *   Create temporary directory.
> - *   Pause for SIGUSR1 if option specified.
> - *
> - *  Test:
> - *   Loop if the proper options are given.
> - *   Execute system call
> - *   Check return code, if system call failed (return=-1)
> - *   	Log the errno and Issue a FAIL message.
> - *   Otherwise,
> - *   	Verify the Functionality of system call
> - *      if successful,
> - *      	Issue Functionality-Pass message.
> - *      Otherwise,
> - *		Issue Functionality-Fail message.
> - *  Cleanup:
> - *   Print errno log and/or timing stats if options given
> - *   Delete the temporary directory created.
> - *
> - * Usage:  <for command-line>
> - *  stat02 [-c n] [-e] [-f] [-i n] [-I x] [-p x] [-t]
> - *	where,  -c n : Run n copies concurrently.
> - *		-e   : Turn on errno logging.
> - *		-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 John George
> - *		-Ported
> - *
> - * Restrictions:
> - *
>   */
> -#include <stdio.h>
> +
>  #include <sys/types.h>
>  #include <fcntl.h>
>  #include <sys/stat.h>
>  #include <errno.h>
> -#include <string.h>
> -#include <signal.h>
>  #include <pwd.h>
> +#include "tst_test.h"
>  
> -#include "test.h"
> -#include "safe_macros.h"
> -
> -#define FILE_MODE	S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
> -#define TESTFILE	"testfile"
> +#define FILE_MODE       0644
> +#define TESTFILE        "testfile"
>  #define FILE_SIZE       1024
> -#define BUF_SIZE	256
> -#define NEW_MODE	0222
> -#define MASK		0777
> -
> -char *TCID = "stat02";
> -int TST_TOTAL = 1;
> +#define BUF_SIZE        256
> +#define NEW_MODE        0222
> +#define MASK            0777
>  
> -uid_t user_id;			/* eff. user id/group id of test process */
> +uid_t user_id;
>  gid_t group_id;
> -char nobody_uid[] = "nobody";
>  struct passwd *ltpuser;
>  
> -void setup();
> -void cleanup();
> -
> -int main(int ac, char **av)
> +static void verify_stat(void)
>  {
> -	struct stat stat_buf;	/* stat structure buffer */
> -	int lc;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		/*
> -		 * Call stat(2) to get the status of
> -		 * specified 'file' into stat structure.
> -		 */
> -		TEST(stat(TESTFILE, &stat_buf));
> -
> -		if (TEST_RETURN == -1) {
> -			tst_resm(TFAIL,
> -				 "stat(%s, &stat_buf) Failed, errno=%d : %s",
> -				 TESTFILE, TEST_ERRNO, strerror(TEST_ERRNO));
> -		} else {
> -			stat_buf.st_mode &= ~S_IFREG;
> -			/*
> -			 * Verify the data returned by stat(2)
> -			 * aganist the expected data.
> -			 */
> -			if ((stat_buf.st_uid != user_id) ||
> -			    (stat_buf.st_gid != group_id) ||
> -			    (stat_buf.st_size != FILE_SIZE) ||
> -			    ((stat_buf.st_mode & MASK) != NEW_MODE)) {
> -				tst_resm(TFAIL, "Functionality of "
> -					 "stat(2) on '%s' Failed",
> -					 TESTFILE);
> -			} else {
> -				tst_resm(TPASS, "Functionality of "
> -					 "stat(2) on '%s' Succcessful",
> -					 TESTFILE);
> -			}
> -		}
> -		tst_count++;	/* incr TEST_LOOP counter */
> +	struct stat stat_buf;
> +	int fail = 0;
> +
> +	TEST(stat(TESTFILE, &stat_buf));
> +
> +	if (TST_RET == -1) {
> +		tst_res(TFAIL | TTERRNO, "fstat(%s) failed", TESTFILE);
> +		return;
>  	}
>  
> -	cleanup();
> -	tst_exit();
> -}
> +	if (stat_buf.st_uid != user_id) {
> +		tst_res(TINFO, "stat_buf.st_uid = %i expected %i",
> +			stat_buf.st_uid, user_id);
> +		fail++;
> +	}
>  
> -/*
> - * void
> - * setup() -  Performs setup function for the test.
> - *  Creat a temporary directory and change directory to it.
> - *  Creat a testfile and write some data into it.
> - *  Modify the mode permissions of testfile such that test process
> - *  has read-only access to testfile.
> - */
> -void setup(void)
> -{
> -	int i, fd;		/* counter, file handle for file */
> -	char tst_buff[BUF_SIZE];	/* data buffer for file */
> -	int wbytes;		/* no. of bytes written to file */
> -	int write_len = 0;
> +	if (stat_buf.st_gid != group_id) {
> +		tst_res(TINFO, "stat_buf.st_gid = %i expected %i",
> +			stat_buf.st_gid, group_id);
> +		fail++;
> +	}
>  
> -	tst_require_root();
> +	if (stat_buf.st_size != FILE_SIZE) {
> +		tst_res(TINFO, "stat_buf.st_size = %li expected %i",
> +			(long)stat_buf.st_size, FILE_SIZE);
> +		fail++;
> +	}
>  
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> +	if ((stat_buf.st_mode & MASK) != NEW_MODE) {
> +		tst_res(TINFO, "stat_buf.st_mode = %o expected %o",
> +			(stat_buf.st_mode & MASK), NEW_MODE);
> +		fail++;
> +	}
>  
> -	/* Switch to nobody user for correct error code collection */
> -	ltpuser = getpwnam(nobody_uid);
> -	if (setuid(ltpuser->pw_uid) == -1) {
> -		tst_resm(TINFO, "setuid failed to "
> -			 "to set the effective uid to %d", ltpuser->pw_uid);
> -		perror("setuid");
> +	if (fail) {
> +		tst_res(TFAIL, "functionality of stat incorrect");
> +		return;
>  	}
>  
> -	/* Pause if that option was specified
> -	 * TEST_PAUSE contains the code to fork the test with the -i option.
> -	 * You want to make sure you do this before you create your temporary
> -	 * directory.
> -	 */
> -	TEST_PAUSE;
> +	tst_res(TPASS, "functionality of stat correct");
> +}
> +
> +void setup(void)
> +{
> +	int i, fd;
> +	char tst_buff[BUF_SIZE];

The tst_ prefix is reserved for the library, it shouldn't be used in the
testcases.

> +	int write_len = 0;
>  
> -	tst_tmpdir();
> +	ltpuser = SAFE_GETPWNAM("nobody");
> +	SAFE_SETUID(ltpuser->pw_uid);
>  
> -	if ((fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE)) == -1) {
> -		tst_brkm(TBROK, cleanup,
> -			 "open(%s, O_RDWR|O_CREAT, %#o) Failed, errno=%d : %s",
> -			 TESTFILE, FILE_MODE, errno, strerror(errno));
> -	}
> +	fd = SAFE_OPEN(TESTFILE, O_WRONLY | O_CREAT, FILE_MODE);
>  
> -	/* Fill the test buffer with the known data */
>  	for (i = 0; i < BUF_SIZE; i++) {
>  		tst_buff[i] = 'a';
>  	}
>  
>  	/* Write to the file 1k data from the buffer */
>  	while (write_len < FILE_SIZE) {
> -		if ((wbytes = write(fd, tst_buff, sizeof(tst_buff))) <= 0) {
> -			tst_brkm(TBROK | TERRNO, cleanup, "write to %s failed",
> -				 TESTFILE);
> -		} else {
> -			write_len += wbytes;
> -		}
> -	}
> -
> -	if (close(fd) == -1) {
> -		tst_resm(TWARN | TERRNO, "closing %s failed", TESTFILE);
> +		SAFE_WRITE(1, fd, tst_buff, sizeof(tst_buff));
> +		write_len += BUF_SIZE;
>  	}
> -
> -	/* Modify mode permissions on the testfile */
> -	SAFE_CHMOD(cleanup, TESTFILE, NEW_MODE);
> +	SAFE_CLOSE(fd);

We do have tst_fill_file() function exactly for this purpose.

> -	/* Get the uid/gid of the process */
> +	SAFE_CHMOD(TESTFILE, NEW_MODE);
>  	user_id = getuid();
>  	group_id = getgid();
> -
>  }
>  
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - *	       completion or premature exit.
> - *  Remove the temporary directory and file created.
> - */
> -void cleanup(void)
> -{
> -
> -	tst_rmdir();
> -}
> +static struct tst_test test = {
> +	.setup = setup,
> +	.test_all = verify_stat,
> +	.needs_root = 1,
> +	.needs_tmpdir = 1,
> +};

In order to keep the coverage the same we should ideally test both with
and without read permission on the file.

Also since we are removing tests 01, 02 and 05 it would be a bit better
to name the resulting test stat01.c.

Other than that this is a great cleanup.

-- 
Cyril Hrubis
chrubis@suse.cz

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

* [LTP] [PATCH 2/2] syscalls/stat03, 06: Cleanup && Convert to new API
  2019-04-03  8:29 ` [LTP] [PATCH 2/2] syscalls/stat03, 06: " Yang Xu
@ 2019-04-04 13:19   ` Cyril Hrubis
  2019-04-08  6:52     ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Yang Xu
  0 siblings, 1 reply; 8+ messages in thread
From: Cyril Hrubis @ 2019-04-04 13:19 UTC (permalink / raw)
  To: ltp

Hi!
> diff --git a/testcases/kernel/syscalls/stat/stat03.c b/testcases/kernel/syscalls/stat/stat03.c
> index 2e4c83a93..27937f852 100644
> --- a/testcases/kernel/syscalls/stat/stat03.c
> +++ b/testcases/kernel/syscalls/stat/stat03.c
> @@ -1,333 +1,96 @@
> -/*
> - *
> - *   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
> - */
> -
> -/*
> - * Test Name: stat03
> - *
> - * Test Description:
> - *   Verify that,
> - *   1) stat(2) returns -1 and sets errno to EACCES if search permission is
> - *      denied on a component of the path prefix.
> - *   2) stat(2) returns -1 and sets errno to ENOENT if the specified file
> - *	does not exists or empty string.
> - *   3) stat(2) returns -1 and sets errno to EFAULT if pathname points
> - *	outside user's accessible address space.
> - *   4) stat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname
> - *	component is too long.
> - *   5) stat(2) returns -1 and sets errno to ENOTDIR if the directory
> - *	component in pathname is not a directory.
> - *
> - * Expected Result:
> - *  stat() should fail with return value -1 and set expected errno.
> - *
> - * Algorithm:
> - *  Setup:
> - *   Setup signal handling.
> - *   Create temporary directory.
> - *   Pause for SIGUSR1 if option specified.
> - *
> - *  Test:
> - *   Loop if the proper options are given.
> - *   Execute system call
> - *   Check return code, if system call failed (return=-1)
> - *   	if errno set == expected errno
> - *   		Issue sys call fails with expected return value and errno.
> - *   	Otherwise,
> - *		Issue sys call fails with unexpected errno.
> - *   Otherwise,
> - *	Issue sys call returns unexpected value.
> - *
> - *  Cleanup:
> - *   Print errno log and/or timing stats if options given
> - *   Delete the temporary directory(s)/file(s) created.
> - *
> - * Usage:  <for command-line>
> - *  stat03 [-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.
> - *
> - * History
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/* Copyright (c) International Business Machines  Corp., 2001
>   *	07/2001 John George
>   *		-Ported
>   *
> - * Restrictions:
> - *
> + * check stat() with various error conditions that should produce
> + * EACCES, EFAULT, ENAMETOOLONG,  ENOENT, ENOTDIR, ELOOP
>   */
>  
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <unistd.h>
>  #include <fcntl.h>
>  #include <errno.h>
> -#include <string.h>
> -#include <signal.h>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> -#include <sys/mman.h>
>  #include <pwd.h>
> +#include "tst_test.h"
>  
> -#include "test.h"
> -#include "safe_macros.h"
> +#define TST_EACCES_DIR  "tst_eaccesdir"
> +#define TST_EACCES_FILE "tst_eaccesdir/tst"
> +#define TST_ENOENT      "tst_enoent/tst"
> +#define TST_ENOTDIR_DIR "tst_enotdir/tst"
> +#define TST_ENOTDIR_FILE "tst_enotdir"
>  
> -#define MODE_RWX	S_IRWXU | S_IRWXG | S_IRWXO
> -#define FILE_MODE	S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
> -#define DIR_TEMP	"testdir_1"
> -#define TEST_FILE1	"testdir_1/tfile_1"
> -#define TEST_FILE2	"t_file/tfile_2"
> +#define MODE_RW	        0666
> +#define DIR_MODE        0755
>  
> -int no_setup();
> -int setup1();			/* setup function to test chmod for EACCES */
> -int setup2();			/* setup function to test chmod for ENOTDIR */
> -int longpath_setup();		/* setup function to test chmod for ENAMETOOLONG */
> -char nobody_uid[] = "nobody";
>  struct passwd *ltpuser;
>  
> -char Longpathname[PATH_MAX + 2];
> +static char long_dir[PATH_MAX + 2] = {[0 ... PATH_MAX + 1] = 'a'};
> +static char loop_dir[PATH_MAX] = ".";
> +
> +struct tcase;

It's useless to forward declare the structure if you are not using it
for the structure members themselves.

> -struct test_case_t {		/* test case struct. to hold ref. test cond's */
> +static struct tcase{
>  	char *pathname;
> -	char *desc;
>  	int exp_errno;
> -	int (*setupfunc) ();
> -} Test_cases[] = {
> -	{TEST_FILE1, "No Search permissions to process", EACCES, setup1}, {
> -	NULL, "Invalid address", EFAULT, no_setup}, {
> -	Longpathname, "Pathname too long", ENAMETOOLONG, longpath_setup}, {
> -	"", "Pathname is empty", ENOENT, no_setup}, {
> -	TEST_FILE2, "Path contains regular file", ENOTDIR, setup2}, {
> -	NULL, NULL, 0, no_setup}
> +} TC[] = {
> +	{TST_EACCES_FILE, EACCES},
> +	{NULL, EFAULT},
> +	{long_dir, ENAMETOOLONG},
> +	{TST_ENOENT, ENOENT},
> +	{TST_ENOTDIR_DIR, ENOTDIR},
> +	{loop_dir, ELOOP}
>  };
>  
> -char *TCID = "stat03";
> -int TST_TOTAL = ARRAY_SIZE(Test_cases);
> -
> -void setup();			/* Main setup function for the tests */
> -void cleanup();			/* cleanup function for the test */
> -
> -int main(int ac, char **av)
> -{
> -	struct stat stat_buf;	/* stat structure buffer */
> -	int lc;
> -	char *file_name;	/* ptr. for file name whose mode is modified */
> -	char *test_desc;	/* test specific error message */
> -	int ind;		/* counter to test different test conditions */
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	/*
> -	 * Invoke setup function to call individual test setup functions
> -	 * to simulate test conditions.
> -	 */
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
> -			file_name = Test_cases[ind].pathname;
> -			test_desc = Test_cases[ind].desc;
> -
> -			/*
> -			 * Call stat(2) to test different test conditions.
> -			 * verify that it fails with -1 return value and
> -			 * sets appropriate errno.
> -			 */
> -			TEST(stat(file_name, &stat_buf));
> -
> -			/* Check return code from stat(2) */
> -			if (TEST_RETURN == -1) {
> -				if (TEST_ERRNO == Test_cases[ind].exp_errno) {
> -					tst_resm(TPASS,
> -						 "stat() fails, %s, errno:%d",
> -						 test_desc, TEST_ERRNO);
> -				} else {
> -					tst_resm(TFAIL,
> -						 "stat() fails, %s, errno:%d, expected errno:%d",
> -						 test_desc, TEST_ERRNO,
> -						 Test_cases[ind].exp_errno);
> -				}
> -			} else {
> -				tst_resm(TFAIL,
> -					 "stat(2) returned %ld, expected -1, errno:%d",
> -					 TEST_RETURN,
> -					 Test_cases[ind].exp_errno);
> -			}
> -		}
> -		tst_count++;	/* incr TEST_LOOP counter */
> -	}
> -
> -	/*
> -	 * Invoke cleanup() to delete the test directory/file(s) created
> -	 * in the setup().
> -	 */
> -	cleanup();
> -	tst_exit();
> -
> -}
> -
> -/*
> - * void
> - * setup(void) - performs all ONE TIME setup for this test.
> - * 	Exit the test program on receipt of unexpected signals.
> - *	Create a temporary directory and change directory to it.
> - *	Invoke individual test setup functions according to the order
> - *	set in struct. definition.
> - */
> -void setup(void)
> +static void verify_stat(unsigned int n)
>  {
> -	int ind;
> -
> -	tst_require_root();
> -
> -	/* Capture unexpected signals */
> -	tst_sig(FORK, DEF_HANDLER, cleanup);
> -
> -	/* Switch to nobody user for correct error code collection */
> -	ltpuser = getpwnam(nobody_uid);
> -	if (setuid(ltpuser->pw_uid) == -1) {
> -		tst_resm(TINFO, "setuid failed to "
> -			 "to set the effective uid to %d", ltpuser->pw_uid);
> -		perror("setuid");
> +	struct tcase *tc = TC + n;
> +	struct stat stat_buf;
> +
> +	TEST(stat(tc->pathname, &stat_buf));
> +	if (TST_RET != -1) {
> +		tst_res(TFAIL, "stat() returned %ld, expected -1, errno=%d",
> +			TST_RET, tc->exp_errno);

I think that printing the expecte errno here is a bit confusing and even
if you think that it should stay it should be printed with
tst_strerrno().

> +		return;
>  	}
>  
> -	/* Pause if that option was specified
> -	 * TEST_PAUSE contains the code to fork the test with the -i option.
> -	 * You want to make sure you do this before you create your temporary
> -	 * directory.
> -	 */
> -	TEST_PAUSE;
> -
> -	/* Make a temp dir and cd to it */
> -	tst_tmpdir();
> -
> -	/* call individual setup functions */
> -	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
> -		if (!Test_cases[ind].pathname)
> -			Test_cases[ind].pathname = tst_get_bad_addr(cleanup);
> -		Test_cases[ind].setupfunc();
> +	if (TST_ERR == tc->exp_errno) {
> +		tst_res(TPASS | TTERRNO, "stat() failed as expected");
> +	} else {
> +		tst_res(TFAIL | TTERRNO,
> +			"stat() failed unexpectedly; expected: %d - %s",
> +			tc->exp_errno, strerror(tc->exp_errno));

Here as well, we should use tst_strerrno() instead of strerror().

>  	}
>  }

The rest looks good.

-- 
Cyril Hrubis
chrubis@suse.cz

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

* [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API
  2019-04-04 13:19   ` Cyril Hrubis
@ 2019-04-08  6:52     ` Yang Xu
  2019-04-08  6:52       ` [LTP] [PATCH v2 2/2] syscalls/stat03, 06: " Yang Xu
  2019-04-09 13:33       ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Cyril Hrubis
  0 siblings, 2 replies; 8+ messages in thread
From: Yang Xu @ 2019-04-08  6:52 UTC (permalink / raw)
  To: ltp

1) Take use of some safe macros
2) Remove duplicate tests stat02,stat05

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 runtest/quickhit                          |   2 -
 runtest/syscalls                          |   4 -
 testcases/kernel/syscalls/stat/.gitignore |   4 -
 testcases/kernel/syscalls/stat/stat01.c   | 167 ++++++----------
 testcases/kernel/syscalls/stat/stat02.c   | 228 ----------------------
 testcases/kernel/syscalls/stat/stat05.c   | 194 ------------------
 6 files changed, 61 insertions(+), 538 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/stat/stat02.c
 delete mode 100644 testcases/kernel/syscalls/stat/stat05.c

diff --git a/runtest/quickhit b/runtest/quickhit
index 74482fd46..31c571eaa 100644
--- a/runtest/quickhit
+++ b/runtest/quickhit
@@ -223,8 +223,6 @@ signal03 signal03
 # and signal sending.
 sigrelse01 sigrelse01
 # Releasing held signals
-stat05 stat05
-# Basic test for stat(2)
 stat06 stat06
 # Negative tests for stat(2)
 statfs01 statfs01
diff --git a/runtest/syscalls b/runtest/syscalls
index cf8189ebd..9fa58f7f9 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1319,14 +1319,10 @@ ssetmask01 ssetmask01
 
 stat01 stat01
 stat01_64 stat01_64
-stat02 stat02
-stat02_64 stat02_64
 stat03 stat03
 stat03_64 stat03_64
 stat04 symlink01 -T stat04
 stat04_64 symlink01 -T stat04_64
-stat05 stat05
-stat05_64 stat05_64
 stat06 stat06
 stat06_64 stat06_64
 
diff --git a/testcases/kernel/syscalls/stat/.gitignore b/testcases/kernel/syscalls/stat/.gitignore
index cb3df91fd..0705df714 100644
--- a/testcases/kernel/syscalls/stat/.gitignore
+++ b/testcases/kernel/syscalls/stat/.gitignore
@@ -1,10 +1,6 @@
 /stat01
 /stat01_64
-/stat02
-/stat02_64
 /stat03
 /stat03_64
-/stat05
-/stat05_64
 /stat06
 /stat06_64
diff --git a/testcases/kernel/syscalls/stat/stat01.c b/testcases/kernel/syscalls/stat/stat01.c
index e041311f5..437ce0cf8 100644
--- a/testcases/kernel/syscalls/stat/stat01.c
+++ b/testcases/kernel/syscalls/stat/stat01.c
@@ -1,152 +1,107 @@
-/*
- * Copyright (c) International Business Machines  Corp., 2001
- *  07/2001 John George
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* Copyright (c) International Business Machines  Corp., 2001
+ *	07/2001 John George
+ *		-Ported
  *
- * 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
- */
-/*
  *  Verify that, stat(2) succeeds to get the status of a file and fills the
- *  stat structure elements.
+ *  stat structure elements regardless of whether process has or doesn't
+ *  have read access to the file.
  */
-#include <stdio.h>
+
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <errno.h>
-#include <string.h>
-#include <signal.h>
 #include <pwd.h>
-
-#include "test.h"
-#include "safe_macros.h"
-
-#define FILE_MODE	0644
-#define TESTFILE	"testfile"
-#define FILE_SIZE       1024
-#define BUF_SIZE	256
-#define MASK		0777
-
-char *TCID = "stat01";
-int TST_TOTAL = 1;
-
-static uid_t user_id;
-static gid_t group_id;
-
-static void setup(void);
-static void cleanup(void);
-
-static void verify(void)
+#include "tst_test.h"
+
+#define FILE_SIZE	 1024
+#define TST_FILEREAD     "test_fileread"
+#define TST_FILENOREAD   "test_filenoread"
+#define READ_MODE        0666
+#define NEW_MODE         0222
+#define MASK             0777
+
+uid_t user_id;
+gid_t group_id;
+struct passwd *ltpuser;
+
+static struct tcase{
+	char *pathname;
+	unsigned int mode;
+} TC[] = {
+	{TST_FILEREAD, READ_MODE},
+	{TST_FILENOREAD, NEW_MODE}
+};
+
+static void verify_stat(unsigned int n)
 {
+	struct tcase *tc = TC + n;
 	struct stat stat_buf;
 	int fail = 0;
 
-	TEST(stat(TESTFILE, &stat_buf));
+	TEST(stat(tc->pathname, &stat_buf));
 
-	if (TEST_RETURN == -1) {
-		tst_resm(TFAIL | TTERRNO, "fstat(%s) failed", TESTFILE);
+	if (TST_RET == -1) {
+		tst_res(TFAIL | TTERRNO, "stat(%s) failed", tc->pathname);
 		return;
 	}
 
 	if (stat_buf.st_uid != user_id) {
-		tst_resm(TINFO, "stat_buf.st_uid = %i expected %i",
-		         stat_buf.st_uid, user_id);
+		tst_res(TINFO, "stat_buf.st_uid = %i expected %i",
+			stat_buf.st_uid, user_id);
 		fail++;
 	}
 
 	if (stat_buf.st_gid != group_id) {
-		tst_resm(TINFO, "stat_buf.st_gid = %i expected %i",
-		         stat_buf.st_gid, group_id);
+		tst_res(TINFO, "stat_buf.st_gid = %i expected %i",
+			stat_buf.st_gid, group_id);
 		fail++;
 	}
 
 	if (stat_buf.st_size != FILE_SIZE) {
-		tst_resm(TINFO, "stat_buf.st_size = %li expected %i",
-		         (long)stat_buf.st_size, FILE_SIZE);
+		tst_res(TINFO, "stat_buf.st_size = %li expected %i",
+			(long)stat_buf.st_size, FILE_SIZE);
 		fail++;
 	}
 
-        if ((stat_buf.st_mode & MASK) != FILE_MODE) {
-		tst_resm(TINFO, "stat_buf.st_mode = %o expected %o",
-		         (stat_buf.st_mode & MASK), FILE_MODE);
+	if ((stat_buf.st_mode & MASK) != tc->mode) {
+		tst_res(TINFO, "stat_buf.st_mode = %o expected %o",
+			(stat_buf.st_mode & MASK), tc->mode);
 		fail++;
 	}
 
 	if (fail) {
-		tst_resm(TFAIL, "functionality of fstat incorrect");
+		tst_res(TFAIL, "functionality of stat(%s) incorrect",
+			tc->pathname);
 		return;
 	}
 
-	tst_resm(TPASS, "functionality of fstat correct");
+	tst_res(TPASS, "functionality of stat(%s) correct", tc->pathname);
 }
 
-int main(int ac, char **av)
+void setup(void)
 {
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
+	unsigned int i;
 
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++)
-		verify();
-
-	cleanup();
-	tst_exit();
-}
+	ltpuser = SAFE_GETPWNAM("nobody");
+	SAFE_SETUID(ltpuser->pw_uid);
 
-static void setup(void)
-{
-	struct passwd *ltpuser;
-	char tst_buff[BUF_SIZE];
-	int wbytes;
-	int write_len = 0;
-	int fd;
-
-	tst_require_root();
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	ltpuser = SAFE_GETPWNAM(NULL, "nobody");
-	SAFE_SETUID(NULL, ltpuser->pw_uid);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	umask(022);
-
-	fd = SAFE_OPEN(tst_rmdir, TESTFILE, O_WRONLY | O_CREAT, FILE_MODE);
-
-	/* Fill the test buffer with the known data */
-	memset(tst_buff, 'a', BUF_SIZE - 1);
-
-	/* Write to the file 1k data from the buffer */
-	while (write_len < FILE_SIZE) {
-		if ((wbytes = write(fd, tst_buff, sizeof(tst_buff))) <= 0)
-			tst_brkm(TBROK | TERRNO, cleanup, "write failed");
-		else
-			write_len += wbytes;
+	for (i = 0; i < ARRAY_SIZE(TC); i++) {
+		if (tst_fill_file(TC[i].pathname, 'a', 256, 4))
+			tst_brk(TBROK, "Failed to create tst file %s",
+				TC[i].pathname);
+		SAFE_CHMOD(TC[i].pathname, TC[i].mode);
 	}
 
-	SAFE_CLOSE(tst_rmdir, fd);
-
 	user_id = getuid();
 	group_id = getgid();
 }
 
-static void cleanup(void)
-{
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.tcnt = ARRAY_SIZE(TC),
+	.setup = setup,
+	.test = verify_stat,
+	.needs_root = 1,
+	.needs_tmpdir = 1,
+};
diff --git a/testcases/kernel/syscalls/stat/stat02.c b/testcases/kernel/syscalls/stat/stat02.c
deleted file mode 100644
index aeaa7ab82..000000000
--- a/testcases/kernel/syscalls/stat/stat02.c
+++ /dev/null
@@ -1,228 +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
- */
-
-/*
- * Test Name: stat02
- *
- * Test Description:
- *  Verify that, stat(2) succeeds to get the status of a file and fills the
- *  stat structure elements though process doesn't have read access to the
- *  file.
- *
- * Expected Result:
- *  stat() should return value 0 on success and the stat structure elements
- *  should be filled with specified 'file' information.
- *
- * Algorithm:
- *  Setup:
- *   Setup signal handling.
- *   Create temporary directory.
- *   Pause for SIGUSR1 if option specified.
- *
- *  Test:
- *   Loop if the proper options are given.
- *   Execute system call
- *   Check return code, if system call failed (return=-1)
- *   	Log the errno and Issue a FAIL message.
- *   Otherwise,
- *   	Verify the Functionality of system call
- *      if successful,
- *      	Issue Functionality-Pass message.
- *      Otherwise,
- *		Issue Functionality-Fail message.
- *  Cleanup:
- *   Print errno log and/or timing stats if options given
- *   Delete the temporary directory created.
- *
- * Usage:  <for command-line>
- *  stat02 [-c n] [-e] [-f] [-i n] [-I x] [-p x] [-t]
- *	where,  -c n : Run n copies concurrently.
- *		-e   : Turn on errno logging.
- *		-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 John George
- *		-Ported
- *
- * Restrictions:
- *
- */
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include <pwd.h>
-
-#include "test.h"
-#include "safe_macros.h"
-
-#define FILE_MODE	S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
-#define TESTFILE	"testfile"
-#define FILE_SIZE       1024
-#define BUF_SIZE	256
-#define NEW_MODE	0222
-#define MASK		0777
-
-char *TCID = "stat02";
-int TST_TOTAL = 1;
-
-uid_t user_id;			/* eff. user id/group id of test process */
-gid_t group_id;
-char nobody_uid[] = "nobody";
-struct passwd *ltpuser;
-
-void setup();
-void cleanup();
-
-int main(int ac, char **av)
-{
-	struct stat stat_buf;	/* stat structure buffer */
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/*
-		 * Call stat(2) to get the status of
-		 * specified 'file' into stat structure.
-		 */
-		TEST(stat(TESTFILE, &stat_buf));
-
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL,
-				 "stat(%s, &stat_buf) Failed, errno=%d : %s",
-				 TESTFILE, TEST_ERRNO, strerror(TEST_ERRNO));
-		} else {
-			stat_buf.st_mode &= ~S_IFREG;
-			/*
-			 * Verify the data returned by stat(2)
-			 * aganist the expected data.
-			 */
-			if ((stat_buf.st_uid != user_id) ||
-			    (stat_buf.st_gid != group_id) ||
-			    (stat_buf.st_size != FILE_SIZE) ||
-			    ((stat_buf.st_mode & MASK) != NEW_MODE)) {
-				tst_resm(TFAIL, "Functionality of "
-					 "stat(2) on '%s' Failed",
-					 TESTFILE);
-			} else {
-				tst_resm(TPASS, "Functionality of "
-					 "stat(2) on '%s' Succcessful",
-					 TESTFILE);
-			}
-		}
-		tst_count++;	/* incr TEST_LOOP counter */
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-/*
- * void
- * setup() -  Performs setup function for the test.
- *  Creat a temporary directory and change directory to it.
- *  Creat a testfile and write some data into it.
- *  Modify the mode permissions of testfile such that test process
- *  has read-only access to testfile.
- */
-void setup(void)
-{
-	int i, fd;		/* counter, file handle for file */
-	char tst_buff[BUF_SIZE];	/* data buffer for file */
-	int wbytes;		/* no. of bytes written to file */
-	int write_len = 0;
-
-	tst_require_root();
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	/* Switch to nobody user for correct error code collection */
-	ltpuser = getpwnam(nobody_uid);
-	if (setuid(ltpuser->pw_uid) == -1) {
-		tst_resm(TINFO, "setuid failed to "
-			 "to set the effective uid to %d", ltpuser->pw_uid);
-		perror("setuid");
-	}
-
-	/* Pause if that option was specified
-	 * TEST_PAUSE contains the code to fork the test with the -i option.
-	 * You want to make sure you do this before you create your temporary
-	 * directory.
-	 */
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	if ((fd = open(TESTFILE, O_RDWR | O_CREAT, FILE_MODE)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(%s, O_RDWR|O_CREAT, %#o) Failed, errno=%d : %s",
-			 TESTFILE, FILE_MODE, errno, strerror(errno));
-	}
-
-	/* Fill the test buffer with the known data */
-	for (i = 0; i < BUF_SIZE; i++) {
-		tst_buff[i] = 'a';
-	}
-
-	/* Write to the file 1k data from the buffer */
-	while (write_len < FILE_SIZE) {
-		if ((wbytes = write(fd, tst_buff, sizeof(tst_buff))) <= 0) {
-			tst_brkm(TBROK | TERRNO, cleanup, "write to %s failed",
-				 TESTFILE);
-		} else {
-			write_len += wbytes;
-		}
-	}
-
-	if (close(fd) == -1) {
-		tst_resm(TWARN | TERRNO, "closing %s failed", TESTFILE);
-	}
-
-	/* Modify mode permissions on the testfile */
-	SAFE_CHMOD(cleanup, TESTFILE, NEW_MODE);
-
-	/* Get the uid/gid of the process */
-	user_id = getuid();
-	group_id = getgid();
-
-}
-
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at
- *	       completion or premature exit.
- *  Remove the temporary directory and file created.
- */
-void cleanup(void)
-{
-
-	tst_rmdir();
-}
diff --git a/testcases/kernel/syscalls/stat/stat05.c b/testcases/kernel/syscalls/stat/stat05.c
deleted file mode 100644
index 300649ade..000000000
--- a/testcases/kernel/syscalls/stat/stat05.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.  Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: stat05.c,v 1.6 2009/11/02 13:57:19 subrata_modak Exp $ */
-/**********************************************************
- *
- *    OS Test - Silicon Graphics, Inc.
- *
- *    TEST IDENTIFIER	: stat05
- *
- *    EXECUTED BY	: anyone
- *
- *    TEST TITLE	: Basic test for stat(2)
- *
- *    PARENT DOCUMENT	: usctpl01
- *
- *    TEST CASE TOTAL	: 1
- *
- *    WALL CLOCK TIME	: 1
- *
- *    CPU TYPES		: ALL
- *
- *    AUTHOR		: William Roske
- *
- *    CO-PILOT		: Dave Fenner
- *
- *    DATE STARTED	: 03/30/92
- *
- *    INITIAL RELEASE	: UNICOS 7.0
- *
- *    TEST CASES
- *
- * 	1.) stat(2) returns...(See Description)
- *
- *    INPUT SPECIFICATIONS
- * 	The standard options for system call tests are accepted.
- *	(See the parse_opts(3) man page).
- *
- *    OUTPUT SPECIFICATIONS
- *$
- *    DURATION
- * 	Terminates - with frequency and infinite modes.
- *
- *    SIGNALS
- * 	Uses SIGUSR1 to pause before test if option set.
- * 	(See the parse_opts(3) man page).
- *
- *    RESOURCES
- * 	None
- *
- *    ENVIRONMENTAL NEEDS
- *      No run-time environmental needs.
- *
- *    SPECIAL PROCEDURAL REQUIREMENTS
- * 	None
- *
- *    INTERCASE DEPENDENCIES
- * 	None
- *
- *    DETAILED DESCRIPTION
- *	This is a Phase I test for the stat(2) system call.  It is intended
- *	to provide a limited exposure of the system call, for now.  It
- *	should/will be extended when full functional tests are written for
- *	stat(2).
- *
- * 	Setup:
- * 	  Setup signal handling.
- *	  Pause for SIGUSR1 if option specified.
- *
- * 	Test:
- *	 Loop if the proper options are given.
- * 	  Execute system call
- *	  Check return code, if system call failed (return=-1)
- *		Log the errno and Issue a FAIL message.
- *	  Otherwise, Issue a PASS message.
- *
- * 	Cleanup:
- * 	  Print errno log and/or timing stats if options given
- *
- *
- *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include "test.h"
-
-void setup();
-void cleanup();
-
-char *TCID = "stat05";
-int TST_TOTAL = 1;
-
-char fname[255];
-int fd;
-struct stat statter;
-
-int main(int ac, char **av)
-{
-	int lc;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		/*
-		 * Call stat(2) with F_CLRALF argument on fname
-		 */
-		TEST(stat(fname, &statter));
-
-		/* check return code */
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL, "stat(%s, &statter) failed", fname);
-		} else {
-			tst_resm(TPASS,
-				 "stat(%s, &statter) returned %ld",
-				 fname, TEST_RETURN);
-		}
-
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-/***************************************************************
- * setup() - performs all ONE TIME setup for this test.
- ***************************************************************/
-void setup(void)
-{
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	sprintf(fname, "tfile_%d", getpid());
-	if ((fd = open(fname, O_RDWR | O_CREAT, 0700)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(%s, O_RDWR|O_CREAT,0700) Failed, errno=%d : %s",
-			 fname, errno, strerror(errno));
-	}
-
-	if (close(fd) == -1) {
-		tst_resm(TWARN | TERRNO, "close(%s) failed", fname);
-	}
-}
-
-/***************************************************************
- * cleanup() - performs all ONE TIME cleanup for this test at
- *		completion or premature exit.
- ***************************************************************/
-void cleanup(void)
-{
-
-	tst_rmdir();
-}
-- 
2.18.1




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

* [LTP] [PATCH v2 2/2] syscalls/stat03, 06: Cleanup && Convert to new API
  2019-04-08  6:52     ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Yang Xu
@ 2019-04-08  6:52       ` Yang Xu
  2019-04-09 14:22         ` Cyril Hrubis
  2019-04-09 13:33       ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Cyril Hrubis
  1 sibling, 1 reply; 8+ messages in thread
From: Yang Xu @ 2019-04-08  6:52 UTC (permalink / raw)
  To: ltp

1) Take use of some safe macros
2) Remove duplicate tests stat06
3) Add ELOOP check
4) Remove useless struct member

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 runtest/quickhit                          |   2 -
 runtest/syscalls                          |   2 -
 testcases/kernel/syscalls/stat/.gitignore |   2 -
 testcases/kernel/syscalls/stat/stat03.c   | 354 ++++-----------------
 testcases/kernel/syscalls/stat/stat06.c   | 361 ----------------------
 5 files changed, 57 insertions(+), 664 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/stat/stat06.c

diff --git a/runtest/quickhit b/runtest/quickhit
index 31c571eaa..b13ce0887 100644
--- a/runtest/quickhit
+++ b/runtest/quickhit
@@ -223,8 +223,6 @@ signal03 signal03
 # and signal sending.
 sigrelse01 sigrelse01
 # Releasing held signals
-stat06 stat06
-# Negative tests for stat(2)
 statfs01 statfs01
 # Basic test for statfs(2) mounted filesys
 statvfs01 statvfs01
diff --git a/runtest/syscalls b/runtest/syscalls
index 9fa58f7f9..e8fe9785a 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1323,8 +1323,6 @@ stat03 stat03
 stat03_64 stat03_64
 stat04 symlink01 -T stat04
 stat04_64 symlink01 -T stat04_64
-stat06 stat06
-stat06_64 stat06_64
 
 statfs01 statfs01
 statfs01_64 statfs01_64
diff --git a/testcases/kernel/syscalls/stat/.gitignore b/testcases/kernel/syscalls/stat/.gitignore
index 0705df714..4a8f61858 100644
--- a/testcases/kernel/syscalls/stat/.gitignore
+++ b/testcases/kernel/syscalls/stat/.gitignore
@@ -2,5 +2,3 @@
 /stat01_64
 /stat03
 /stat03_64
-/stat06
-/stat06_64
diff --git a/testcases/kernel/syscalls/stat/stat03.c b/testcases/kernel/syscalls/stat/stat03.c
index 2e4c83a93..20d4c772f 100644
--- a/testcases/kernel/syscalls/stat/stat03.c
+++ b/testcases/kernel/syscalls/stat/stat03.c
@@ -1,333 +1,93 @@
-/*
- *
- *   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
- */
-
-/*
- * Test Name: stat03
- *
- * Test Description:
- *   Verify that,
- *   1) stat(2) returns -1 and sets errno to EACCES if search permission is
- *      denied on a component of the path prefix.
- *   2) stat(2) returns -1 and sets errno to ENOENT if the specified file
- *	does not exists or empty string.
- *   3) stat(2) returns -1 and sets errno to EFAULT if pathname points
- *	outside user's accessible address space.
- *   4) stat(2) returns -1 and sets errno to ENAMETOOLONG if the pathname
- *	component is too long.
- *   5) stat(2) returns -1 and sets errno to ENOTDIR if the directory
- *	component in pathname is not a directory.
- *
- * Expected Result:
- *  stat() should fail with return value -1 and set expected errno.
- *
- * Algorithm:
- *  Setup:
- *   Setup signal handling.
- *   Create temporary directory.
- *   Pause for SIGUSR1 if option specified.
- *
- *  Test:
- *   Loop if the proper options are given.
- *   Execute system call
- *   Check return code, if system call failed (return=-1)
- *   	if errno set == expected errno
- *   		Issue sys call fails with expected return value and errno.
- *   	Otherwise,
- *		Issue sys call fails with unexpected errno.
- *   Otherwise,
- *	Issue sys call returns unexpected value.
- *
- *  Cleanup:
- *   Print errno log and/or timing stats if options given
- *   Delete the temporary directory(s)/file(s) created.
- *
- * Usage:  <for command-line>
- *  stat03 [-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.
- *
- * History
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* Copyright (c) International Business Machines  Corp., 2001
  *	07/2001 John George
  *		-Ported
  *
- * Restrictions:
- *
+ * check stat() with various error conditions that should produce
+ * EACCES, EFAULT, ENAMETOOLONG,  ENOENT, ENOTDIR, ELOOP
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
-#include <string.h>
-#include <signal.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/mman.h>
 #include <pwd.h>
+#include "tst_test.h"
 
-#include "test.h"
-#include "safe_macros.h"
+#define TST_EACCES_DIR   "tst_eaccesdir"
+#define TST_EACCES_FILE  "tst_eaccesdir/tst"
+#define TST_ENOENT       "tst_enoent/tst"
+#define TST_ENOTDIR_DIR  "tst_enotdir/tst"
+#define TST_ENOTDIR_FILE "tst_enotdir"
 
-#define MODE_RWX	S_IRWXU | S_IRWXG | S_IRWXO
-#define FILE_MODE	S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
-#define DIR_TEMP	"testdir_1"
-#define TEST_FILE1	"testdir_1/tfile_1"
-#define TEST_FILE2	"t_file/tfile_2"
+#define MODE_RW	        0666
+#define DIR_MODE        0755
 
-int no_setup();
-int setup1();			/* setup function to test chmod for EACCES */
-int setup2();			/* setup function to test chmod for ENOTDIR */
-int longpath_setup();		/* setup function to test chmod for ENAMETOOLONG */
-char nobody_uid[] = "nobody";
 struct passwd *ltpuser;
 
-char Longpathname[PATH_MAX + 2];
+static char long_dir[PATH_MAX + 2] = {[0 ... PATH_MAX + 1] = 'a'};
+static char loop_dir[PATH_MAX] = ".";
 
-struct test_case_t {		/* test case struct. to hold ref. test cond's */
+static struct tcase{
 	char *pathname;
-	char *desc;
 	int exp_errno;
-	int (*setupfunc) ();
-} Test_cases[] = {
-	{TEST_FILE1, "No Search permissions to process", EACCES, setup1}, {
-	NULL, "Invalid address", EFAULT, no_setup}, {
-	Longpathname, "Pathname too long", ENAMETOOLONG, longpath_setup}, {
-	"", "Pathname is empty", ENOENT, no_setup}, {
-	TEST_FILE2, "Path contains regular file", ENOTDIR, setup2}, {
-	NULL, NULL, 0, no_setup}
+} TC[] = {
+	{TST_EACCES_FILE, EACCES},
+	{NULL, EFAULT},
+	{long_dir, ENAMETOOLONG},
+	{TST_ENOENT, ENOENT},
+	{TST_ENOTDIR_DIR, ENOTDIR},
+	{loop_dir, ELOOP}
 };
 
-char *TCID = "stat03";
-int TST_TOTAL = ARRAY_SIZE(Test_cases);
-
-void setup();			/* Main setup function for the tests */
-void cleanup();			/* cleanup function for the test */
-
-int main(int ac, char **av)
-{
-	struct stat stat_buf;	/* stat structure buffer */
-	int lc;
-	char *file_name;	/* ptr. for file name whose mode is modified */
-	char *test_desc;	/* test specific error message */
-	int ind;		/* counter to test different test conditions */
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	/*
-	 * Invoke setup function to call individual test setup functions
-	 * to simulate test conditions.
-	 */
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-			file_name = Test_cases[ind].pathname;
-			test_desc = Test_cases[ind].desc;
-
-			/*
-			 * Call stat(2) to test different test conditions.
-			 * verify that it fails with -1 return value and
-			 * sets appropriate errno.
-			 */
-			TEST(stat(file_name, &stat_buf));
-
-			/* Check return code from stat(2) */
-			if (TEST_RETURN == -1) {
-				if (TEST_ERRNO == Test_cases[ind].exp_errno) {
-					tst_resm(TPASS,
-						 "stat() fails, %s, errno:%d",
-						 test_desc, TEST_ERRNO);
-				} else {
-					tst_resm(TFAIL,
-						 "stat() fails, %s, errno:%d, expected errno:%d",
-						 test_desc, TEST_ERRNO,
-						 Test_cases[ind].exp_errno);
-				}
-			} else {
-				tst_resm(TFAIL,
-					 "stat(2) returned %ld, expected -1, errno:%d",
-					 TEST_RETURN,
-					 Test_cases[ind].exp_errno);
-			}
-		}
-		tst_count++;	/* incr TEST_LOOP counter */
-	}
-
-	/*
-	 * Invoke cleanup() to delete the test directory/file(s) created
-	 * in the setup().
-	 */
-	cleanup();
-	tst_exit();
-
-}
-
-/*
- * void
- * setup(void) - performs all ONE TIME setup for this test.
- * 	Exit the test program on receipt of unexpected signals.
- *	Create a temporary directory and change directory to it.
- *	Invoke individual test setup functions according to the order
- *	set in struct. definition.
- */
-void setup(void)
+static void verify_stat(unsigned int n)
 {
-	int ind;
-
-	tst_require_root();
+	struct tcase *tc = TC + n;
+	struct stat stat_buf;
 
-	/* Capture unexpected signals */
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
-	/* Switch to nobody user for correct error code collection */
-	ltpuser = getpwnam(nobody_uid);
-	if (setuid(ltpuser->pw_uid) == -1) {
-		tst_resm(TINFO, "setuid failed to "
-			 "to set the effective uid to %d", ltpuser->pw_uid);
-		perror("setuid");
+	TEST(stat(tc->pathname, &stat_buf));
+	if (TST_RET != -1) {
+		tst_res(TFAIL, "stat() succeeded unexpectedly");
+		return;
 	}
 
-	/* Pause if that option was specified
-	 * TEST_PAUSE contains the code to fork the test with the -i option.
-	 * You want to make sure you do this before you create your temporary
-	 * directory.
-	 */
-	TEST_PAUSE;
-
-	/* Make a temp dir and cd to it */
-	tst_tmpdir();
-
-	/* call individual setup functions */
-	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-		if (!Test_cases[ind].pathname)
-			Test_cases[ind].pathname = tst_get_bad_addr(cleanup);
-		Test_cases[ind].setupfunc();
+	if (TST_ERR == tc->exp_errno) {
+		tst_res(TPASS | TTERRNO, "stat() failed as expected");
+	} else {
+		tst_res(TFAIL | TTERRNO,
+			"stat() failed unexpectedly; expected: %d - %s",
+			tc->exp_errno, tst_strerrno(tc->exp_errno));
 	}
 }
 
-/*
- * int
- * no_setup() - Some test conditions for stat(2) do not any setup.
- *              Hence, this function just returns 0.
- *  This function simply returns 0.
- */
-int no_setup(void)
+static void setup(void)
 {
-	return 0;
-}
+	unsigned int i;
 
-/*
- * int
- * setup1() - setup function for a test condition for which stat(2)
- *	      returns -1 and sets errno to EACCES.
- *  Create a test directory under temporary directory and create a test file
- *  under this directory with mode "0666" permissions.
- *  Modify the mode permissions on test directory such that process will not
- *  have search permissions on test directory.
- *
- *  The function returns 0.
- */
-int setup1(void)
-{
-	int fd;			/* file handle for testfile */
+	ltpuser = SAFE_GETPWNAM("nobody");
+	SAFE_SETUID(ltpuser->pw_uid);
 
-	/* Creat a test directory */
-	SAFE_MKDIR(cleanup, DIR_TEMP, MODE_RWX);
+	SAFE_MKDIR(TST_EACCES_DIR, DIR_MODE);
+	SAFE_TOUCH(TST_EACCES_FILE, DIR_MODE, NULL);
+	SAFE_CHMOD(TST_EACCES_DIR, MODE_RW);
 
-	/* Creat a test file under above test directory */
-	if ((fd = open(TEST_FILE1, O_RDWR | O_CREAT, 0666)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(%s, O_RDWR|O_CREAT, 0666) failed, errno=%d : %s",
-			 TEST_FILE1, errno, strerror(errno));
+	for (i = 0; i < ARRAY_SIZE(TC); i++) {
+		if (TC[i].exp_errno == EFAULT)
+			TC[i].pathname = tst_get_bad_addr(NULL);
 	}
-	/* Close the test file */
-	SAFE_CLOSE(cleanup, fd);
-
-	/* Modify mode permissions on test directory */
-	SAFE_CHMOD(cleanup, DIR_TEMP, FILE_MODE);
-	return 0;
-}
 
-/*
- * int
- * setup2() - setup function for a test condition for which stat(2)
- *	     returns -1 and sets errno to ENOTDIR.
- *
- *  Create a test file under temporary directory so that test tries to
- *  change mode of a testfile "tfile_2" under "t_file" which happens to be
- *  another regular file.
- */
-int setup2(void)
-{
-	int fd;			/* File handle for test file */
+	SAFE_TOUCH(TST_ENOTDIR_FILE, DIR_MODE, NULL);
 
-	/* Creat a test file under temporary directory */
-	if ((fd = open("t_file", O_RDWR | O_CREAT, MODE_RWX)) == -1) {
-		tst_brkm(TBROK, cleanup,
-			 "open(2) on t_file failed, errno=%d : %s",
-			 errno, strerror(errno));
-	}
-	/* Close the test file created above */
-	SAFE_CLOSE(cleanup, fd);
-	return 0;
-}
-
-/*
- * int
- * longpath_setup() - setup to create a node with a name length exceeding
- *                    the MAX. length of PATH_MAX.
- *   This function retruns 0.
- */
-int longpath_setup(void)
-{
-	int ind;		/* counter variable */
-
-	for (ind = 0; ind <= (PATH_MAX + 1); ind++) {
-		Longpathname[ind] = 'a';
-	}
-	return 0;
+	SAFE_MKDIR("test_eloop", DIR_MODE);
+	SAFE_SYMLINK("../test_eloop", "test_eloop/test_eloop");
+	for (i = 0; i < 43; i++)
+		strcat(loop_dir, "/test_eloop");
 }
 
-/*
- * void
- * cleanup() - Performs all ONE TIME cleanup for this test at
- *             completion or premature exit.
- *	Print test timing stats and errno log if test executed with options.
- *	Remove temporary directory and sub-directories/files under it
- *	created during setup().
- *	Exit the test program with normal exit code.
- */
-void cleanup(void)
-{
-
-	/* Restore mode permissions on test directory created in setup2() */
-	if (chmod(DIR_TEMP, MODE_RWX) < 0) {
-		tst_brkm(TFAIL, NULL, "chmod(2) of %s failed", DIR_TEMP);
-	}
-
-	tst_rmdir();
-}
+static struct tst_test test = {
+	.tcnt = ARRAY_SIZE(TC),
+	.needs_tmpdir = 1,
+	.needs_root = 1,
+	.setup = setup,
+	.test = verify_stat,
+};
diff --git a/testcases/kernel/syscalls/stat/stat06.c b/testcases/kernel/syscalls/stat/stat06.c
deleted file mode 100644
index c5eb1da82..000000000
--- a/testcases/kernel/syscalls/stat/stat06.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.  Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/* $Id: stat06.c,v 1.10 2009/11/02 13:57:19 subrata_modak Exp $ */
-/**********************************************************
- *
- *    OS Test - Silicon Graphics, Inc.
- *
- *    TEST IDENTIFIER	: stat06
- *
- *    EXECUTED BY	: anyone
- *
- *    TEST TITLE	: stat(2) negative path testcases
- *
- *    PARENT DOCUMENT	: None
- *
- *    TEST CASE TOTAL	: 7
- *
- *    WALL CLOCK TIME	: 1
- *
- *    CPU TYPES		: ALL
- *
- *    AUTHOR		: Richard Logan
- *
- *    CO-PILOT		: William Roske
- *
- *    DATE STARTED	: 03/30/94
- *
- *    INITIAL RELEASE	: UNICOS 7.0
- *
- *    TEST CASES
- *
- * 	1-7) See Testcases structure below.
- *
- *    INPUT SPECIFICATIONS
- * 	The standard options for system call tests are accepted.
- *	(See the parse_opts(3) man page).
- *      -h  : print help and exit
- *
- *    OUTPUT SPECIFICATIONS
- *$
- *    DURATION
- * 	Terminates - with frequency and infinite modes.
- *
- *    SIGNALS
- * 	Uses SIGUSR1 to pause before test if option set.
- * 	(See the parse_opts(3) man page).
- *
- *    RESOURCES
- * 	None
- *
- *    ENVIRONMENTAL NEEDS
- * 	The libcuts.a and libsys.a libraries must be included in
- *	the compilation of this test.
- *
- *    SPECIAL PROCEDURAL REQUIREMENTS
- * 	None
- *
- *    INTERCASE DEPENDENCIES
- * 	None
- *
- *    DETAILED DESCRIPTION
- *	This is a Phase I test for the stat(2) system call.  It is intended
- *	to provide a limited exposure of the system call, for now.  It
- *	should/will be extended when full functional tests are written for
- *	stat(2).
- *
- * 	Setup:
- * 	  Setup signal handling.
- *	  Pause for SIGUSR1 if option specified.
- *
- * 	Test:
- *	 Loop if the proper options are given.
- * 	  Execute system call
- *	  Check return code, if system call failed (return=-1)
- *		Log the errno and Issue a FAIL message.
- *	  Otherwise, Issue a PASS message.
- *
- * 	Cleanup:
- * 	  Print errno log and/or timing stats if options given
- *
- *
- *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <unistd.h>
-#include "test.h"
-
-void setup();
-void cleanup();
-
-char *TCID = "stat06";
-
-char *bad_addr = 0;
-
-#if !defined(UCLINUX)
-int high_address_setup();
-char High_address[64];
-#endif
-int longpath_setup();
-int no_setup();
-int filepath_setup();
-char Longpathname[PATH_MAX + 2];
-struct stat statbuf;
-jmp_buf sig11_recover;
-void sig11_handler(int sig);
-
-struct test_case_t {
-	char *pathname;
-	struct stat *stbuf;
-	char *desc;
-	int exp_errno;
-	int (*setupfunc) ();
-} Test_cases[] = {
-	{
-	"nonexistfile", &statbuf, "non-existent file", ENOENT, no_setup}, {
-	"", &statbuf, "path is empty string", ENOENT, no_setup}, {
-	"nefile/file", &statbuf, "path contains a non-existent file",
-		    ENOENT, no_setup}, {
-	"file/file", &statbuf, "path contains a regular file",
-		    ENOTDIR, filepath_setup}, {
-	Longpathname, &statbuf, "pathname too long", ENAMETOOLONG,
-		    longpath_setup},
-#if !defined(UCLINUX)
-	{
-	High_address, &statbuf, "address beyond address space", EFAULT,
-		    high_address_setup}, {
-	(char *)-1, &statbuf, "negative address", EFAULT, no_setup},
-#endif
-	{
-	NULL, NULL, NULL, 0, no_setup}
-};
-
-int TST_TOTAL = ARRAY_SIZE(Test_cases);
-
-/***********************************************************************
- * Main
- ***********************************************************************/
-int main(int ac, char **av)
-{
-	int lc;
-	char *fname;
-	char *desc;
-	int ind;
-	struct stat *stbuf;
-	struct sigaction sa, osa;
-
-    /***************************************************************
-     * parse standard options
-     ***************************************************************/
-	tst_parse_opts(ac, av, NULL, NULL);
-
-    /***************************************************************
-     * perform global setup for test
-     ***************************************************************/
-	setup();
-
-    /***************************************************************
-     * check looping state if -c option given
-     ***************************************************************/
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-
-			fname = Test_cases[ind].pathname;
-			desc = Test_cases[ind].desc;
-			stbuf = Test_cases[ind].stbuf;
-
-			if (stbuf == (struct stat *)-1) {
-				/* special sig11 case */
-				sa.sa_handler = &sig11_handler;
-				sigemptyset(&sa.sa_mask);
-				sa.sa_flags = 0;
-
-				sigaction(SIGSEGV, NULL, &osa);
-				sigaction(SIGSEGV, &sa, NULL);
-
-				if (setjmp(sig11_recover)) {
-					TEST_RETURN = -1;
-					TEST_ERRNO = EFAULT;
-				} else {
-					TEST(stat(fname, stbuf));
-				}
-				sigaction(SIGSEGV, &osa, NULL);
-			} else {
-				/*
-				 *  Call stat(2)
-				 */
-
-				TEST(stat(fname, stbuf));
-			}
-
-			/* check return code */
-			if (TEST_RETURN == -1) {
-				if (TEST_ERRNO ==
-				    Test_cases[ind].exp_errno)
-					tst_resm(TPASS,
-						 "stat(<%s>, &stbuf) Failed, errno=%d",
-						 desc, TEST_ERRNO);
-				else
-					tst_resm(TFAIL,
-						 "stat(<%s>, &stbuf) Failed, errno=%d, expected errno:%d",
-						 desc, TEST_ERRNO,
-						 Test_cases
-						 [ind].exp_errno);
-			} else {
-				tst_resm(TFAIL,
-					 "stat(<%s>, &stbuf) returned %ld, expected -1, errno:%d",
-					 desc, TEST_RETURN,
-					 Test_cases[ind].exp_errno);
-			}
-		}
-
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-/***************************************************************
- * setup() - performs all ONE TIME setup for this test.
- ***************************************************************/
-void setup(void)
-{
-	int ind;
-
-	tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-#if !defined(UCLINUX)
-	bad_addr = mmap(0, 1, PROT_NONE,
-			MAP_PRIVATE_EXCEPT_UCLINUX | MAP_ANONYMOUS, 0, 0);
-	if (bad_addr == MAP_FAILED) {
-		tst_brkm(TBROK, cleanup, "mmap failed");
-	}
-	Test_cases[6].pathname = bad_addr;
-#endif
-
-	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-		Test_cases[ind].setupfunc();
-	}
-
-}
-
-/***************************************************************
- * cleanup() - performs all ONE TIME cleanup for this test at
- *		completion or premature exit.
- ***************************************************************/
-void cleanup(void)
-{
-
-	tst_rmdir();
-
-}
-
-/******************************************************************
- * no_setup() - does nothing
- ******************************************************************/
-int no_setup(void)
-{
-	return 0;
-}
-
-#if !defined(UCLINUX)
-
-/******************************************************************
- * high_address_setup() - generates an address that should cause a segfault
- ******************************************************************/
-int high_address_setup(void)
-{
-	int ind;
-
-	for (ind = 0; Test_cases[ind].desc != NULL; ind++) {
-		if (Test_cases[ind].pathname == High_address) {
-			/*if (strcmp(Test_cases[ind].pathname, HIGH_ADDRESS) == 0) { ** */
-			Test_cases[ind].pathname = (char *)(sbrk(0) + 5);
-			break;
-		}
-	}
-	return 0;
-
-}
-#endif
-
-/******************************************************************
- * longpath_setup() - creates a filename that is too long
- ******************************************************************/
-int longpath_setup(void)
-{
-	int ind;
-
-	for (ind = 0; ind <= PATH_MAX + 1; ind++) {
-		Longpathname[ind] = 'a';
-	}
-	return 0;
-
-}
-
-/******************************************************************
- * filepath_setup() creates a file the exists that we will treat as a directory
- ******************************************************************/
-int filepath_setup(void)
-{
-	int fd;
-
-	if ((fd = creat("file", 0777)) == -1) {
-		tst_brkm(TBROK, cleanup, "creat(file) failed, errno:%d %s",
-			 errno, strerror(errno));
-	}
-	close(fd);
-	return 0;
-}
-
-/******************************************************************
- * sig11_handler() - our segfault recover hack
- ******************************************************************/
-void sig11_handler(int sig)
-{
-	longjmp(sig11_recover, 1);
-}
-- 
2.18.1




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

* [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API
  2019-04-08  6:52     ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Yang Xu
  2019-04-08  6:52       ` [LTP] [PATCH v2 2/2] syscalls/stat03, 06: " Yang Xu
@ 2019-04-09 13:33       ` Cyril Hrubis
  1 sibling, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2019-04-09 13:33 UTC (permalink / raw)
  To: ltp

Hi!
Pushed with small simplification, thanks.

diff --git a/testcases/kernel/syscalls/stat/stat01.c b/testcases/kernel/syscalls/stat/stat01.c
index 437ce0cf8..14f1036d5 100644
--- a/testcases/kernel/syscalls/stat/stat01.c
+++ b/testcases/kernel/syscalls/stat/stat01.c
@@ -48,36 +48,31 @@ static void verify_stat(unsigned int n)
 	}
 
 	if (stat_buf.st_uid != user_id) {
-		tst_res(TINFO, "stat_buf.st_uid = %i expected %i",
+		tst_res(TFAIL, "stat_buf.st_uid = %i expected %i",
 			stat_buf.st_uid, user_id);
 		fail++;
 	}
 
 	if (stat_buf.st_gid != group_id) {
-		tst_res(TINFO, "stat_buf.st_gid = %i expected %i",
+		tst_res(TFAIL, "stat_buf.st_gid = %i expected %i",
 			stat_buf.st_gid, group_id);
 		fail++;
 	}
 
 	if (stat_buf.st_size != FILE_SIZE) {
-		tst_res(TINFO, "stat_buf.st_size = %li expected %i",
+		tst_res(TFAIL, "stat_buf.st_size = %li expected %i",
 			(long)stat_buf.st_size, FILE_SIZE);
 		fail++;
 	}
 
 	if ((stat_buf.st_mode & MASK) != tc->mode) {
-		tst_res(TINFO, "stat_buf.st_mode = %o expected %o",
+		tst_res(TFAIL, "stat_buf.st_mode = %o expected %o",
 			(stat_buf.st_mode & MASK), tc->mode);
 		fail++;
 	}
 
-	if (fail) {
-		tst_res(TFAIL, "functionality of stat(%s) incorrect",
-			tc->pathname);
-		return;
-	}
-
-	tst_res(TPASS, "functionality of stat(%s) correct", tc->pathname);
+	if (!fail)
+		tst_res(TPASS, "stat(%s)", tc->pathname);
 }
 
 void setup(void)

-- 
Cyril Hrubis
chrubis@suse.cz

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

* [LTP] [PATCH v2 2/2] syscalls/stat03, 06: Cleanup && Convert to new API
  2019-04-08  6:52       ` [LTP] [PATCH v2 2/2] syscalls/stat03, 06: " Yang Xu
@ 2019-04-09 14:22         ` Cyril Hrubis
  0 siblings, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2019-04-09 14:22 UTC (permalink / raw)
  To: ltp

Hi!
Pushed, thanks.

-- 
Cyril Hrubis
chrubis@suse.cz

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

end of thread, other threads:[~2019-04-09 14:22 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-03  8:29 [LTP] [PATCH 1/2] syscalls/stat01, 02, 05: Cleanup && Convert to new API Yang Xu
2019-04-03  8:29 ` [LTP] [PATCH 2/2] syscalls/stat03, 06: " Yang Xu
2019-04-04 13:19   ` Cyril Hrubis
2019-04-08  6:52     ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Yang Xu
2019-04-08  6:52       ` [LTP] [PATCH v2 2/2] syscalls/stat03, 06: " Yang Xu
2019-04-09 14:22         ` Cyril Hrubis
2019-04-09 13:33       ` [LTP] [PATCH v2 1/2] syscalls/stat01, 02, 05: " Cyril Hrubis
2019-04-04 12:58 ` [LTP] [PATCH " Cyril Hrubis

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.