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; }
/* * 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); }
/* 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); }
/* 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); }