[LTP] [PATCH 5/5] syscalls/dup2/dup205: Convert dup205 to the new API
xuyang2018.jy@fujitsu.com
xuyang2018.jy@fujitsu.com
Tue Sep 7 12:06:33 CEST 2021
Hi Qi
please use safe_macros and static prefix.
> From: QI Fuli<qi.fuli@fujitsu.com>
>
> Signed-off-by: QI Fuli<qi.fuli@fujitsu.com>
> ---
> testcases/kernel/syscalls/dup2/dup205.c | 165 +++++++++---------------
> 1 file changed, 62 insertions(+), 103 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/dup2/dup205.c b/testcases/kernel/syscalls/dup2/dup205.c
> index 0b324531f..30526fda6 100644
> --- a/testcases/kernel/syscalls/dup2/dup205.c
> +++ b/testcases/kernel/syscalls/dup2/dup205.c
> @@ -1,45 +1,16 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> /*
> + * Copyright (c) International Business Machines Corp., 2002
> *
> - * Copyright (c) International Business Machines Corp., 2002
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * 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
> */
>
> /* Ported from SPIE, section2/iosuite/dup6.c, by Airong Zhang */
I think we need a comment for this test's aim.
It looks like dup205 checks whether hit the error when we just consume
max open file descriptors. And it is similar as shmget03/msgget03.
>
> -/*======================================================================
> - =================== TESTPLAN SEGMENT ===================
> ->KEYS:< dup2()
> ->WHAT:< Does dup return -1 on the 21st file?
> ->HOW:< Create up to _NFILE files and check for -1 return on the
> - < next attempt
> - < Should check NOFILE as well as _NFILE. 19-Jun-84 Dale.
> ->BUGS:<
> -======================================================================*/
> -
> -#include<sys/param.h>
> -#include<sys/types.h>
> -#include<sys/stat.h>
> -#include<errno.h>
> -#include<fcntl.h>
> +#include<stdlib.h>
> #include<stdio.h>
> -#include<unistd.h>
> -#include "test.h"
> +#include "tst_test.h"
>
> -char *TCID = "dup205";
> -int TST_TOTAL = 1;
> int *fildes;
> int min;
> int local_flag;
> @@ -47,88 +18,76 @@ int local_flag;
> #define PASSED 1
> #define FAILED 0
>
local_flag, PASSED,FAILED macro are useless. We can remove them directly.
> -static void setup(void);
> -static void cleanup(void);
> +static void setup(void)
> +{
> + min = getdtablesize(); /* get number of files allowed open */
> + fildes = malloc((min + 10) * sizeof(int));
> + if (fildes == NULL)
> + tst_brk(TBROK | TERRNO, "malloc error");
> +}
> +
> +static void cleanup(void)
> +{
> + if (fildes != NULL)
> + free(fildes);
> +}
>
> -int main(int ac, char *av[])
> +static void run(void)
> {
> int ifile;
> char pfilname[40];
> int serrno;
>
> - int lc;
> -
> ifile = -1;
>
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> local_flag = PASSED;
>
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> - sprintf(pfilname, "./dup205.%d\n", getpid());
> - unlink(pfilname);
> - serrno = 0;
> - if ((fildes[0] = creat(pfilname, 0666)) == -1)
> - tst_brkm(TBROK | TERRNO, cleanup, "creat failed");
> - else {
> - fildes[fildes[0]] = fildes[0];
> - for (ifile = fildes[0] + 1; ifile< min + 10; ifile++) {
> - if ((fildes[ifile] = dup2(fildes[ifile - 1],
> - ifile)) == -1) {
> - serrno = errno;
> - break;
> - } else {
> - if (fildes[ifile] != ifile) {
> - tst_brkm(TFAIL, cleanup,
> - "got wrong descriptor "
> - "number back (%d != %d)",
> - fildes[ifile], ifile);
> - }
> - }
> - } /* end for */
> - if (ifile< min) {
> - tst_resm(TFAIL, "Not enough files duped");
> - local_flag = FAILED;
> - } else if (ifile> min) {
> - tst_resm(TFAIL, "Too many files duped");
> - local_flag = FAILED;
> - }
> - if (serrno != EBADF&& serrno != EMFILE&&
> - serrno != EINVAL)
{
> - tst_resm(TFAIL, "bad errno on dup2 failure");
> - local_flag = FAILED;
> + sprintf(pfilname, "./dup205.%d\n", getpid());
> + unlink(pfilname);
> + serrno = 0;
> +
> + fildes[0] = creat(pfilname, 0666);
> + if (fildes[0] == -1)
> + tst_brk(TBROK | TERRNO, "creat failed");
> + else {
> + fildes[fildes[0]] = fildes[0];
> + for (ifile = fildes[0] + 1; ifile< min + 10; ifile++) {
> + fildes[ifile] = dup2(fildes[ifile - 1], ifile);
> + if (fildes[ifile] == -1) {
> + serrno = errno;
> + break;
> }
We can use test macro, so we don't need serrno variable.
> + if (fildes[ifile] != ifile)
> + tst_brk(TFAIL, "got wrong descriptor "
> + "number back (%d != %d)",
> + fildes[ifile], ifile);
> + } /* end for */
> + if (ifile< min) {
> + tst_res(TFAIL, "Not enough files duped");
> + local_flag = FAILED;
> + } else if (ifile> min) {
> + tst_res(TFAIL, "Too many files duped");
> + local_flag = FAILED;
> }
> - unlink(pfilname);
> - for (ifile = fildes[0]; ifile< min + 10; ifile++)
> - close(fildes[ifile]);
> - if (local_flag == PASSED) {
> - tst_resm(TPASS, "Test passed.");
> - } else {
> - tst_resm(TFAIL, "Test failed.");
> + if (serrno != EBADF&& serrno != EMFILE&&
> + serrno != EINVAL) {
I don't understand why check three errnos and need a comment here
On my machine, this case fails with EBADF.
Best Regards
Yang Xu
> + tst_res(TFAIL, "bad errno on dup2 failure");
> + local_flag = FAILED;
> }
> -
> }
> - cleanup();
> - tst_exit();
> -}
> -
> -static void setup(void)
> -{
> - tst_tmpdir();
> -
> - min = getdtablesize(); /* get number of files allowed open */
> - fildes = malloc((min + 10) * sizeof(int));
> - if (fildes == NULL)
> - tst_brkm(TBROK | TERRNO, cleanup, "malloc error");
> + unlink(pfilname);
> + for (ifile = fildes[0]; ifile< min + 10; ifile++)
> + close(fildes[ifile]);
> + if (local_flag == PASSED) {
> + tst_res(TPASS, "Test passed.");
> + } else {
> + tst_res(TFAIL, "Test failed.");
> + }
> }
>
> -static void cleanup(void)
> -{
> - if (fildes != NULL)
> - free(fildes);
> - tst_rmdir();
> -}
> +static struct tst_test test = {
> + .needs_tmpdir = 1,
> + .test_all = run,
> + .setup = setup,
> + .cleanup = cleanup,
> +};
More information about the ltp
mailing list