@@ -467,43 +467,7 @@ static int do_write(int fd, const void *buffer, int count)
467467
468468SYSCALL_DEFINE3 (read , int , fd , void * , buffer , int , count )
469469{
470- int gfd ;
471- int ret ;
472-
473- /* FIXME Max size of buffer */
474- if (!buffer || count < 0 ) {
475- LOG_ERROR ("Invalid inputs\n" );
476- return - EINVAL ;
477- }
478-
479- mutex_lock (& vfs_lock );
480-
481- gfd = vfs_get_gfd (fd );
482-
483- /* FIXME: As for now the do_read/do_open only
484- * support regular file VFS_TYPE_FILE, VFS_TYPE_IO and pipes
485- */
486- if (open_fds [gfd ]-> type == VFS_TYPE_DIR ) {
487- mutex_unlock (& vfs_lock );
488- return - EISDIR ;
489- }
490-
491- if (!vfs_is_valid_gfd (gfd )) {
492- mutex_unlock (& vfs_lock );
493- return - EINVAL ;
494- }
495-
496- if (!open_fds [gfd ]-> fops -> read ) {
497- LOG_ERROR ("No fops read\n" );
498- mutex_unlock (& vfs_lock );
499- return - EBADF ;
500- }
501-
502- mutex_unlock (& vfs_lock );
503-
504- ret = open_fds [gfd ]-> fops -> read (gfd , buffer , count );
505-
506- return ret ;
470+ return do_read (fd , buffer , count );
507471}
508472
509473/**
@@ -705,7 +669,7 @@ SYSCALL_DEFINE2(dup2, int, oldfd, int, newfd)
705669 }
706670
707671 if (vfs_get_gfd (oldfd ) != vfs_get_gfd (newfd ))
708- __do_close (newfd );
672+ sys_do_close (newfd );
709673
710674 vfs_link_fd (newfd , vfs_get_gfd (oldfd ));
711675
@@ -885,17 +849,21 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec *, vec, unsigned l
885849
886850 for (i = 0 ; i < vlen ; i ++ ) {
887851 ret = do_write (fd , (const void * )vec [i ].iov_base , vec [i ].iov_len );
852+ ret = do_read (fd , vec [i ].iov_base , vec [i ].iov_len );
888853 if (ret < 0 ) {
889- /* Error on the fist loop --> return error code */
890- if (i == 0 )
891- total = -1 ;
854+ break ;
855+ } else if (( ret >= 0 ) && ( ret < vec [ i ]. iov_len )) {
856+ total += ret ;
892857 break ;
893858 }
894859
895860 total += ret ;
896861 }
897862
898- return total ;
863+ if (total == 0 )
864+ return ret ;
865+ else
866+ return total ;
899867}
900868
901869SYSCALL_DEFINE3 (readv , unsigned long , fd , const struct iovec * , vec ,
@@ -908,16 +876,19 @@ SYSCALL_DEFINE3(readv, unsigned long, fd, const struct iovec *, vec,
908876 for (i = 0 ; i < vlen ; i ++ ) {
909877 ret = do_read (fd , vec [i ].iov_base , vec [i ].iov_len );
910878 if (ret < 0 ) {
911- /* Error on the fist loop --> return error code */
912- if (i == 0 )
913- total = -1 ;
879+ break ;
880+ } else if (( ret >= 0 ) && ( ret < vec [ i ]. iov_len )) {
881+ total += ret ;
914882 break ;
915883 }
916884
917885 total += ret ;
918886 }
919887
920- return total ;
888+ if (total == 0 )
889+ return ret ;
890+ else
891+ return total ;
921892}
922893
923894static void vfs_gfd_init (void )
0 commit comments