forked from Imagelibrary/rtems
2001-08-16 Joel Sherrill <joel@OARcorp.com>
* libc/lseek.c: Modified after discussion with Eugeny S. Mints <jack@oktet.ru> to correct the behavior. There were two mistakes. First, iop->offset was incorrectly set for SEEK_END. Second, iop->offset should be left unmodified if there are errors. This modification attempts to fix both situations.
This commit is contained in:
@@ -26,15 +26,25 @@ off_t lseek(
|
||||
)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
off_t old_offset;
|
||||
off_t status;
|
||||
|
||||
rtems_libio_check_fd( fd );
|
||||
iop = rtems_libio_iop( fd );
|
||||
rtems_libio_check_is_open(iop);
|
||||
|
||||
/*
|
||||
* Check as many errors as possible before touching iop->offset.
|
||||
*/
|
||||
|
||||
if ( !iop->handlers->lseek_h )
|
||||
set_errno_and_return_minus_one( ENOTSUP );
|
||||
|
||||
/*
|
||||
* Now process the lseek().
|
||||
*/
|
||||
|
||||
old_offset = iop->offset;
|
||||
switch ( whence ) {
|
||||
case SEEK_SET:
|
||||
iop->offset = offset;
|
||||
@@ -45,18 +55,28 @@ off_t lseek(
|
||||
break;
|
||||
|
||||
case SEEK_END:
|
||||
iop->offset = iop->size - offset;
|
||||
iop->offset = iop->size + offset;
|
||||
break;
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
set_errno_and_return_minus_one( EINVAL );
|
||||
}
|
||||
|
||||
if ( !iop->handlers->lseek_h )
|
||||
set_errno_and_return_minus_one( ENOTSUP );
|
||||
/*
|
||||
* At this time, handlers assume iop->offset has the desired
|
||||
* new offset.
|
||||
*/
|
||||
|
||||
return (*iop->handlers->lseek_h)( iop, offset, whence );
|
||||
status = (*iop->handlers->lseek_h)( iop, offset, whence );
|
||||
if ( !status )
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* So if the operation failed, we have to restore iop->offset.
|
||||
*/
|
||||
|
||||
iop->offset = old_offset;
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
2001-08-16 Joel Sherrill <joel@OARcorp.com>
|
||||
|
||||
* libc/lseek.c: Modified after discussion with Eugeny S. Mints
|
||||
<jack@oktet.ru> to correct the behavior. There were two mistakes.
|
||||
First, iop->offset was incorrectly set for SEEK_END. Second,
|
||||
iop->offset should be left unmodified if there are errors.
|
||||
This modification attempts to fix both situations.
|
||||
|
||||
2001-08-16 Mike Siers <mikes@poliac.com>
|
||||
|
||||
* include/rtems/termiostypes.h, include/sys/ioccom.h:
|
||||
|
||||
@@ -26,15 +26,25 @@ off_t lseek(
|
||||
)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
off_t old_offset;
|
||||
off_t status;
|
||||
|
||||
rtems_libio_check_fd( fd );
|
||||
iop = rtems_libio_iop( fd );
|
||||
rtems_libio_check_is_open(iop);
|
||||
|
||||
/*
|
||||
* Check as many errors as possible before touching iop->offset.
|
||||
*/
|
||||
|
||||
if ( !iop->handlers->lseek_h )
|
||||
set_errno_and_return_minus_one( ENOTSUP );
|
||||
|
||||
/*
|
||||
* Now process the lseek().
|
||||
*/
|
||||
|
||||
old_offset = iop->offset;
|
||||
switch ( whence ) {
|
||||
case SEEK_SET:
|
||||
iop->offset = offset;
|
||||
@@ -45,18 +55,28 @@ off_t lseek(
|
||||
break;
|
||||
|
||||
case SEEK_END:
|
||||
iop->offset = iop->size - offset;
|
||||
iop->offset = iop->size + offset;
|
||||
break;
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
set_errno_and_return_minus_one( EINVAL );
|
||||
}
|
||||
|
||||
if ( !iop->handlers->lseek_h )
|
||||
set_errno_and_return_minus_one( ENOTSUP );
|
||||
/*
|
||||
* At this time, handlers assume iop->offset has the desired
|
||||
* new offset.
|
||||
*/
|
||||
|
||||
return (*iop->handlers->lseek_h)( iop, offset, whence );
|
||||
status = (*iop->handlers->lseek_h)( iop, offset, whence );
|
||||
if ( !status )
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* So if the operation failed, we have to restore iop->offset.
|
||||
*/
|
||||
|
||||
iop->offset = old_offset;
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -26,15 +26,25 @@ off_t lseek(
|
||||
)
|
||||
{
|
||||
rtems_libio_t *iop;
|
||||
off_t old_offset;
|
||||
off_t status;
|
||||
|
||||
rtems_libio_check_fd( fd );
|
||||
iop = rtems_libio_iop( fd );
|
||||
rtems_libio_check_is_open(iop);
|
||||
|
||||
/*
|
||||
* Check as many errors as possible before touching iop->offset.
|
||||
*/
|
||||
|
||||
if ( !iop->handlers->lseek_h )
|
||||
set_errno_and_return_minus_one( ENOTSUP );
|
||||
|
||||
/*
|
||||
* Now process the lseek().
|
||||
*/
|
||||
|
||||
old_offset = iop->offset;
|
||||
switch ( whence ) {
|
||||
case SEEK_SET:
|
||||
iop->offset = offset;
|
||||
@@ -45,18 +55,28 @@ off_t lseek(
|
||||
break;
|
||||
|
||||
case SEEK_END:
|
||||
iop->offset = iop->size - offset;
|
||||
iop->offset = iop->size + offset;
|
||||
break;
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
set_errno_and_return_minus_one( EINVAL );
|
||||
}
|
||||
|
||||
if ( !iop->handlers->lseek_h )
|
||||
set_errno_and_return_minus_one( ENOTSUP );
|
||||
/*
|
||||
* At this time, handlers assume iop->offset has the desired
|
||||
* new offset.
|
||||
*/
|
||||
|
||||
return (*iop->handlers->lseek_h)( iop, offset, whence );
|
||||
status = (*iop->handlers->lseek_h)( iop, offset, whence );
|
||||
if ( !status )
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* So if the operation failed, we have to restore iop->offset.
|
||||
*/
|
||||
|
||||
iop->offset = old_offset;
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user