[LTP] [PATCH] syscalls/fchmodat_01: Convert to new API

Cyril Hrubis chrubis@suse.cz
Fri Jan 28 16:50:00 CET 2022


Hi!
>  char pathname[256];
>  char testfile[256];
>  char testfile2[256];
>  char testfile3[256];
> -int fds[TEST_CASES];
> -char *filenames[TEST_CASES];
> -int expected_errno[TEST_CASES] = { 0, 0, ENOTDIR, EBADF, 0, 0 };
> +int expected_errno[6] = { 0, 0, ENOTDIR, EBADF, 0, 0 };
> +int fds[ARRAY_SIZE(expected_errno)];
> +char *filenames[ARRAY_SIZE(expected_errno)];

We usually pack the syscall parameters into a tcase structure, which is
much easier to read and modify:

...
static int dir_at_fdcwd = AT_FDCWD;
static int file_fd;
static char testfile1[PATH_MAX];

static struct tcase {
	int *dir_fd;
	char filename;
	mode_t mode;
	int exp_err;
} tcases[] = {
	...
	{&file_fd, testfile1, 0600, ENOTDIR},
	...
};

>  int myfchmodat(int dirfd, const char *filename, mode_t mode)
>  {
> -	return ltp_syscall(__NR_fchmodat, dirfd, filename, mode);
> +	return tst_syscall(__NR_fchmodat, dirfd, filename, mode);
>  }

This function is now unused.

> -int main(int ac, char **av)
> +static void verify_fchmodat(unsigned int i)
>  {
> -	int lc;
> -	int i;
> -
> -	/* Disable test if the version of the kernel is less than 2.6.16 */
> -	if ((tst_kvercmp(2, 6, 16)) < 0) {
> -		tst_resm(TWARN, "This test can only run on kernels that are ");
> -		tst_resm(TWARN, "2.6.16 and higher");
> -		exit(0);
> -	}
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -		tst_count = 0;
> -
> -		for (i = 0; i < TST_TOTAL; i++) {
> -			TEST(myfchmodat(fds[i], filenames[i], 0600));
> -
> -			if (TEST_ERRNO == expected_errno[i]) {
> -				tst_resm(TPASS,
> -					 "fchmodat() returned the expected  errno %d: %s",
> -					 TEST_ERRNO, strerror(TEST_ERRNO));
> -			} else {
> -				tst_resm(TFAIL,
> -					 "fchmodat() Failed, errno=%d : %s",
> -					 TEST_ERRNO, strerror(TEST_ERRNO));
> -			}
> -		}
> +	TEST(tst_syscall(__NR_fchmodat, fds[i], filenames[i], 0600));
> +
> +	if (TST_ERR == expected_errno[i]) {
> +		tst_res(TPASS,
> +			 "fchmodat() returned the expected  errno %d: %s",
> +			 TST_ERR, strerror(TST_ERR));
> +	} else {
> +		tst_res(TFAIL,
> +			 "fchmodat() Failed, errno=%d : %s",
> +			 TST_ERR, strerror(TST_ERR));
>  	}

Ideally the test should be split into two testcases. One for the error
tests and one for the functionality test so that we can use
TST_EXP_PASS() and TST_EXP_FAIL().

> -	cleanup();
> -	tst_exit();
>  }
> 
> -void setup(void)
> +static void setup(void)
>  {
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> -
> -	tst_tmpdir();
> -
>  	/* Initialize test dir and file names */
>  	char *abs_path = tst_get_tmpdir();
>  	int p = getpid();
> @@ -122,31 +65,36 @@ void setup(void)
> 
>  	free(abs_path);
> 
> -	SAFE_MKDIR(cleanup, pathname, 0700);
> +	SAFE_MKDIR(pathname, 0700);
> 
> -	fds[0] = SAFE_OPEN(cleanup, pathname, O_DIRECTORY);
> +	fds[0] = SAFE_OPEN(pathname, O_DIRECTORY);
>  	fds[1] = fds[4] = fds[0];
> 
> -	SAFE_FILE_PRINTF(cleanup, testfile, "%s", testfile);
> -	SAFE_FILE_PRINTF(cleanup, testfile2, "%s", testfile2);
> +	SAFE_FILE_PRINTF(testfile, "%s", testfile);
> +	SAFE_FILE_PRINTF(testfile2, "%s", testfile2);
> 
> -	fds[2] = SAFE_OPEN(cleanup, testfile3, O_CREAT | O_RDWR, 0600);
> +	fds[2] = SAFE_OPEN(testfile3, O_CREAT | O_RDWR, 0600);
>  	fds[3] = 100;
>  	fds[5] = AT_FDCWD;
> 
>  	filenames[0] = filenames[2] = filenames[3] = filenames[4] = testfile;
>  	filenames[1] = testfile2;
>  	filenames[5] = testfile3;
> -
> -	TEST_PAUSE;
>  }
> 
> -void cleanup(void)
> +static void cleanup(void)
>  {
>  	if (fds[0] > 0)
>  		close(fds[0]);
>  	if (fds[2] > 0)
>  		close(fds[2]);
> -
> -	tst_rmdir();
>  }
> +
> +static struct tst_test test = {
> +	.min_kver = "2.6.16",
> +	.tcnt = ARRAY_SIZE(expected_errno),
> +	.test = verify_fchmodat,
> +	.setup = setup,
> +	.cleanup = cleanup,
> +	.needs_tmpdir = 1,
> +};
> --
> 2.20.1
> 
> 
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list