From 30d412469c930fe4150ad2b9a321eea2747ec6f4 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 7 May 2012 16:30:37 +0200 Subject: Filesystem: PR1398: Fix lseek() mechanic According to POSIX the lseek() function shall not, by itself, extend the size of a file. Remove the size field of rtems_libio_t. A file has only one size but may have multiple open file descriptors. Thus a file size field in the file descriptor may lead to inconsistencies. New default handlers rtems_filesystem_default_lseek_file() and rtems_filesystem_default_lseek_directory(). --- cpukit/libcsupport/src/lseek.c | 54 +----------------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) (limited to 'cpukit/libcsupport/src/lseek.c') diff --git a/cpukit/libcsupport/src/lseek.c b/cpukit/libcsupport/src/lseek.c index 7c1f76b36b..fa18db33f4 100644 --- a/cpukit/libcsupport/src/lseek.c +++ b/cpukit/libcsupport/src/lseek.c @@ -21,65 +21,13 @@ off_t lseek( int fd, off_t offset, int whence ) { - off_t rv = 0; rtems_libio_t *iop; - off_t reference_offset; - off_t old_offset; - off_t new_offset; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); rtems_libio_check_is_open(iop); - old_offset = iop->offset; - switch ( whence ) { - case SEEK_SET: - reference_offset = 0; - break; - case SEEK_CUR: - reference_offset = old_offset; - break; - case SEEK_END: - reference_offset = iop->size; - break; - default: - errno = EINVAL; - rv = (off_t) -1; - break; - } - new_offset = reference_offset + offset; - - if ( rv == 0 ) { - if ( - (reference_offset >= 0 && new_offset >= offset) - || (reference_offset < 0 && new_offset <= offset) - ) { - switch ( rtems_filesystem_node_type( &iop->pathinfo ) ) { - case RTEMS_FILESYSTEM_DIRECTORY: - case RTEMS_FILESYSTEM_MEMORY_FILE: - if ( new_offset < 0 ) { - errno = EINVAL; - rv = (off_t) -1; - } - break; - default: - break; - } - - if ( rv == 0 ) { - iop->offset = new_offset; - rv = (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence ); - if ( rv == (off_t) -1 ) { - iop->offset = old_offset; - } - } - } else { - errno = EOVERFLOW; - rv = (off_t) -1; - } - } - - return rv; + return (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence ); } /* -- cgit v1.2.3