8868
|
1 /* An ftello() function that works around platform bugs. |
|
2 Copyright (C) 2007 Free Software Foundation, Inc. |
|
3 |
|
4 This program is free software; you can redistribute it and/or modify |
|
5 it under the terms of the GNU General Public License as published by |
|
6 the Free Software Foundation; either version 2, or (at your option) |
|
7 any later version. |
|
8 |
|
9 This program is distributed in the hope that it will be useful, |
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 GNU General Public License for more details. |
|
13 |
|
14 You should have received a copy of the GNU General Public License along |
|
15 with this program; if not, write to the Free Software Foundation, |
|
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
|
17 |
|
18 #include <config.h> |
|
19 |
|
20 /* Specification. */ |
|
21 #include <stdio.h> |
|
22 |
8872
|
23 /* Get lseek. */ |
|
24 #include <unistd.h> |
|
25 |
8868
|
26 #undef ftello |
|
27 #if !HAVE_FTELLO |
8872
|
28 # undef ftell |
8868
|
29 # define ftello ftell |
|
30 #endif |
|
31 |
|
32 off_t |
|
33 rpl_ftello (FILE *fp) |
|
34 { |
8872
|
35 #if LSEEK_PIPE_BROKEN |
|
36 /* mingw gives bogus answers rather than failure on non-seekable files. */ |
|
37 if (lseek (fileno (fp), 0, SEEK_CUR) == -1) |
|
38 return -1; |
|
39 #endif |
|
40 |
8868
|
41 #if defined __SL64 && defined __SCLE /* Cygwin */ |
|
42 if ((fp->_flags & __SL64) == 0) |
|
43 { |
|
44 /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit |
|
45 mode; but has an ftello that requires 64-bit mode. */ |
|
46 FILE *tmp = fopen ("/dev/null", "r"); |
|
47 if (!tmp) |
|
48 return -1; |
|
49 fp->_flags |= __SL64; |
|
50 fp->_seek64 = tmp->_seek64; |
|
51 fclose (tmp); |
|
52 } |
|
53 #endif |
|
54 return ftello (fp); |
|
55 } |