[LTP] [PATCH 1/2] syscalls/lseek01, 06: cleanup && convert to new API

Cyril Hrubis chrubis@suse.cz
Mon Jun 19 18:51:59 CEST 2017


Hi!
> +static int fd;
> +static struct tcase {
> +	off_t off;
> +	int whence;
> +	off_t exp_off;
> +	char *exp_data;
> +} tcases[] = {
> +	{4, SEEK_SET, 4, "efg"},
> +	{-2, SEEK_CUR, 5, "fg"},

This part actually depends on the fact that the file has been seeked and
read in the previous test. I wonder if it would be less confusing if we
reset the offset to a defined position (start of the file) before the
the test.

> +	{-4, SEEK_END, 3, "defg"},
> +};
> +
> +static void verify_lseek(unsigned int n)
>  {
> -	int lc;
> -
> -	int ind;
> -	int offset;
> +	char read_buf[64];
> +	struct tcase *tc = &tcases[n];
>  
> -    /***************************************************************
> -     * parse standard options
> -     ***************************************************************/
> -	tst_parse_opts(ac, av, NULL, NULL);
> +	memset(read_buf, 0, sizeof(read_buf));
>  
> -    /***************************************************************
> -     * perform global setup for test
> -     ***************************************************************/
> -	setup();
> -
> -    /***************************************************************
> -     * check looping state if -c option given
> -     ***************************************************************/
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> -		tst_count = 0;
> -
> -		offset = (lc % 100) * 4096;	/* max size is 100 blocks */
> -
> -		for (ind = 0; Whence[ind] >= 0; ind++) {
> +	TEST(lseek(fd, tc->off, tc->whence));
> +	if (TEST_RETURN == (off_t) -1) {
> +		tst_res(TFAIL | TTERRNO, "lseek(%d, %ld, %d) failed", fd,
> +			tc->off, tc->whence);
> +		return;
> +	}
>  
> -			/*
> -			 *  Call lseek(2)
> -			 */
> -			TEST(lseek(Fd, (long)offset, Whence[ind]));
> +	if (TEST_RETURN != tc->exp_off) {
> +		tst_res(TFAIL, "lseek(%d, %ld, %d) returned %ld, expected %ld",
> +			fd, tc->off, tc->whence, TEST_RETURN, tc->exp_off);
> +		return;
> +	}
>  
> -			/* check return code */
> -			if (TEST_RETURN == -1) {
> -				tst_resm(TFAIL,
> -					 "lseek(%s, %d, 0) Failed, errno=%d : %s",
> -					 Fname, offset, TEST_ERRNO,
> -					 strerror(TEST_ERRNO));
> -			} else {
> -				tst_resm(TPASS,
> -					 "lseek(%s, %d, %d) returned %ld",
> -					 Fname, offset, Whence[ind],
> -					 TEST_RETURN);
> -			}
> -		}
> +	SAFE_READ(0, fd, &read_buf, sizeof(read_buf));
>  
> +	if (strcmp(read_buf, tc->exp_data)) {
> +		tst_res(TFAIL, "lseek(%d, %ld, %d) read incorrect data", fd,
> +			tc->off, tc->whence);
> +	} else {
> +		tst_res(TPASS, "lseek(%d, %ld, %d) read correct data", fd,
> +			tc->off, tc->whence);

I guess that the fd here is not that useful and it may be a bit better
to to translate the whence to its name, but that is very minor.

>  	}
> -
> -	cleanup();
> -	tst_exit();
>  }
>  
> -/***************************************************************
> - * setup() - performs all ONE TIME setup for this test.
> - ***************************************************************/
> -void setup(void)
> +static void setup(void)
>  {
> +	char write_buf[64];
>  
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> +	strcpy(write_buf, "abcdefg");

There is no need for that. Just define the string and use sizeof instead
of strlen, i.e.

#define WRITE_STR "abcdefg"

...
	SAFE_WRITE(1, fd, WRITE_STR, sizeof(WRITE_STR) - 1);
...

Or use SAFE_FILE_PRINTF(), then open() the fd.

> -	TEST_PAUSE;
> +	fd = SAFE_OPEN("tmp_file", O_RDWR | O_CREAT, 0644);
>  
> -	tst_tmpdir();
> -
> -	sprintf(Fname, "tfile_%d", getpid());
> -	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));
> -	}
> +	SAFE_WRITE(1, fd, write_buf, strlen(write_buf));
>  }

Otherwise it looks fine.

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list