static ssize_t sd_fat_write_r (struct _reent *r, int fd, const char *ptr, size_t len) { sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; if(!file->dev) { r->_errno = ENODEV; return 0; } if(!file->write) { r->_errno = EACCES; return 0; } OSLockMutex(file->dev->pMutex); size_t len_aligned = FS_ALIGN(len); if(len_aligned > 0x4000) len_aligned = 0x4000; unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned); if(!tmpBuf) { r->_errno = ENOMEM; OSUnlockMutex(file->dev->pMutex); return 0; } size_t done = 0; while(done < len) { size_t write_size = (len_aligned < (len - done)) ? len_aligned : (len - done); memcpy(tmpBuf, ptr + done, write_size); int result = FSWriteFile(file->dev->pClient, file->dev->pCmd, tmpBuf, 0x01, write_size, file->fd, 0, -1); #if 0 FSFlushFile(file->dev->pClient, file->dev->pCmd, file->fd, -1); #endif if(result < 0) { r->_errno = result; break; } else if(result == 0) { if(write_size > 0) done = 0; break; } else { done += result; file->pos += result; } } free(tmpBuf); OSUnlockMutex(file->dev->pMutex); return done; }
static int FSDrvFSync(struct _reent* r, int fd) { FSFileHandle* handle = (FSFileHandle*) fd; FSStatus err = FSFlushFile(fsClient, fsCmdBlock, *handle, FS_RET_ALL_ERROR); if(err != FS_STATUS_OK) { FSDrvReportError(r); return -1; } return 0; }
static int sd_fat_fsync_r (struct _reent *r, int fd) { sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; if(!file->dev) { r->_errno = ENODEV; return -1; } OSLockMutex(file->dev->pMutex); int result = FSFlushFile(file->dev->pClient, file->dev->pCmd, file->fd, -1); OSUnlockMutex(file->dev->pMutex); if(result < 0) { r->_errno = result; return -1; } return 0; }