int FATFileHandle::fsync() { FFSDEBUG("fsync()\n"); FRESULT res = f_sync(&_fh); if (res) { FFSDEBUG("f_sync() failed (%d, %s)\n", res, FR_ERRORS[res]); return -1; } return 0; }
ssize_t FATFileHandle::read(void* buffer, size_t length) { FFSDEBUG("read(%d)\n", length); UINT n; FRESULT res = f_read(&_fh, buffer, length, &n); if(res) { FFSDEBUG("f_read() failed (%d, %s)\n", res, FR_ERRORS[res]); return -1; } return n; }
ssize_t FATFileHandle::write(const void* buffer, size_t length) { FFSDEBUG("write(%d)\n", length); UINT n; FRESULT res = f_write(&_fh, buffer, length, &n); if(res) { FFSDEBUG("f_write() failed (%d, %s)", res, FR_ERRORS[res]); return -1; } return n; }
DRESULT disk_ioctl ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE ctrl, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { FFSDEBUG("disk_ioctl(%d)\n", ctrl); switch(ctrl) { case CTRL_SYNC: if(FATFileSystem::_ffs[drv] == NULL) { return RES_NOTRDY; } else if(FATFileSystem::_ffs[drv]->disk_sync()) { return RES_ERROR; } return RES_OK; case GET_SECTOR_COUNT: if(FATFileSystem::_ffs[drv] == NULL) { return RES_NOTRDY; } else { int res = FATFileSystem::_ffs[drv]->disk_sectors(); if(res > 0) { *((DWORD*)buff) = res; // minimum allowed return RES_OK; } else { return RES_ERROR; } } case GET_BLOCK_SIZE: *((DWORD*)buff) = 1; // default when not known return RES_OK; } return RES_PARERR; }
DSTATUS disk_status ( BYTE drv /* Physical drive nmuber (0..) */ ) { FFSDEBUG("disk_status on drv [%d]\n", drv); return (DSTATUS)FATFileSystem::_ffs[drv]->disk_status(); }
off_t FATFileHandle::lseek(off_t position, int whence) { FFSDEBUG("lseek(%i,%i)\n",position,whence); if(whence == SEEK_END) { position += _fh.fsize; } else if(whence==SEEK_CUR) { position += _fh.fptr; } FRESULT res = f_lseek(&_fh, position); if(res) { FFSDEBUG("lseek failed (%d, %s)\n", res, FR_ERRORS[res]); return -1; } else { FFSDEBUG("lseek OK, returning %i\n", _fh.fptr); return _fh.fptr; } }
DRESULT disk_write ( BYTE drv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to write (1..255) */ ) { FFSDEBUG("disk_write(sector %d, count %d) on drv [%d]\n", sector, count, drv); for(unsigned int s=sector; s<sector+count; s++) { FFSDEBUG(" disk_write(sector %d)\n", s); int res = FATFileSystem::_ffs[drv]->disk_write((char*)buff, sector); if(res) { return RES_PARERR; } buff += 512; } return RES_OK; }
off_t FATFileHandle::flen() { FFSDEBUG("flen\n"); return _fh.fsize; }
int FATFileHandle::close() { FFSDEBUG("close\n"); int retval = f_close(&_fh); delete this; return retval; }