summaryrefslogtreecommitdiff
path: root/libio
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-10-25 09:11:53 +0000
committerUlrich Drepper <drepper@redhat.com>1998-10-25 09:11:53 +0000
commit4a582094c28099144dac9528174ce7c0be72c0fd (patch)
tree647f7c06d86df0e42887c2db744578bf71a991fc /libio
parent88455219c104124f82cc11d038b17cb249c4b6bd (diff)
downloadglibc-4a582094c28099144dac9528174ce7c0be72c0fd.tar.gz
Update.
1998-10-25 Ulrich Drepper <drepper@cygnus.com> * include/features.h: Define __USE_POSIS199506 is _POSIX_C_SOURCE is greater or equal than 199506L. * sysdeps/generic/bits/types.h (__fd_set): Define element as fds_bits only is __USE_XOPEN. Otherwise use __fds_bits. * sysdeps/unix/sysv/linux/alpha/bits/types.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/types.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h: Likewise. * sysdeps/unix/sysv/linux/bits/types.h: Likewise. * sysdeps/unix/sysv/sysv4/solaris2/bits/types.h: Likewise. 1998-10-24 H.J. Lu <hjl@gnu.org> * locale/programs/charmap.c (parse_charmap): Accept tok_string for <code_set_name>. 1998-10-25 H.J. Lu <hjl@gnu.org> * locale/programs/ld-ctype.c (ctype_finish): Also check <space>. 1998-10-25 Ulrich Drepper <drepper@cygnus.com> * signal/signal.h: Include bits/sigthread.h only if __USE_POSIX199506. * sysdeps/unix/sysv/linux/bits/types.h: Include pthreadtypes.h only if __USE_POSIX199506 or __USE_UNIX98. 1998-10-24 22:34 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu> * string/bits/string2.h: Inline strdup+friends only if __USE_MISC || __USE_GNU (prevents namespace pollution). 1998-10-24 H.J. Lu <hjl@gnu.org> * sysdeps/unix/sysv/linux/alpha/bits/fcntl.h (LOCK_SH, LOCK_EX, LOCK_NB, LOCK_UN): Protect with __USE_BSD. * sysdeps/unix/sysv/linux/i386/bits/fcntl.h (LOCK_SH, LOCK_EX, LOCK_NB, LOCK_UN): Likewise. * sysdeps/unix/sysv/linux/mips/bits/fcntl.h (LOCK_SH, LOCK_EX, LOCK_NB, LOCK_UN): Likewise. * sysdeps/unix/sysv/linux/sparc/bits/fcntl.h (LOCK_SH, LOCK_EX, LOCK_NB, LOCK_UN): Likewise. * sysdeps/unix/sysv/linux/bits/fcntl.h (LOCK_SH, LOCK_EX, LOCK_NB, LOCK_UN): Likewise. 1998-10-24 H.J. Lu <hjl@gnu.org> * libio/ioseekoff.c (_IO_seekoff): Check the valid dir value. * libio/rewind.c (rewind): Clear the error. 1998-10-24 H.J. Lu <hjl@gnu.org> * grp/grp.h (getgrent_r, getgrgid_r, getgrnam_r): Add "__" to "buffer". 1998-10-24 H.J. Lu <hjl@gnu.org> * sysdeps/unix/sysv/linux/alpha/bits/time.h (timeval): Protect with __need_timeval. * sysdeps/unix/sysv/linux/mips/bits/time.h (timeval): Likewise. * sysdeps/unix/sysv/linux/bits/time.h (timeval): Likewise. 1998-10-24 H.J. Lu <hjl@gnu.org> * signal/signal.h (timespec, siginfo_t, sigwaitinfo, sigtimedwait, sigqueue): Protect with __USE_POSIX199309. 1998-10-24 H.J. Lu <hjl@gnu.org> * time/time.h (timespec): Protect with __USE_POSIX199309 instead of __USE_POSIX. 1998-10-24 H.J. Lu <hjl@gnu.org> * libio/fileops.c (_IO_new_file_seekoff): Always resync with the kernel file offset. * libio/oldfileops.c (_IO_old_file_seekoff): Likewise.
Diffstat (limited to 'libio')
-rw-r--r--libio/fileops.c16
-rw-r--r--libio/ioseekoff.c14
-rw-r--r--libio/oldfileops.c16
-rw-r--r--libio/rewind.c1
4 files changed, 40 insertions, 7 deletions
diff --git a/libio/fileops.c b/libio/fileops.c
index be65d42fb2..8930f6f3cd 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -567,7 +567,7 @@ _IO_new_file_seekoff (fp, offset, dir, mode)
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
{
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
- return offset;
+ goto resync;
}
}
#ifdef TODO
@@ -579,7 +579,7 @@ _IO_new_file_seekoff (fp, offset, dir, mode)
if (ignore (to_skip) != to_skip)
goto dumb;
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
- return offset;
+ goto resync;
}
#endif
}
@@ -590,7 +590,7 @@ _IO_new_file_seekoff (fp, offset, dir, mode)
_IO_switch_to_backup_area (fp);
gbump (fp->_IO_read_end + rel_offset - fp->_IO_read_ptr);
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
- return offset;
+ goto resync;
}
#endif
}
@@ -646,6 +646,16 @@ _IO_new_file_seekoff (fp, offset, dir, mode)
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
}
return result;
+
+resync:
+ /* We need to do it since it is possible that the file offset in
+ the kernel may be changed behind our back. It may happen when
+ we fopen a file and then do a fork. One process may access the
+ the file and the kernel file offset will be changed. */
+ if (fp->_offset >= 0)
+ _IO_SYSSEEK (fp, fp->_offset, 0);
+
+ return offset;
}
_IO_ssize_t
diff --git a/libio/ioseekoff.c b/libio/ioseekoff.c
index 54a8d19f0d..4a951dd7c1 100644
--- a/libio/ioseekoff.c
+++ b/libio/ioseekoff.c
@@ -24,6 +24,13 @@
General Public License. */
#include <libioP.h>
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
_IO_fpos64_t
_IO_seekoff (fp, offset, dir, mode)
@@ -34,13 +41,18 @@ _IO_seekoff (fp, offset, dir, mode)
{
_IO_fpos64_t retval;
+ if (dir != _IO_seek_cur && dir != _IO_seek_set && dir != _IO_seek_end)
+ {
+ __set_errno (EINVAL);
+ return EOF;
+ }
+
/* If we have a backup buffer, get rid of it, since the __seekoff
callback may not know to do the right thing about it.
This may be over-kill, but it'll do for now. TODO */
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
_IO_flockfile (fp);
-
if (mode != 0 && _IO_have_backup (fp))
{
if (dir == _IO_seek_cur && _IO_in_backup (fp))
diff --git a/libio/oldfileops.c b/libio/oldfileops.c
index 59de8d8818..e0f8e65255 100644
--- a/libio/oldfileops.c
+++ b/libio/oldfileops.c
@@ -514,7 +514,7 @@ _IO_old_file_seekoff (fp, offset, dir, mode)
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + rel_offset,
fp->_IO_read_end);
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
- return offset;
+ goto resync;
}
#ifdef TODO
/* If we have streammarkers, seek forward by reading ahead. */
@@ -524,7 +524,7 @@ _IO_old_file_seekoff (fp, offset, dir, mode)
- (fp->_IO_read_ptr - fp->_IO_read_base);
if (ignore (to_skip) != to_skip)
goto dumb;
- return offset;
+ goto resync;
}
#endif
}
@@ -534,7 +534,7 @@ _IO_old_file_seekoff (fp, offset, dir, mode)
if (!_IO_in_backup (fp))
_IO_switch_to_backup_area (fp);
gbump (fp->_IO_read_end + rel_offset - fp->_IO_read_ptr);
- return offset;
+ goto resync;
}
#endif
}
@@ -590,6 +590,16 @@ _IO_old_file_seekoff (fp, offset, dir, mode)
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
}
return result;
+
+resync:
+ /* We need to do it since it is possible that the file offset in
+ the kernel may be changed behind our back. It may happen when
+ we fopen a file and then do a fork. One process may access the
+ the file and the kernel file offset will be changed. */
+ if (fp->_old_offset >= 0)
+ _IO_SYSSEEK (fp, fp->_old_offset, 0);
+
+ return offset;
}
_IO_ssize_t
diff --git a/libio/rewind.c b/libio/rewind.c
index fb6afbc77a..a9ea36edb6 100644
--- a/libio/rewind.c
+++ b/libio/rewind.c
@@ -34,6 +34,7 @@ rewind (fp)
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
_IO_flockfile (fp);
_IO_rewind (fp);
+ _IO_clearerr (fp);
_IO_funlockfile (fp);
_IO_cleanup_region_end (0);
}