[LTP] [PATCH 1/2] syscalls/readdir01: Convert to new API

Cyril Hrubis chrubis@suse.cz
Thu Oct 7 13:35:26 CEST 2021


Hi!
> +static void setup(void)
> +{
> +	sprintf(prefix, "%s_%d.", "readdirfile", getpid());

Since the test runs in it's own temporary directory there is no need to
prefix everything with the pid.

> +}
> 
> -/***********************************************************************
> - * Main
> - ***********************************************************************/
> -int main(int ac, char **av)
> +static void verify_readdir(void)
>  {
> -	int lc;
> -	int cnt;
> -	int nfiles, fd;
> +	int i;
> +	int fd;
> +	int cnt = 0;
>  	char fname[255];
>  	DIR *test_dir;
>  	struct dirent *dptr;
> 
> -	tst_parse_opts(ac, av, options, &help);
> -
> -	if (Nflag) {
> -		if (sscanf(Nfilearg, "%i", &Nfiles) != 1) {
> -			tst_brkm(TBROK, NULL, "--N option arg is not a number");
> -		}
> +	for (i = 0; i < nfiles; i++) {
> +		sprintf(fname, "%s_%d", prefix, i);
> +		fd = SAFE_OPEN(fname, O_RDWR | O_CREAT, 0700);
> +		SAFE_WRITE(1, fd, "hello\n", 6);
> +		SAFE_CLOSE(fd);
>  	}

This loop could be moved to the test setup, there is no need to
re-create the files on each iteration.

> 
> -    /***************************************************************
> -     * perform global setup for test
> -     ***************************************************************/
> -	/* Next you should run a setup routine to make sure your environment is
> -	 * sane.
> -	 */
> -	setup();
> -
> -    /***************************************************************
> -     * check looping state
> -     ***************************************************************/
> -	/* TEST_LOOPING() is a macro that will make sure the test continues
> -	 * looping according to the standard command line args.
> -	 */
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		if (Nfiles)
> -			nfiles = Nfiles;
> -		else
> -			/* min of 10 links and max of a 100 links */
> -			nfiles = (lc % 90) + 10;
> -
> -		/* create a bunch of files to look at */
> -		for (cnt = 0; cnt < nfiles; cnt++) {
> -
> -			sprintf(fname, "%s%d", Basename, cnt);
> -			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));
> -			} else if (write(fd, "hello\n", 6) < 0) {
> -				tst_brkm(TBROK, cleanup,
> -					 "write(%s, \"hello\\n\", 6) Failed, errno=%d : %s",
> -					 fname, errno, strerror(errno));
> -			} else if (close(fd) < 0) {
> -				tst_resm(TWARN,
> -					"close(%s) Failed, errno=%d : %s",
> -					fname, errno, strerror(errno));
> -			}
> -		}
> -
> -		if ((test_dir = opendir(".")) == NULL) {
> -			tst_resm(TFAIL, "opendir(\".\") Failed, errno=%d : %s",
> -				 errno, strerror(errno));
> -		} else {
> -			/* count the entries we find to see if any are missing */
> -			cnt = 0;
> -			errno = 0;
> -			while ((dptr = readdir(test_dir)) != 0) {
> -				if (strcmp(dptr->d_name, ".")
> -				    && strcmp(dptr->d_name, ".."))
> -					cnt++;
> -			}
> -
> -			if (errno != 0) {
> -				tst_resm(TFAIL,
> -					 "readir(test_dir) Failed on try %d, errno=%d : %s",
> -					 cnt + 1, errno, strerror(errno));
> -			}
> -			if (cnt == nfiles) {
> -				tst_resm(TPASS,
> -					 "found all %d that were created",
> -					 nfiles);
> -			} else if (cnt > nfiles) {
> -				tst_resm(TFAIL,
> -					 "found more files than were created");
> -				tst_resm(TINFO, "created: %d, found: %d",
> -					 nfiles, cnt);
> -			} else {
> -				tst_resm(TFAIL,
> -					 "found less files than were created");
> -				tst_resm(TINFO, "created: %d, found: %d",
> -					 nfiles, cnt);
> -			}
> -		}
> -
> -		/* Here we clean up after the test case so we can do another iteration.
> -		 */
> -		for (cnt = 0; cnt < nfiles; cnt++) {
> -
> -			sprintf(fname, "%s%d", Basename, cnt);
> -
> -			if (unlink(fname) == -1) {
> -				tst_resm(TWARN,
> -					"unlink(%s) Failed, errno=%d : %s",
> -					Fname, errno, strerror(errno));
> -			}
> -		}
> -
> +	test_dir = SAFE_OPENDIR(".");
> +	while ((dptr = SAFE_READDIR(test_dir)) != 0) {
> +		if (strcmp(dptr->d_name, ".")
> +			&& strcmp(dptr->d_name, ".."))
> +			cnt++;
>  	}

I would have probably written this as:

	while ((ent = SAFE_READDIR(test_dir))) {
		if (!strcmp(ent->d_name, "." || !strcmp(ent->d_name, ".")
			continue;

		cnt++;
	}

Also I guess that we can check that the filename is filled correctly as
well, it has to start with prefix at least.

> -    /***************************************************************
> -     * cleanup and exit
> -     ***************************************************************/
> -	cleanup();
> -
> -	tst_exit();
> -}
> -
> -/***************************************************************
> - * help
> - ***************************************************************/
> -/* The custom help() function is really simple.  Just write your help message to
> - * standard out.  Your help function will be called after the standard options
> - * have been printed
> - */
> -void help(void)
> -{
> -	printf("  -N #files : create #files files every iteration\n");
> -}
> -
> -/***************************************************************
> - * setup() - performs all ONE TIME setup for this test.
> - ***************************************************************/
> -void setup(void)
> -{
> -	/* You will want to enable some signal handling so you can capture
> -	 * unexpected signals like SIGSEGV.
> -	 */
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> -
> -	/* One cavet that hasn't been fixed yet.  TEST_PAUSE contains the code to
> -	 * fork the test with the -c option.  You want to make sure you do this
> -	 * before you create your temporary directory.
> -	 */
> -	TEST_PAUSE;
> -
> -	/* If you are doing any file work, you should use a temporary directory.  We
> -	 * provide tst_tmpdir() which will create a uniquely named temporary
> -	 * directory and cd into it.  You can now create files in the current
> -	 * directory without worrying.
> -	 */
> -	tst_tmpdir();
> -
> -	sprintf(Basename, "%s_%d.", BASENAME, getpid());
> +	if (cnt == nfiles) {
> +		tst_res(TPASS,
> +				"found all %d that were created",
> +				nfiles);
> +	} else {
> +		tst_res(TFAIL,
> +				"found %s files than were created, created: %d, found: %d",
> +				cnt > nfiles ? "more" : "less", nfiles, cnt);
> +	}

Why the newline after TPASS, TFAIL, ? We indent the format string as if
it continued after the TFAIL/TPASS anyways.

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list