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 ssize_t FSDrvWrite(struct _reent* r, int fd, const char* ptr, size_t len) { FSFileHandle* handle = (FSFileHandle*) fd; const void* buf = ptr; if(((u32) ptr & (FS_IO_BUFFER_ALIGN - 1)) != 0) { buf = memalign(FS_IO_BUFFER_ALIGN, len); if(buf == NULL) { r->_errno = ENOMEM; return -1; } memcpy((void*) buf, ptr, len); } FSStatus err = FSWriteFile(fsClient, fsCmdBlock, buf, 1, len, *handle, FS_IO_FLAG_NONE, FS_RET_ALL_ERROR); if(((u32) ptr & (FS_IO_BUFFER_ALIGN - 1)) != 0) { free((void*) buf); } if(err < FS_STATUS_OK) { FSDrvReportError(r); return -1; } return err; }