Ejemplo n.º 1
0
static int sd_fat_ftruncate_r (struct _reent *r, int fd, off_t len)
{
    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 = FSTruncateFile(file->dev->pClient, file->dev->pCmd, file->fd, -1);

    OSUnlockMutex(file->dev->pMutex);

    if(result < 0) {
        r->_errno = result;
        return -1;
    }

    return 0;
}
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;
}