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