Changeset 1130 for Whitix

Show
Ignore:
Timestamp:
10/14/08 19:36:08 (1 month ago)
Author:
mwhitworth
Message:

Add to DoSeekFile (more error checking).

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/branches/keobject/fs/vfs/file.c

    r1061 r1130  
    142142                        return -EIO; 
    143143                } 
    144  
     144                 
    145145                buff=BlockRead(vNode->superBlock->sDevice, res); 
    146146 
     
    157157                file->position+=readSize; 
    158158 
    159                 BlockFree(buff); 
     159//              BlockFree(buff); 
    160160        } 
    161161 
     
    321321                err=file->fileOps->read(file,buffer,size); 
    322322                VfsFileAccessed(file->vNode); 
     323                 
    323324                return err; 
    324325        } 
     
    365366int DoSeekFile(struct File* file,int distance,int whence) 
    366367{ 
     368        int temp=-1; 
     369         
    367370        if (file->vNode->mode & VFS_ATTR_DIR) 
    368371                return -EISDIR; 
     
    374377                { 
    375378                        case 0: /* SEEK_SET */ 
    376                                 file->position=distance; 
     379                                temp=distance; 
    377380                                break; 
    378381 
    379382                        case 1: /* SEEK_CUR */ 
    380                                 file->position+=distance; 
     383                                temp = file->position+distance; 
    381384                                break; 
    382385 
    383386                        case 2: /* SEEK_END */ 
    384                                 file->position=file->vNode->size-distance; 
     387                                if (!file->vNode) 
     388                                        return -EINVAL; 
     389                                temp =file->vNode->size - distance; 
    385390                                break; 
     391                                 
     392                        default: 
     393                                KePrint("Invalid, %d\n", whence); 
     394                                return -EINVAL; 
    386395                } 
    387396        } 
     397         
     398        if (temp < 0) 
     399                return -EINVAL; 
     400                 
     401        if (temp != file->position) 
     402                file->position = temp; /* May want to adjust readahead at this point */ 
    388403 
    389404        return file->position; 
     
    540555        struct File file; 
    541556 
     557        /* FIXME: Should we allocate a fd this early? */ 
    542558        fd=VfsGetFreeFd(current); 
    543559 
     
    572588 */ 
    573589 
    574 int SysRead(int fd,BYTE* buffer,DWORD amount) 
     590int SysRead(int fd, BYTE* buffer, DWORD amount) 
    575591{ 
    576592        struct File* file=FileGet(fd); 
     
    598614                return -EFAULT; 
    599615 
     616//      KePrint("SysWrite(%d, %#X, %#X)\n", fd, data, amount); 
     617 
    600618        return DoWriteFile(file,data,amount); 
    601619} 
     
    721739} 
    722740 
     741/* TODO: Create sync function for file operations. */ 
    723742int SysFileSync(int fd) 
    724743{ 
     
    729748 
    730749        VNodeWrite(file->vNode); 
     750         
    731751        return BlockSyncDevice(file->vNode->superBlock->sDevice); 
    732752} 
     
    753773                err=file->vNode->vNodeOps->truncate(file->vNode,length); 
    754774                if (!err) 
     775                { 
    755776                        file->vNode->size=length; 
     777                         
     778                        if (file->position > length) 
     779                                file->position = length; 
     780                } 
    756781        }else 
    757782                err=-ENOTIMPL; 
     
    775800        if (UNLIKELY(!file)) 
    776801                return -EBADF; 
    777  
     802                 
    778803        return DoSeekFile(file,distance,whence); 
    779804}