Ejemplo n.º 1
0
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;
}