summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src/lseek.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-05-07 16:30:37 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-05-11 13:58:43 +0200
commit30d412469c930fe4150ad2b9a321eea2747ec6f4 (patch)
treed91c4bfaa8e968a6da87ba9b5860502758d4a26f /cpukit/libcsupport/src/lseek.c
parentpc386 - Clock driver compiles again plus clean up (diff)
downloadrtems-30d412469c930fe4150ad2b9a321eea2747ec6f4.tar.bz2
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().
Diffstat (limited to 'cpukit/libcsupport/src/lseek.c')
-rw-r--r--cpukit/libcsupport/src/lseek.c54
1 files changed, 1 insertions, 53 deletions
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 );
}
/*