Mercurial > flash_v2
comparison packages/io/fileio/current/src/io.cxx @ 130:eb9fd8c04db3 ecos-sw-2000-10-23
Merge from eCos master repository on 2000-10-23-17:01:37-BST
| author | jlarmour |
|---|---|
| date | Mon, 23 Oct 2000 17:10:57 +0000 |
| parents | 6ed91473a1cd |
| children | d2f49caf9e38 |
comparison
equal
deleted
inserted
replaced
| 129:605a0fc6f385 | 130:eb9fd8c04db3 |
|---|---|
| 64 #define LOCK_FILE( fp ) cyg_file_lock( fp, fp->f_syncmode ) | 64 #define LOCK_FILE( fp ) cyg_file_lock( fp, fp->f_syncmode ) |
| 65 | 65 |
| 66 #define UNLOCK_FILE( fp ) cyg_file_unlock( fp, fp->f_syncmode ) | 66 #define UNLOCK_FILE( fp ) cyg_file_unlock( fp, fp->f_syncmode ) |
| 67 | 67 |
| 68 //========================================================================== | 68 //========================================================================== |
| 69 // Read from a file | 69 // Read from or write to a file |
| 70 | 70 // This is a common routine for doing both read and write |
| 71 __externC ssize_t read( int fd, void *buf, size_t len ) | 71 // operations. The direction argument controls slight the differences |
| 72 // between them. | |
| 73 | |
| 74 static ssize_t readwrite( int fd, void *buf, size_t len, int direction ) | |
| 72 { | 75 { |
| 73 FILEIO_ENTRY(); | 76 FILEIO_ENTRY(); |
| 74 | 77 |
| 75 CYG_CANCELLATION_POINT; | 78 CYG_CANCELLATION_POINT; |
| 76 | 79 |
| 84 fp = cyg_fp_get( fd ); | 87 fp = cyg_fp_get( fd ); |
| 85 | 88 |
| 86 if( fp == NULL ) | 89 if( fp == NULL ) |
| 87 FILEIO_RETURN(EBADF); | 90 FILEIO_RETURN(EBADF); |
| 88 | 91 |
| 89 if( (fp->f_flag & CYG_FREAD) == 0 ) | 92 if( (fp->f_flag & direction) == 0 ) |
| 90 { | 93 { |
| 91 cyg_fp_free( fp ); | 94 cyg_fp_free( fp ); |
| 92 FILEIO_RETURN(EBADF); | 95 FILEIO_RETURN(EBADF); |
| 93 } | 96 } |
| 94 | 97 |
| 95 cyg_uio uio; | 98 cyg_uio uio; |
| 96 cyg_iovec iov; | 99 cyg_iovec iov; |
| 97 | 100 cyg_fileop_readwrite *op; |
| 101 | |
| 98 iov.iov_base = buf; | 102 iov.iov_base = buf; |
| 99 iov.iov_len = len; | 103 iov.iov_len = len; |
| 100 uio.uio_iov = &iov; | 104 uio.uio_iov = &iov; |
| 101 uio.uio_iovcnt = 1; | 105 uio.uio_iovcnt = 1; |
| 102 uio.uio_resid = len; | 106 uio.uio_resid = len; |
| 103 uio.uio_rw = UIO_READ; | |
| 104 uio.uio_segflg = UIO_USERSPACE; | 107 uio.uio_segflg = UIO_USERSPACE; |
| 105 | 108 |
| 106 cnt = len; | 109 cnt = len; |
| 107 | 110 |
| 108 LOCK_FILE( fp ); | 111 if( direction == O_RDONLY ) |
| 109 | 112 uio.uio_rw = UIO_READ, op = fp->f_ops->fo_read; |
| 110 ret = fp->f_ops->fo_read( fp, &uio ); | 113 else |
| 111 | 114 uio.uio_rw = UIO_WRITE, op = fp->f_ops->fo_write; |
| 115 | |
| 116 | |
| 117 LOCK_FILE( fp ); | |
| 118 | |
| 119 ret = op( fp, &uio ); | |
| 120 | |
| 112 UNLOCK_FILE( fp ); | 121 UNLOCK_FILE( fp ); |
| 113 | 122 |
| 114 cnt -= uio.uio_resid; | 123 cnt -= uio.uio_resid; |
| 115 | 124 |
| 116 cyg_fp_free( fp ); | 125 cyg_fp_free( fp ); |
| 120 CYG_REPORT_RETVAL(cnt); | 129 CYG_REPORT_RETVAL(cnt); |
| 121 return cnt; | 130 return cnt; |
| 122 } | 131 } |
| 123 | 132 |
| 124 //========================================================================== | 133 //========================================================================== |
| 134 // Read from file | |
| 135 | |
| 136 __externC ssize_t read( int fd, void *buf, size_t len ) | |
| 137 { | |
| 138 return readwrite( fd, buf, len, O_RDONLY ); | |
| 139 } | |
| 140 | |
| 141 //========================================================================== | |
| 125 // Write to a file | 142 // Write to a file |
| 126 | 143 |
| 127 __externC ssize_t write( int fd, const void *buf, size_t len ) | 144 __externC ssize_t write( int fd, const void *buf, size_t len ) |
| 128 { | 145 { |
| 129 FILEIO_ENTRY(); | 146 return readwrite( fd, (void *)buf, len, O_WRONLY ); |
| 130 | |
| 131 CYG_CANCELLATION_POINT; | |
| 132 | |
| 133 ssize_t cnt; | |
| 134 int ret; | |
| 135 cyg_file *fp; | |
| 136 | |
| 137 if( len > SSIZE_MAX ) | |
| 138 FILEIO_RETURN(EINVAL); | |
| 139 | |
| 140 fp = cyg_fp_get( fd ); | |
| 141 | |
| 142 if( fp == NULL ) | |
| 143 FILEIO_RETURN(EBADF); | |
| 144 | |
| 145 if( (fp->f_flag & CYG_FWRITE) == 0) | |
| 146 { | |
| 147 cyg_fp_free( fp ); | |
| 148 FILEIO_RETURN(EBADF); | |
| 149 } | |
| 150 cyg_uio uio; | |
| 151 cyg_iovec iov; | |
| 152 | |
| 153 iov.iov_base = (void *)buf; | |
| 154 iov.iov_len = len; | |
| 155 uio.uio_iov = &iov; | |
| 156 uio.uio_iovcnt = 1; | |
| 157 uio.uio_resid = len; | |
| 158 uio.uio_rw = UIO_WRITE; | |
| 159 uio.uio_segflg = UIO_USERSPACE; | |
| 160 | |
| 161 cnt = len; | |
| 162 | |
| 163 LOCK_FILE( fp ); | |
| 164 | |
| 165 ret = fp->f_ops->fo_write( fp, &uio ); | |
| 166 | |
| 167 UNLOCK_FILE( fp ); | |
| 168 | |
| 169 cnt -= uio.uio_resid; | |
| 170 | |
| 171 cyg_fp_free( fp ); | |
| 172 | |
| 173 CYG_CANCELLATION_POINT; | |
| 174 | |
| 175 CYG_REPORT_RETVAL(cnt); | |
| 176 return cnt; | |
| 177 } | 147 } |
| 178 | 148 |
| 179 //========================================================================== | 149 //========================================================================== |
| 180 // Close a file | 150 // Close a file |
| 181 | 151 |
