[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