]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/ioftell.c
Update.
[thirdparty/glibc.git] / libio / ioftell.c
CommitLineData
77fe0b9c 1/* Copyright (C) 1993, 1995-2000, 2001, 2002 Free Software Foundation, Inc.
41bdb6e2 2 This file is part of the GNU C Library.
96aa2d94 3
41bdb6e2
AJ
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
96aa2d94 8
41bdb6e2
AJ
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
40a55d20 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
96aa2d94 13
41bdb6e2
AJ
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17 02111-1307 USA.
96aa2d94 18
41bdb6e2
AJ
19 As a special exception, if you link the code in this file with
20 files compiled with a GNU compiler to produce an executable,
21 that does not cause the resulting executable to be covered by
22 the GNU Lesser General Public License. This exception does not
23 however invalidate any other reasons why the executable file
24 might be covered by the GNU Lesser General Public License.
25 This exception applies to code released by its copyright holders
26 in files containing the exception. */
96aa2d94
RM
27
28#include "libioP.h"
ef52edfc 29#include <stdlib.h>
96aa2d94
RM
30#include <errno.h>
31/* ANSI explicily requires setting errno to a positive value on failure. */
32
33long int
34_IO_ftell (fp)
40a55d20 35 _IO_FILE *fp;
96aa2d94 36{
3efdabe7 37 _IO_off64_t pos;
96aa2d94 38 CHECK_FILE (fp, -1L);
68dbb3a6 39 _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
7c713e28 40 _IO_flockfile (fp);
52a16e58 41 pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
00bc5db0 42 if (_IO_in_backup (fp))
d64b6ad0 43 {
076bfcf6 44 if (fp->_vtable_offset != 0 || fp->_mode <= 0)
d64b6ad0 45 pos -= fp->_IO_save_end - fp->_IO_save_base;
d64b6ad0 46 }
c0fb8a56
UD
47 _IO_funlockfile (fp);
48 _IO_cleanup_region_end (0);
96aa2d94
RM
49 if (pos == _IO_pos_BAD)
50 {
51#ifdef EIO
52 if (errno == 0)
c4029823 53 __set_errno (EIO);
3efdabe7
RM
54#endif
55 return -1L;
56 }
57 if ((_IO_off64_t) (off_t) pos != pos)
58 {
59#ifdef EOVERFLOW
60 __set_errno (EOVERFLOW);
96aa2d94
RM
61#endif
62 return -1L;
63 }
d64b6ad0 64 return pos;
96aa2d94 65}
77fe0b9c 66INTDEF(_IO_ftell)
96aa2d94 67
ca34d7a7 68#ifdef weak_alias
96aa2d94 69weak_alias (_IO_ftell, ftell)
ca34d7a7 70#endif