Message ID | 20240126062540.2596279-1-ruansy.fnst@fujitsu.com |
---|---|
State | New |
Headers | show |
Series | [1/2] fchownat01: Convert to new API | expand |
ping 在 2024/1/26 14:25, Shiyang Ruan 写道: > Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> > --- > .../kernel/syscalls/fchownat/fchownat01.c | 154 ++++++------------ > 1 file changed, 49 insertions(+), 105 deletions(-) > > diff --git a/testcases/kernel/syscalls/fchownat/fchownat01.c b/testcases/kernel/syscalls/fchownat/fchownat01.c > index 7771c111a..1a5b66d99 100644 > --- a/testcases/kernel/syscalls/fchownat/fchownat01.c > +++ b/testcases/kernel/syscalls/fchownat/fchownat01.c > @@ -1,133 +1,77 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > /* > - * Copyright (c) International Business Machines Corp., 2006 > - * AUTHOR: Yi Yang <yyangcdl@cn.ibm.com> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See > - * the GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software Foundation, > - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Copyright (c) International Business Machines Corp., 2006 > + * Copyright (c) Linux Test Project, 2007-2024 > */ > -/* > - * DESCRIPTION > - * This test case will verify basic function of fchownat > - * added by kernel 2.6.16 or up. > + > +/*\ > + * [Description] > + * > + * Verify basic function of fchownat() added by kernel 2.6.16 or up. > */ > > #define _GNU_SOURCE > - > -#include <sys/types.h> > -#include <sys/stat.h> > -#include <unistd.h> > -#include <stdlib.h> > -#include <errno.h> > -#include <string.h> > -#include <signal.h> > - > -#include "test.h" > -#include "safe_macros.h" > -#include "lapi/fcntl.h" > +#include "tst_test.h" > > #define TESTFILE "testfile" > - > -static void setup(void); > -static void cleanup(void); > +#define TESTFILE2 "testfile2" > > static int dir_fd; > static int fd; > static int no_fd = -1; > static int cu_fd = AT_FDCWD; > > -static struct test_case_t { > +static struct tcase { > int exp_ret; > int exp_errno; > int flag; > - int *fds; > - char *filenames; > -} test_cases[] = { > - {0, 0, 0, &dir_fd, TESTFILE}, > - {-1, ENOTDIR, 0, &fd, TESTFILE}, > - {-1, EBADF, 0, &no_fd, TESTFILE}, > - {-1, EINVAL, 9999, &dir_fd, TESTFILE}, > - {0, 0, 0, &cu_fd, TESTFILE}, > + int *fd; > + char *filename; > +} tcases[] = { > + { 0, 0, 0, &dir_fd, TESTFILE }, > + { 0, 0, 0, &cu_fd, TESTFILE }, > + { -1, ENOTDIR, 0, &fd, TESTFILE }, > + { -1, EBADF, 0, &no_fd, TESTFILE }, > + { -1, EINVAL, 9999, &dir_fd, TESTFILE }, > }; > > -char *TCID = "fchownat01"; > -int TST_TOTAL = ARRAY_SIZE(test_cases); > -static void fchownat_verify(const struct test_case_t *); > - > -int main(int ac, char **av) > +static void fchownat_verify(unsigned int n) > { > - int lc; > - int i; > - > - 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++) > - fchownat_verify(&test_cases[i]); > - } > - > - cleanup(); > - tst_exit(); > + struct tcase *tc = &tcases[n]; > + uid_t euid = geteuid(); > + gid_t egid = getegid(); > + int fd = *tc->fd; > + int flag = tc->flag; > + const char *filename = tc->filename; > + > + if (tc->exp_ret == 0) > + TST_EXP_PASS(fchownat(fd, filename, euid, egid, flag), > + "fchownat(%d, %s, %d, %d, %d)", > + fd, filename, euid, egid, flag); > + else > + TST_EXP_FAIL(fchownat(fd, filename, euid, egid, flag), > + tc->exp_errno, > + "fchownat(%d, %s, %d, %d, %d)", > + fd, filename, euid, egid, flag); > } > > static void setup(void) > { > - tst_sig(NOFORK, DEF_HANDLER, cleanup); > - > - TEST_PAUSE; > - > - tst_tmpdir(); > - > - dir_fd = SAFE_OPEN(cleanup, "./", O_DIRECTORY); > - > - SAFE_TOUCH(cleanup, TESTFILE, 0600, NULL); > - > - fd = SAFE_OPEN(cleanup, "testfile2", O_CREAT | O_RDWR, 0600); > -} > - > -static void fchownat_verify(const struct test_case_t *test) > -{ > - TEST(fchownat(*(test->fds), test->filenames, geteuid(), > - getegid(), test->flag)); > - > - if (TEST_RETURN != test->exp_ret) { > - tst_resm(TFAIL | TTERRNO, > - "fchownat() returned %ld, expected %d, errno=%d", > - TEST_RETURN, test->exp_ret, test->exp_errno); > - return; > - } > - > - if (TEST_ERRNO == test->exp_errno) { > - tst_resm(TPASS | TTERRNO, > - "fchownat() returned the expected errno %d: %s", > - test->exp_ret, strerror(test->exp_errno)); > - } else { > - tst_resm(TFAIL | TTERRNO, > - "fchownat() failed unexpectedly; expected: %d - %s", > - test->exp_errno, strerror(test->exp_errno)); > - } > + dir_fd = SAFE_OPEN("./", O_DIRECTORY); > + SAFE_TOUCH(TESTFILE, 0600, NULL); > + fd = SAFE_OPEN(TESTFILE2, O_CREAT | O_RDWR, 0600); > } > > static void cleanup(void) > { > - if (fd > 0) > - close(fd); > - > - if (dir_fd > 0) > - close(dir_fd); > - > - tst_rmdir(); > + SAFE_CLOSE(fd); > + SAFE_CLOSE(dir_fd); > } > + > +static struct tst_test test = { > + .needs_tmpdir = 1, > + .test = fchownat_verify, > + .tcnt = ARRAY_SIZE(tcases), > + .setup = setup, > + .cleanup = cleanup, > +};
Hi Shiyang, On Fri, Jan 26, 2024 at 2:26 PM Shiyang Ruan <ruansy.fnst@fujitsu.com> wrote: > Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> > --- > .../kernel/syscalls/fchownat/fchownat01.c | 154 ++++++------------ > 1 file changed, 49 insertions(+), 105 deletions(-) > > diff --git a/testcases/kernel/syscalls/fchownat/fchownat01.c > b/testcases/kernel/syscalls/fchownat/fchownat01.c > index 7771c111a..1a5b66d99 100644 > --- a/testcases/kernel/syscalls/fchownat/fchownat01.c > +++ b/testcases/kernel/syscalls/fchownat/fchownat01.c > @@ -1,133 +1,77 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > /* > - * Copyright (c) International Business Machines Corp., 2006 > - * AUTHOR: Yi Yang <yyangcdl@cn.ibm.com> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See > - * the GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > Foundation, > - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Copyright (c) International Business Machines Corp., 2006 > + * Copyright (c) Linux Test Project, 2007-2024 > */ > -/* > - * DESCRIPTION > - * This test case will verify basic function of fchownat > - * added by kernel 2.6.16 or up. > + > +/*\ > + * [Description] > + * > + * Verify basic function of fchownat() added by kernel 2.6.16 or up. > */ > > #define _GNU_SOURCE > - > -#include <sys/types.h> > -#include <sys/stat.h> > -#include <unistd.h> > -#include <stdlib.h> > -#include <errno.h> > -#include <string.h> > -#include <signal.h> > - > -#include "test.h" > -#include "safe_macros.h" > -#include "lapi/fcntl.h" > +#include "tst_test.h" > > #define TESTFILE "testfile" > - > -static void setup(void); > -static void cleanup(void); > +#define TESTFILE2 "testfile2" > > static int dir_fd; > static int fd; > static int no_fd = -1; > static int cu_fd = AT_FDCWD; > > -static struct test_case_t { > +static struct tcase { > int exp_ret; > int exp_errno; > int flag; > - int *fds; > - char *filenames; > -} test_cases[] = { > - {0, 0, 0, &dir_fd, TESTFILE}, > - {-1, ENOTDIR, 0, &fd, TESTFILE}, > - {-1, EBADF, 0, &no_fd, TESTFILE}, > - {-1, EINVAL, 9999, &dir_fd, TESTFILE}, > - {0, 0, 0, &cu_fd, TESTFILE}, > + int *fd; > + char *filename; > +} tcases[] = { > + { 0, 0, 0, &dir_fd, TESTFILE }, > + { 0, 0, 0, &cu_fd, TESTFILE }, > > + { -1, ENOTDIR, 0, &fd, TESTFILE }, > + { -1, EBADF, 0, &no_fd, TESTFILE }, > + { -1, EINVAL, 9999, &dir_fd, TESTFILE }, > We typically divide the error test into a separate test file. Then it could be easy to add more error items. > }; > > -char *TCID = "fchownat01"; > -int TST_TOTAL = ARRAY_SIZE(test_cases); > -static void fchownat_verify(const struct test_case_t *); > - > -int main(int ac, char **av) > +static void fchownat_verify(unsigned int n) > { > - int lc; > - int i; > - > - 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++) > - fchownat_verify(&test_cases[i]); > - } > - > - cleanup(); > - tst_exit(); > + struct tcase *tc = &tcases[n]; > + uid_t euid = geteuid(); > + gid_t egid = getegid(); > + int fd = *tc->fd; > + int flag = tc->flag; > + const char *filename = tc->filename; > + > + if (tc->exp_ret == 0) > + TST_EXP_PASS(fchownat(fd, filename, euid, egid, flag), > + "fchownat(%d, %s, %d, %d, %d)", > + fd, filename, euid, egid, flag); > Can we please check the file's ownership changed successfully? > + else > + TST_EXP_FAIL(fchownat(fd, filename, euid, egid, flag), > + tc->exp_errno, > + "fchownat(%d, %s, %d, %d, %d)", > + fd, filename, euid, egid, flag); > } > > static void setup(void) > { > - tst_sig(NOFORK, DEF_HANDLER, cleanup); > - > - TEST_PAUSE; > - > - tst_tmpdir(); > - > - dir_fd = SAFE_OPEN(cleanup, "./", O_DIRECTORY); > - > - SAFE_TOUCH(cleanup, TESTFILE, 0600, NULL); > - > - fd = SAFE_OPEN(cleanup, "testfile2", O_CREAT | O_RDWR, 0600); > -} > - > -static void fchownat_verify(const struct test_case_t *test) > -{ > - TEST(fchownat(*(test->fds), test->filenames, geteuid(), > - getegid(), test->flag)); > - > - if (TEST_RETURN != test->exp_ret) { > - tst_resm(TFAIL | TTERRNO, > - "fchownat() returned %ld, expected %d, errno=%d", > - TEST_RETURN, test->exp_ret, test->exp_errno); > - return; > - } > - > - if (TEST_ERRNO == test->exp_errno) { > - tst_resm(TPASS | TTERRNO, > - "fchownat() returned the expected errno %d: %s", > - test->exp_ret, strerror(test->exp_errno)); > - } else { > - tst_resm(TFAIL | TTERRNO, > - "fchownat() failed unexpectedly; expected: %d - > %s", > - test->exp_errno, strerror(test->exp_errno)); > - } > + dir_fd = SAFE_OPEN("./", O_DIRECTORY); > + SAFE_TOUCH(TESTFILE, 0600, NULL); > + fd = SAFE_OPEN(TESTFILE2, O_CREAT | O_RDWR, 0600); > } > > static void cleanup(void) > { > - if (fd > 0) > - close(fd); > - > - if (dir_fd > 0) > - close(dir_fd); > - > - tst_rmdir(); > + SAFE_CLOSE(fd); > + SAFE_CLOSE(dir_fd); > } > + > +static struct tst_test test = { > + .needs_tmpdir = 1, > + .test = fchownat_verify, > + .tcnt = ARRAY_SIZE(tcases), > + .setup = setup, > + .cleanup = cleanup, > +}; > -- > 2.34.1 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp > >
diff --git a/testcases/kernel/syscalls/fchownat/fchownat01.c b/testcases/kernel/syscalls/fchownat/fchownat01.c index 7771c111a..1a5b66d99 100644 --- a/testcases/kernel/syscalls/fchownat/fchownat01.c +++ b/testcases/kernel/syscalls/fchownat/fchownat01.c @@ -1,133 +1,77 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (c) International Business Machines Corp., 2006 - * AUTHOR: Yi Yang <yyangcdl@cn.ibm.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (c) International Business Machines Corp., 2006 + * Copyright (c) Linux Test Project, 2007-2024 */ -/* - * DESCRIPTION - * This test case will verify basic function of fchownat - * added by kernel 2.6.16 or up. + +/*\ + * [Description] + * + * Verify basic function of fchownat() added by kernel 2.6.16 or up. */ #define _GNU_SOURCE - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <signal.h> - -#include "test.h" -#include "safe_macros.h" -#include "lapi/fcntl.h" +#include "tst_test.h" #define TESTFILE "testfile" - -static void setup(void); -static void cleanup(void); +#define TESTFILE2 "testfile2" static int dir_fd; static int fd; static int no_fd = -1; static int cu_fd = AT_FDCWD; -static struct test_case_t { +static struct tcase { int exp_ret; int exp_errno; int flag; - int *fds; - char *filenames; -} test_cases[] = { - {0, 0, 0, &dir_fd, TESTFILE}, - {-1, ENOTDIR, 0, &fd, TESTFILE}, - {-1, EBADF, 0, &no_fd, TESTFILE}, - {-1, EINVAL, 9999, &dir_fd, TESTFILE}, - {0, 0, 0, &cu_fd, TESTFILE}, + int *fd; + char *filename; +} tcases[] = { + { 0, 0, 0, &dir_fd, TESTFILE }, + { 0, 0, 0, &cu_fd, TESTFILE }, + { -1, ENOTDIR, 0, &fd, TESTFILE }, + { -1, EBADF, 0, &no_fd, TESTFILE }, + { -1, EINVAL, 9999, &dir_fd, TESTFILE }, }; -char *TCID = "fchownat01"; -int TST_TOTAL = ARRAY_SIZE(test_cases); -static void fchownat_verify(const struct test_case_t *); - -int main(int ac, char **av) +static void fchownat_verify(unsigned int n) { - int lc; - int i; - - 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++) - fchownat_verify(&test_cases[i]); - } - - cleanup(); - tst_exit(); + struct tcase *tc = &tcases[n]; + uid_t euid = geteuid(); + gid_t egid = getegid(); + int fd = *tc->fd; + int flag = tc->flag; + const char *filename = tc->filename; + + if (tc->exp_ret == 0) + TST_EXP_PASS(fchownat(fd, filename, euid, egid, flag), + "fchownat(%d, %s, %d, %d, %d)", + fd, filename, euid, egid, flag); + else + TST_EXP_FAIL(fchownat(fd, filename, euid, egid, flag), + tc->exp_errno, + "fchownat(%d, %s, %d, %d, %d)", + fd, filename, euid, egid, flag); } static void setup(void) { - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - TEST_PAUSE; - - tst_tmpdir(); - - dir_fd = SAFE_OPEN(cleanup, "./", O_DIRECTORY); - - SAFE_TOUCH(cleanup, TESTFILE, 0600, NULL); - - fd = SAFE_OPEN(cleanup, "testfile2", O_CREAT | O_RDWR, 0600); -} - -static void fchownat_verify(const struct test_case_t *test) -{ - TEST(fchownat(*(test->fds), test->filenames, geteuid(), - getegid(), test->flag)); - - if (TEST_RETURN != test->exp_ret) { - tst_resm(TFAIL | TTERRNO, - "fchownat() returned %ld, expected %d, errno=%d", - TEST_RETURN, test->exp_ret, test->exp_errno); - return; - } - - if (TEST_ERRNO == test->exp_errno) { - tst_resm(TPASS | TTERRNO, - "fchownat() returned the expected errno %d: %s", - test->exp_ret, strerror(test->exp_errno)); - } else { - tst_resm(TFAIL | TTERRNO, - "fchownat() failed unexpectedly; expected: %d - %s", - test->exp_errno, strerror(test->exp_errno)); - } + dir_fd = SAFE_OPEN("./", O_DIRECTORY); + SAFE_TOUCH(TESTFILE, 0600, NULL); + fd = SAFE_OPEN(TESTFILE2, O_CREAT | O_RDWR, 0600); } static void cleanup(void) { - if (fd > 0) - close(fd); - - if (dir_fd > 0) - close(dir_fd); - - tst_rmdir(); + SAFE_CLOSE(fd); + SAFE_CLOSE(dir_fd); } + +static struct tst_test test = { + .needs_tmpdir = 1, + .test = fchownat_verify, + .tcnt = ARRAY_SIZE(tcases), + .setup = setup, + .cleanup = cleanup, +};
Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> --- .../kernel/syscalls/fchownat/fchownat01.c | 154 ++++++------------ 1 file changed, 49 insertions(+), 105 deletions(-)