FSStatus FSSetPosFileAsync(FSClient *client, FSCmdBlock *block, FSFileHandle handle, uint32_t pos, uint32_t flags, FSAsyncData *asyncData) { assert(asyncData->callback); auto result = FSSetPosFile(client, block, handle, pos, flags); FSAsyncCallback cb = static_cast<uint32_t>(asyncData->callback); cb(client, block, result, asyncData->param); return result; }
static int FSDrvFTruncate(struct _reent* r, int fd, off_t len) { FSFileHandle* handle = (FSFileHandle*) fd; FSStatus err = FS_STATUS_OK; u32 currPos = 0; if((err = FSGetPosFile(fsClient, fsCmdBlock, *handle, &currPos, FS_RET_ALL_ERROR)) == FS_STATUS_OK && (err = FSSetPosFile(fsClient, fsCmdBlock, *handle, (u32) len, FS_RET_ALL_ERROR)) == FS_STATUS_OK) { err = FSTruncateFile(fsClient, fsCmdBlock, *handle, FS_RET_ALL_ERROR); FSStatus restoreErr = FSSetPosFile(fsClient, fsCmdBlock, *handle, currPos, FS_RET_ALL_ERROR); if(err == FS_STATUS_OK) { err = restoreErr; } } if(err != FS_ERROR_OK) { FSDrvReportError(r); return -1; } return 0; }
static off_t FSDrvSeek(struct _reent* r, int fd, off_t pos, int dir) { FSFileHandle* handle = (FSFileHandle*) fd; FSStatus err = FS_STATUS_OK; switch(dir) { case SEEK_SET: break; case SEEK_CUR: { u32 currPos = 0; if((err = FSGetPosFile(fsClient, fsCmdBlock, *handle, &currPos, FS_RET_ALL_ERROR)) == FS_STATUS_OK) { pos += currPos; } break; } case SEEK_END: { FSStat stat; if((err = FSGetStatFile(fsClient, fsCmdBlock, *handle, &stat, FS_RET_ALL_ERROR)) == FS_STATUS_OK) { pos += stat.size; } break; } default: r->_errno = EINVAL; return -1; } if(err == FS_STATUS_OK) { if(pos < 0) { r->_errno = EINVAL; return -1; } err = FSSetPosFile(fsClient, fsCmdBlock, *handle, (u32) pos, FS_RET_ALL_ERROR); } if(err != FS_ERROR_OK) { FSDrvReportError(r); return -1; } return 0; }
static off_t sd_fat_seek_r (struct _reent *r, int fd, off_t pos, int dir) { sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; if(!file->dev) { r->_errno = ENODEV; return 0; } OSLockMutex(file->dev->pMutex); switch(dir) { case SEEK_SET: file->pos = pos; break; case SEEK_CUR: file->pos += pos; break; case SEEK_END: file->pos = file->len + pos; break; default: r->_errno = EINVAL; return -1; } int result = FSSetPosFile(file->dev->pClient, file->dev->pCmd, file->fd, file->pos, -1); OSUnlockMutex(file->dev->pMutex); if(result == 0) { return file->pos; } return result; }