]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/ioseekoff.c
(_IO_seekoff_unlocked): Add glibc 2.0 compatibility in wide stream test.
[thirdparty/glibc.git] / libio / ioseekoff.c
CommitLineData
bbdef797
UD
1/* Copyright (C) 1993, 1997, 1998, 1999, 2001, 2002, 2003
2 Free Software Foundation, Inc.
41bdb6e2 3 This file is part of the GNU C Library.
40a55d20 4
41bdb6e2
AJ
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
40a55d20 9
41bdb6e2
AJ
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
40a55d20 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 13 Lesser General Public License for more details.
40a55d20 14
41bdb6e2
AJ
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA.
40a55d20 19
41bdb6e2
AJ
20 As a special exception, if you link the code in this file with
21 files compiled with a GNU compiler to produce an executable,
22 that does not cause the resulting executable to be covered by
23 the GNU Lesser General Public License. This exception does not
24 however invalidate any other reasons why the executable file
25 might be covered by the GNU Lesser General Public License.
26 This exception applies to code released by its copyright holders
27 in files containing the exception. */
96aa2d94 28
40a982a9 29#include <stdlib.h>
96aa2d94 30#include <libioP.h>
d64b6ad0
UD
31#include <errno.h>
32#ifndef errno
33extern int errno;
34#endif
35#ifndef __set_errno
36# define __set_errno(Val) errno = (Val)
37#endif
96aa2d94 38
d64b6ad0 39_IO_off64_t
52a16e58 40_IO_seekoff_unlocked (fp, offset, dir, mode)
40a55d20 41 _IO_FILE *fp;
dfd2257a 42 _IO_off64_t offset;
40a55d20
UD
43 int dir;
44 int mode;
96aa2d94 45{
d64b6ad0
UD
46 if (dir != _IO_seek_cur && dir != _IO_seek_set && dir != _IO_seek_end)
47 {
48 __set_errno (EINVAL);
49 return EOF;
4a582094
UD
50 }
51
96aa2d94
RM
52 /* If we have a backup buffer, get rid of it, since the __seekoff
53 callback may not know to do the right thing about it.
54 This may be over-kill, but it'll do for now. TODO */
77fe0b9c 55 if (mode != 0 && ((_IO_fwide (fp, 0) < 0 && _IO_have_backup (fp))
02b3c905
UD
56 || (
57#if defined _LIBC && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
58 __builtin_expect (&_IO_stdin_used != NULL, 1) &&
59#endif
60 _IO_fwide (fp, 0) > 0 && _IO_have_wbackup (fp))
61 ))
96aa2d94
RM
62 {
63 if (dir == _IO_seek_cur && _IO_in_backup (fp))
40a982a9 64 {
bbdef797 65 if (_IO_vtable_offset (fp) != 0 || fp->_mode <= 0)
40a982a9
UD
66 offset -= fp->_IO_read_end - fp->_IO_read_ptr;
67 else
68 abort ();
69 }
77fe0b9c
UD
70 if (_IO_fwide (fp, 0) < 0)
71 INTUSE(_IO_free_backup_area) (fp);
72 else
73 INTUSE(_IO_free_wbackup_area) (fp);
96aa2d94 74 }
00bc5db0 75
52a16e58
UD
76 return _IO_SEEKOFF (fp, offset, dir, mode);
77}
78
79
80_IO_off64_t
81_IO_seekoff (fp, offset, dir, mode)
82 _IO_FILE *fp;
83 _IO_off64_t offset;
84 int dir;
85 int mode;
86{
87 _IO_off64_t retval;
88
89 _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
90 _IO_flockfile (fp);
91
92 retval = _IO_seekoff_unlocked (fp, offset, dir, mode);
96aa2d94 93
c0fb8a56
UD
94 _IO_funlockfile (fp);
95 _IO_cleanup_region_end (0);
61eb22d3 96 return retval;
96aa2d94 97}