static off_t rtems_tfs_lseek(
    rtems_libio_t *iop,
    off_t          offset,
    int            whence
)
{
    int ret, fd;

    fd = (int) iop->data0;

    if (RTEMS_TFS_DEBUG)
        printk("rtems_tfs_lseek(%d,%ld,%d)\n",fd,(long)offset,whence);

    switch (whence) {
    case SEEK_END:
        printk("rtems_tfs_lseek doesn't support SEEK_END\n");
        return(-1);
    case SEEK_CUR:
        whence = TFS_CURRENT;
        break;
    case SEEK_SET:
        whence = TFS_BEGIN;
        break;
    }
    ret = mon_tfsseek(tfdtable[fd].tfd,offset,whence);

    if (ret < 0)
        return(-1);

    return (off_t)ret;
}
Beispiel #2
0
/*
 *	ctrltest():
 *	Test various aspects of the tfsctrl() function.
 */
void
ctrltest(char *fname, char *data)
{
	int		tfd, ret;
	char	flags[16];

	/* Copy fname to TMPFILE... */
	cp (TMPFILE,fname);

	/* Verify TFS_UNOPEN...
	 *	Open a file, modify it, then prior to calling tfsclose(), call
	 *	tfsctrl(TFS_UNOPEN) on that file descriptor and make sure the
	 *	file is in its original state and the file descriptor has been
	 *	closed...
	 */
	tfd = mon_tfsopen(fname,TFS_APPEND,buffer1);
	if (tfd < 0)
		tfsdie(tfd);
	ret = mon_tfswrite(tfd,"abcdefg",7);
	if (ret != TFS_OKAY)
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_UNOPEN,tfd,0);
	if (ret != TFS_OKAY)
		tfsdie(ret);
	ret = mon_tfsclose(tfd,0);
	if (ret != TFSERR_BADFD)
		tfsdie(ret);
	if (cmp(TMPFILE,fname))
		die();

	/* Verify TFS_TELL...
	 *	Open a file, seek to a known point, then make sure that
	 *	tfsctrl(TFS_TELL) returns the expected offset. 
	 */
	tfd = mon_tfsopen(fname,TFS_RDONLY,0);
	if (tfd < 0)
		tfsdie(tfd);
	ret = mon_tfsseek(tfd,5,TFS_BEGIN);
	if (ret != 5)
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_TELL,tfd,0);
	if (ret != 5)
		tfsdie(ret);
	ret = mon_tfsread(tfd,buffer1,3);
	if (ret != 3)
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_TELL,tfd,0);
	if (ret != 5+3)
		tfsdie(ret);

	ret = mon_tfsclose(tfd,0);
	if (ret != TFS_OKAY)
		tfsdie(ret);
	

	/* Test all "flag-ascii-to-binary" conversions... */
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"e",0)) !=  TFS_EXEC)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"b",0)) !=  TFS_BRUN)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"B",0)) !=  TFS_QRYBRUN)
		tfsdie(ret);
#if 0
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"C",0)) !=  TFS_COFF)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"E",0)) !=  TFS_ELF)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"A",0)) !=  TFS_AOUT)
		tfsdie(ret);
#else
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"E",0)) !=  TFS_EBIN)
		tfsdie(ret);
#endif
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"c",0)) !=  TFS_CPRS)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"i",0)) !=  TFS_IPMOD)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"u",0)) !=  TFS_UNREAD)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"1",0)) !=  TFS_ULVL1)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"2",0)) !=  TFS_ULVL2)
		tfsdie(ret);
	if ((ret = mon_tfsctrl(TFS_FATOB,(long)"3",0)) !=  TFS_ULVL3)
		tfsdie(ret);

	/* Test all "flag-binary-to-ascii" conversions... */
	ret = mon_tfsctrl(TFS_FBTOA,TFS_EXEC,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"e")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_BRUN,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"b")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_QRYBRUN,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"B")))
		tfsdie(ret);
#if 0
	ret = mon_tfsctrl(TFS_FBTOA,TFS_COFF,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"C")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_ELF,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"E")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_AOUT,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"A")))
		tfsdie(ret);
#else
	ret = mon_tfsctrl(TFS_FBTOA,TFS_EBIN,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"E")))
		tfsdie(ret);
#endif
	ret = mon_tfsctrl(TFS_FBTOA,TFS_CPRS,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"c")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_IPMOD,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"i")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_UNREAD,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"u")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_ULVL1,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"1")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_ULVL2,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"2")))
		tfsdie(ret);
	ret = mon_tfsctrl(TFS_FBTOA,TFS_ULVL3,(long)flags);
	if ((ret == TFSERR_BADARG) || (strcmp(flags,"3")))
		tfsdie(ret);


	ret = mon_tfsunlink(TMPFILE);
	if (ret != TFS_OKAY)
		tfsdie(ret);
}
Beispiel #3
0
/* writetest():
 *  Open the specified file in APPEND (modify) mode.  Seek into the file
 *	and read 1 byte.  Increment that byte by one and then write it back
 *	to the same location from which it was read.  Then, close the file.
 *	Build a new file that is what "should" be the content of the file we
 *	just modified and compare the two files.  They better match.
 *  This function also verifies TFS_HEADROOM.
 */
int
writetest(char *fname, char *newdata)
{
	TFILE *tfp;
	char c;
	long	headroom;
	int	size, tfd, err;

	/* Open the source file: */
	tfp = mon_tfsstat(fname);
	if (!tfp)
		die();
	size = TFS_SIZE(tfp);
	tfd = mon_tfsopen(fname,TFS_APPEND,buffer1);
	if (tfd < 0)
		tfsdie(tfd);

	headroom = mon_tfsctrl(TFS_HEADROOM,tfd,0);
	if (headroom != 0)
		die();

	err = mon_tfsseek(tfd,3,TFS_BEGIN);
	if (err != 3)
		tfsdie(err);

	headroom = mon_tfsctrl(TFS_HEADROOM,tfd,0);
	if (headroom != (size-3))
		die();

	err = mon_tfsread(tfd,&c,1);
	if (err != 1)
		tfsdie(err);

	headroom = mon_tfsctrl(TFS_HEADROOM,tfd,0);
	if (headroom != (size-4))
		die();

	c++;
	err = mon_tfsseek(tfd,-1,TFS_CURRENT);
	if (err != 3)
		tfsdie(err);

	headroom = mon_tfsctrl(TFS_HEADROOM,tfd,0);
	if (headroom != (size-3))
		die();

	err = mon_tfswrite(tfd,&c,1);
	if (err != TFS_OKAY)
		tfsdie(err);

	headroom = mon_tfsctrl(TFS_HEADROOM,tfd,0);
	if (headroom != (size-4))
		die();

	mon_tfsclose(tfd,0);

	/* Add a new file that "should" be identical to the modified file;
	 * then compare them and delete the newfile...
	 */
	err = mon_tfsadd(TMPFILE,"newdata1","2",newdata,strlen(newdata));
	if (err != TFS_OKAY)
		tfsdie(err);
	if (cmp(fname,TMPFILE) != 0)
		die();
	err = mon_tfsunlink(TMPFILE);
	if (err != TFS_OKAY)
		tfsdie(err);
	
	return(0);
}
Beispiel #4
0
/* seektest():
 *	Run some tests on tfsseek().
 *	Verify that the character in the file specified at the incoming offset
 *	is as expected.  Seek to beyond the end of file and verify error, etc...
 */
int
seektest(char *fname, int offset, char value)
{
	char	c, buf1[16], buf2[16];
	TFILE	*tfp;
	int		tfd, end, err;

	/* Open the source file: */
	tfd = mon_tfsopen(fname,TFS_RDONLY,0);
	if (tfd < 0)
		tfsdie(tfd);

	if (mon_tfsseek(tfd,offset,TFS_BEGIN) != offset)
		tfsdie(tfd);
	
	if (mon_tfsread(tfd,&c,1) != 1)
		tfsdie(tfd);

	if (c != value)
		die();

	tfp = mon_tfsstat(fname);
	if (!tfp)
		die();
	end = TFS_SIZE(tfp);

	/* 
	 * Seek to various limits in the file and verify proper return
	 * value...
	 */
	err = mon_tfsseek(tfd,0,TFS_BEGIN);
	if (err != 0)
		tfsdie(err);
	err = mon_tfsseek(tfd,end,TFS_CURRENT);
	if (err != end)
		tfsdie(err);
	err = mon_tfsseek(tfd,1,TFS_CURRENT);
	if (err != TFSERR_EOF)
		tfsdie(err);
	err = mon_tfsseek(tfd,end,TFS_BEGIN);
	if (err != end)
		tfsdie(err);
	err = mon_tfsseek(tfd,end+1,TFS_BEGIN);
	if (err != TFSERR_EOF)
		tfsdie(err);

	err = mon_tfsseek(tfd,0,TFS_BEGIN);
	if (err != 0)
		tfsdie(err);
	err = mon_tfsseek(tfd,-1,TFS_CURRENT);
	if (err != TFSERR_EOF)
		tfsdie(err);

	err = mon_tfsseek(tfd,end,TFS_BEGIN);
	if (err != end)
		tfsdie(err);
	err = mon_tfsseek(tfd,-1,TFS_CURRENT);
	if (err != end-1)
		tfsdie(err);
	err = mon_tfsseek(tfd,2,TFS_CURRENT);
	if (err != TFSERR_EOF)
		tfsdie(err);

	/* Seek to beginning, read 10, seek to beginning again read 10 again.
	 * Verify that both reads have same data.
	 */
	err = mon_tfsseek(tfd,0,TFS_BEGIN);
	if (err != 0)
		tfsdie(err);
	err = mon_tfsread(tfd,buf1,10);
	if (err != 10)
		tfsdie(err);
	err = mon_tfsseek(tfd,0,TFS_BEGIN);
	if (err != 0)
		tfsdie(err);
	err = mon_tfsread(tfd,buf2,10);
	if (err != 10)
		tfsdie(err);
	if (memcmp(buf1,buf2,10))
		die();

	/*
	 * Seek to end, then verify that read() returns EOF and tfs_eof()
	 * returns true.
	 */
	err = mon_tfsseek(tfd,end,TFS_BEGIN);
	if (err != end)
		tfsdie(err);
	err = mon_tfsread(tfd,buf1,1);
	if (err != TFSERR_EOF)
		tfsdie(err);
	if (mon_tfseof(tfd) != 1)
		die();

	mon_tfsclose(tfd,0);
	return(0);
}