@@ -301,7 +301,7 @@ int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable)
301301 return fd ;
302302}
303303
304- static ssize_t zvfs_rw (int fd , void * buf , size_t sz , bool is_write )
304+ ssize_t zvfs_read (int fd , void * buf , size_t sz )
305305{
306306 ssize_t res ;
307307
@@ -310,57 +310,63 @@ static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write)
310310 }
311311
312312 (void )k_mutex_lock (& fdtable [fd ].lock , K_FOREVER );
313-
314- if (is_write ) {
315- if (fdtable [fd ].vtable -> write_offset == NULL ) {
316- res = -1 ;
317- errno = EIO ;
318- } else {
319- res = fdtable [fd ].vtable -> write_offset (fdtable [fd ].obj , buf , sz ,
320- fdtable [fd ].offset );
321- }
322- } else {
323- if (fdtable [fd ].vtable -> read == NULL ) {
324- res = -1 ;
325- errno = EIO ;
326- } else {
327- res = fdtable [fd ].vtable -> read_offset (fdtable [fd ].obj , buf , sz ,
328- fdtable [fd ].offset );
329- }
330- }
313+ res = fdtable [fd ].vtable -> read_offs (fdtable [fd ].obj , buf , sz , fdtable [fd ].offset );
331314 if (res > 0 ) {
332- fdtable [fd ].offset += res ;
315+ switch (fdtable [fd ].mode & ZVFS_MODE_IFMT ) {
316+ case ZVFS_MODE_IFDIR :
317+ case ZVFS_MODE_IFBLK :
318+ case ZVFS_MODE_IFSHM :
319+ case ZVFS_MODE_IFREG :
320+ fdtable [fd ].offset += res ;
321+ break ;
322+ default :
323+ break ;
324+ }
333325 }
334-
335- unlock :
336326 k_mutex_unlock (& fdtable [fd ].lock );
337327
338328 return res ;
339329}
340330
341- ssize_t zvfs_read (int fd , void * buf , size_t sz )
342- {
343- return zvfs_rw (fd , buf , sz , false);
344- }
345-
346331ssize_t zvfs_write (int fd , const void * buf , size_t sz )
347332{
348- return zvfs_rw (fd , (void * )buf , sz , true);
333+ ssize_t res ;
334+
335+ if (_check_fd (fd ) < 0 ) {
336+ return -1 ;
337+ }
338+
339+ (void )k_mutex_lock (& fdtable [fd ].lock , K_FOREVER );
340+ res = fdtable [fd ].vtable -> write_offs (fdtable [fd ].obj , buf , sz , fdtable [fd ].offset );
341+ if (res > 0 ) {
342+ switch (fdtable [fd ].mode & ZVFS_MODE_IFMT ) {
343+ case ZVFS_MODE_IFDIR :
344+ case ZVFS_MODE_IFBLK :
345+ case ZVFS_MODE_IFSHM :
346+ case ZVFS_MODE_IFREG :
347+ fdtable [fd ].offset += res ;
348+ break ;
349+ default :
350+ break ;
351+ }
352+ }
353+ k_mutex_unlock (& fdtable [fd ].lock );
354+
355+ return res ;
349356}
350357
351358int zvfs_close (int fd )
352359{
353- int res = 0 ;
360+ int res ;
354361
355362 if (_check_fd (fd ) < 0 ) {
356363 return -1 ;
357364 }
358365
359366 (void )k_mutex_lock (& fdtable [fd ].lock , K_FOREVER );
360- if (fdtable [fd ].vtable -> close != NULL ) {
361- /* close() is optional - e.g. stdinout_fd_op_vtable */
362- res = fdtable [fd ].vtable -> close (fdtable [fd ].obj );
363- }
367+
368+ res = fdtable [fd ].vtable -> close (fdtable [fd ].obj );
369+
364370 k_mutex_unlock (& fdtable [fd ].lock );
365371
366372 zvfs_free_fd (fd );
0 commit comments