wut/libraries/wutdevoptab_sd/devoptab_sd_write.c

62 lines
1.3 KiB
C
Raw Normal View History

2018-06-13 14:36:15 +02:00
#include "devoptab_sd.h"
2018-05-27 13:11:45 +02:00
ssize_t
__wut_fs_write(struct _reent *r,
void *fd,
const char *ptr,
size_t len)
{
FSStatus rc;
uint32_t bytes, bytesWritten = 0;
2018-05-27 13:11:45 +02:00
__wut_fs_file_t *file = (__wut_fs_file_t *)fd;
// Check that the file was opened with write access
if ((file->flags & O_ACCMODE) == O_RDONLY) {
r->_errno = EBADF;
return -1;
}
// Copy to internal buffer and write in chunks.
uint8_t *tmp_buffer = memalign(0x40, 8192);
2018-05-27 13:11:45 +02:00
while(len > 0) {
size_t toWrite = len;
if (toWrite > 8192) {
toWrite = 8192;
}
// Copy to internal buffer
memcpy(tmp_buffer, ptr, toWrite);
// Set up command block
FSCmdBlock fsCmd;
FSInitCmdBlock(&fsCmd);
// Write the data
2018-06-13 14:36:15 +02:00
rc = FSWriteFile(__wut_devoptab_sd_client, &fsCmd, tmp_buffer, 1, toWrite, file->fd, 0, -1);
2018-05-27 13:11:45 +02:00
if (rc < 0) {
free(tmp_buffer);
// Return partial transfer
if (bytesWritten > 0) {
return bytesWritten;
}
r->_errno = __wut_fs_translate_error(rc);
return -1;
} else {
bytes = rc;
}
file->offset += bytes;
bytesWritten += bytes;
ptr += bytes;
len -= bytes;
}
free(tmp_buffer);
return bytesWritten;
}