]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/libioP.h
Assume that pipe2 is always available
[thirdparty/glibc.git] / libio / libioP.h
CommitLineData
bfff8b1b 1/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
41bdb6e2 2 This file is part of the GNU C Library.
40a55d20 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.
40a55d20 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
AJ
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>.
41bdb6e2
AJ
17
18 As a special exception, if you link the code in this file with
19 files compiled with a GNU compiler to produce an executable,
20 that does not cause the resulting executable to be covered by
21 the GNU Lesser General Public License. This exception does not
22 however invalidate any other reasons why the executable file
23 might be covered by the GNU Lesser General Public License.
24 This exception applies to code released by its copyright holders
25 in files containing the exception. */
96aa2d94 26
b1848fde
SP
27/* NOTE: libio is now exclusively used only by glibc since libstdc++ has its
28 own implementation. As a result, functions that were implemented for C++
29 (like *sputn) may no longer have C++ semantics. This is of course only
30 relevant for internal callers of these functions since these functions are
31 not intended for external use otherwise.
32
33 FIXME: All of the C++ cruft eventually needs to go away. */
34
e69dcccb
FW
35#include <stddef.h>
36
96aa2d94 37#include <errno.h>
a2b08ee5
UD
38#ifndef __set_errno
39# define __set_errno(Val) errno = (Val)
40#endif
41#if defined __GLIBC__ && __GLIBC__ >= 2
ec999b8e 42# include <libc-lock.h>
a2b08ee5
UD
43#else
44/*# include <comthread.h>*/
45#endif
96aa2d94 46
c6251f03
RM
47#include <math_ldbl_opt.h>
48
96aa2d94
RM
49#include "iolibio.h"
50
77fe0b9c
UD
51/* Control of exported symbols. Used in glibc. By default we don't
52 do anything. */
37ba7d66
UD
53#ifndef libc_hidden_proto
54# define libc_hidden_proto(name)
55#endif
56#ifndef libc_hidden_def
57# define libc_hidden_def(name)
58#endif
59#ifndef libc_hidden_weak
60# define libc_hidden_weak(name)
61#endif
62
4547c1a4
UD
63#ifdef __cplusplus
64extern "C" {
65#endif
96aa2d94
RM
66
67#define _IO_seek_set 0
68#define _IO_seek_cur 1
69#define _IO_seek_end 2
70
f65fd747
UD
71/* THE JUMPTABLE FUNCTIONS.
72
73 * The _IO_FILE type is used to implement the FILE type in GNU libc,
74 * as well as the streambuf class in GNU iostreams for C++.
75 * These are all the same, just used differently.
76 * An _IO_FILE (or FILE) object is allows followed by a pointer to
77 * a jump table (of pointers to functions). The pointer is accessed
c0c3f78a 78 * with the _IO_JUMPS macro. The jump table has an eccentric format,
f65fd747 79 * so as to be compatible with the layout of a C++ virtual function table.
6d52618b 80 * (as implemented by g++). When a pointer to a streambuf object is
f65fd747
UD
81 * coerced to an (_IO_FILE*), then _IO_JUMPS on the result just
82 * happens to point to the virtual function table of the streambuf.
83 * Thus the _IO_JUMPS function table used for C stdio/libio does
6d52618b 84 * double duty as the virtual function table for C++ streambuf.
f65fd747
UD
85 *
86 * The entries in the _IO_JUMPS function table (and hence also the
87 * virtual functions of a streambuf) are described below.
88 * The first parameter of each function entry is the _IO_FILE/streambuf
89 * object being acted on (i.e. the 'this' parameter).
90 */
96aa2d94 91
00404a96
RM
92#ifdef _LIBC
93# include <shlib-compat.h>
94# if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
95 /* Setting this macro disables the use of the _vtable_offset
96 bias in _IO_JUMPS_FUNCS, below. That is only needed if we
97 want to support old binaries (see oldfileops.c). */
98# define _G_IO_NO_BACKWARD_COMPAT 1
99# endif
100#endif
101
bd355af0
UD
102#if (!defined _IO_USE_OLD_IO_FILE \
103 && (!defined _G_IO_NO_BACKWARD_COMPAT || _G_IO_NO_BACKWARD_COMPAT == 0))
104# define _IO_JUMPS_OFFSET 1
8f2f08d0
RM
105#else
106# define _IO_JUMPS_OFFSET 0
bd355af0
UD
107#endif
108
e69dcccb
FW
109/* Type of MEMBER in struct type TYPE. */
110#define _IO_MEMBER_TYPE(TYPE, MEMBER) __typeof__ (((TYPE){}).MEMBER)
111
112/* Essentially ((TYPE *) THIS)->MEMBER, but avoiding the aliasing
113 violation in case THIS has a different pointer type. */
114#define _IO_CAST_FIELD_ACCESS(THIS, TYPE, MEMBER) \
115 (*(_IO_MEMBER_TYPE (TYPE, MEMBER) *)(((char *) (THIS)) \
7348824c 116 + offsetof(TYPE, MEMBER)))
e69dcccb 117
2ca8b1ee 118#define _IO_JUMPS(THIS) (THIS)->vtable
e69dcccb
FW
119#define _IO_JUMPS_FILE_plus(THIS) \
120 _IO_CAST_FIELD_ACCESS ((THIS), struct _IO_FILE_plus, vtable)
121#define _IO_WIDE_JUMPS(THIS) \
122 _IO_CAST_FIELD_ACCESS ((THIS), struct _IO_FILE, _wide_data)->_wide_vtable
123#define _IO_CHECK_WIDE(THIS) \
124 (_IO_CAST_FIELD_ACCESS ((THIS), struct _IO_FILE, _wide_data) != NULL)
7163e69e 125
c15cf13a 126#if _IO_JUMPS_OFFSET
bd355af0 127# define _IO_JUMPS_FUNC(THIS) \
db3476af
FW
128 (IO_validate_vtable \
129 (*(struct _IO_jump_t **) ((void *) &_IO_JUMPS_FILE_plus (THIS) \
130 + (THIS)->_vtable_offset)))
bbdef797 131# define _IO_vtable_offset(THIS) (THIS)->_vtable_offset
bd355af0 132#else
db3476af 133# define _IO_JUMPS_FUNC(THIS) (IO_validate_vtable (_IO_JUMPS_FILE_plus (THIS)))
bbdef797 134# define _IO_vtable_offset(THIS) 0
bd355af0 135#endif
6e06ae59 136#define _IO_WIDE_JUMPS_FUNC(THIS) _IO_WIDE_JUMPS(THIS)
28361c5e
JM
137#define JUMP_FIELD(TYPE, NAME) TYPE NAME
138#define JUMP0(FUNC, THIS) (_IO_JUMPS_FUNC(THIS)->FUNC) (THIS)
139#define JUMP1(FUNC, THIS, X1) (_IO_JUMPS_FUNC(THIS)->FUNC) (THIS, X1)
140#define JUMP2(FUNC, THIS, X1, X2) (_IO_JUMPS_FUNC(THIS)->FUNC) (THIS, X1, X2)
141#define JUMP3(FUNC, THIS, X1,X2,X3) (_IO_JUMPS_FUNC(THIS)->FUNC) (THIS, X1,X2, X3)
142#define JUMP_INIT(NAME, VALUE) VALUE
143#define JUMP_INIT_DUMMY JUMP_INIT(dummy, 0), JUMP_INIT (dummy2, 0)
144
145#define WJUMP0(FUNC, THIS) (_IO_WIDE_JUMPS_FUNC(THIS)->FUNC) (THIS)
146#define WJUMP1(FUNC, THIS, X1) (_IO_WIDE_JUMPS_FUNC(THIS)->FUNC) (THIS, X1)
147#define WJUMP2(FUNC, THIS, X1, X2) (_IO_WIDE_JUMPS_FUNC(THIS)->FUNC) (THIS, X1, X2)
148#define WJUMP3(FUNC, THIS, X1,X2,X3) (_IO_WIDE_JUMPS_FUNC(THIS)->FUNC) (THIS, X1,X2, X3)
96aa2d94 149
f65fd747 150/* The 'finish' function does any final cleaning up of an _IO_FILE object.
110215a9 151 It does not delete (free) it, but does everything else to finalize it.
f65fd747 152 It matches the streambuf::~streambuf virtual destructor. */
79937577 153typedef void (*_IO_finish_t) (_IO_FILE *, int); /* finalize */
40a55d20 154#define _IO_FINISH(FP) JUMP1 (__finish, FP, 0)
6e06ae59 155#define _IO_WFINISH(FP) WJUMP1 (__finish, FP, 0)
f65fd747
UD
156
157/* The 'overflow' hook flushes the buffer.
158 The second argument is a character, or EOF.
159 It matches the streambuf::overflow virtual function. */
79937577 160typedef int (*_IO_overflow_t) (_IO_FILE *, int);
40a55d20 161#define _IO_OVERFLOW(FP, CH) JUMP1 (__overflow, FP, CH)
6e06ae59 162#define _IO_WOVERFLOW(FP, CH) WJUMP1 (__overflow, FP, CH)
f65fd747
UD
163
164/* The 'underflow' hook tries to fills the get buffer.
165 It returns the next character (as an unsigned char) or EOF. The next
6d52618b 166 character remains in the get buffer, and the get position is not changed.
f65fd747 167 It matches the streambuf::underflow virtual function. */
79937577 168typedef int (*_IO_underflow_t) (_IO_FILE *);
40a55d20 169#define _IO_UNDERFLOW(FP) JUMP0 (__underflow, FP)
6e06ae59 170#define _IO_WUNDERFLOW(FP) WJUMP0 (__underflow, FP)
f65fd747
UD
171
172/* The 'uflow' hook returns the next character in the input stream
173 (cast to unsigned char), and increments the read position;
174 EOF is returned on failure.
175 It matches the streambuf::uflow virtual function, which is not in the
176 cfront implementation, but was added to C++ by the ANSI/ISO committee. */
40a55d20 177#define _IO_UFLOW(FP) JUMP0 (__uflow, FP)
6e06ae59 178#define _IO_WUFLOW(FP) WJUMP0 (__uflow, FP)
f65fd747
UD
179
180/* The 'pbackfail' hook handles backing up.
181 It matches the streambuf::pbackfail virtual function. */
79937577 182typedef int (*_IO_pbackfail_t) (_IO_FILE *, int);
40a55d20 183#define _IO_PBACKFAIL(FP, CH) JUMP1 (__pbackfail, FP, CH)
6e06ae59 184#define _IO_WPBACKFAIL(FP, CH) WJUMP1 (__pbackfail, FP, CH)
f65fd747
UD
185
186/* The 'xsputn' hook writes upto N characters from buffer DATA.
2b766585 187 Returns EOF or the number of character actually written.
f65fd747 188 It matches the streambuf::xsputn virtual function. */
79937577
UD
189typedef _IO_size_t (*_IO_xsputn_t) (_IO_FILE *FP, const void *DATA,
190 _IO_size_t N);
40a55d20 191#define _IO_XSPUTN(FP, DATA, N) JUMP2 (__xsputn, FP, DATA, N)
6e06ae59 192#define _IO_WXSPUTN(FP, DATA, N) WJUMP2 (__xsputn, FP, DATA, N)
f65fd747
UD
193
194/* The 'xsgetn' hook reads upto N characters into buffer DATA.
195 Returns the number of character actually read.
196 It matches the streambuf::xsgetn virtual function. */
79937577 197typedef _IO_size_t (*_IO_xsgetn_t) (_IO_FILE *FP, void *DATA, _IO_size_t N);
40a55d20 198#define _IO_XSGETN(FP, DATA, N) JUMP2 (__xsgetn, FP, DATA, N)
6e06ae59 199#define _IO_WXSGETN(FP, DATA, N) WJUMP2 (__xsgetn, FP, DATA, N)
f65fd747
UD
200
201/* The 'seekoff' hook moves the stream position to a new position
202 relative to the start of the file (if DIR==0), the current position
203 (MODE==1), or the end of the file (MODE==2).
204 It matches the streambuf::seekoff virtual function.
205 It is also used for the ANSI fseek function. */
79937577
UD
206typedef _IO_off64_t (*_IO_seekoff_t) (_IO_FILE *FP, _IO_off64_t OFF, int DIR,
207 int MODE);
40a55d20 208#define _IO_SEEKOFF(FP, OFF, DIR, MODE) JUMP3 (__seekoff, FP, OFF, DIR, MODE)
6e06ae59 209#define _IO_WSEEKOFF(FP, OFF, DIR, MODE) WJUMP3 (__seekoff, FP, OFF, DIR, MODE)
f65fd747
UD
210
211/* The 'seekpos' hook also moves the stream position,
dfd2257a 212 but to an absolute position given by a fpos64_t (seekpos).
f65fd747
UD
213 It matches the streambuf::seekpos virtual function.
214 It is also used for the ANSI fgetpos and fsetpos functions. */
215/* The _IO_seek_cur and _IO_seek_end options are not allowed. */
79937577 216typedef _IO_off64_t (*_IO_seekpos_t) (_IO_FILE *, _IO_off64_t, int);
40a55d20 217#define _IO_SEEKPOS(FP, POS, FLAGS) JUMP2 (__seekpos, FP, POS, FLAGS)
6e06ae59 218#define _IO_WSEEKPOS(FP, POS, FLAGS) WJUMP2 (__seekpos, FP, POS, FLAGS)
f65fd747
UD
219
220/* The 'setbuf' hook gives a buffer to the file.
221 It matches the streambuf::setbuf virtual function. */
79937577 222typedef _IO_FILE* (*_IO_setbuf_t) (_IO_FILE *, char *, _IO_ssize_t);
40a55d20 223#define _IO_SETBUF(FP, BUFFER, LENGTH) JUMP2 (__setbuf, FP, BUFFER, LENGTH)
6e06ae59 224#define _IO_WSETBUF(FP, BUFFER, LENGTH) WJUMP2 (__setbuf, FP, BUFFER, LENGTH)
f65fd747
UD
225
226/* The 'sync' hook attempts to synchronize the internal data structures
227 of the file with the external state.
228 It matches the streambuf::sync virtual function. */
79937577 229typedef int (*_IO_sync_t) (_IO_FILE *);
40a55d20 230#define _IO_SYNC(FP) JUMP0 (__sync, FP)
6e06ae59 231#define _IO_WSYNC(FP) WJUMP0 (__sync, FP)
f65fd747
UD
232
233/* The 'doallocate' hook is used to tell the file to allocate a buffer.
234 It matches the streambuf::doallocate virtual function, which is not
235 in the ANSI/ISO C++ standard, but is part traditional implementations. */
79937577 236typedef int (*_IO_doallocate_t) (_IO_FILE *);
40a55d20 237#define _IO_DOALLOCATE(FP) JUMP0 (__doallocate, FP)
6e06ae59 238#define _IO_WDOALLOCATE(FP) WJUMP0 (__doallocate, FP)
f65fd747
UD
239
240/* The following four hooks (sysread, syswrite, sysclose, sysseek, and
241 sysstat) are low-level hooks specific to this implementation.
6d52618b 242 There is no correspondence in the ANSI/ISO C++ standard library.
f65fd747
UD
243 The hooks basically correspond to the Unix system functions
244 (read, write, close, lseek, and stat) except that a _IO_FILE*
c0c3f78a 245 parameter is used instead of an integer file descriptor; the default
f65fd747
UD
246 implementation used for normal files just calls those functions.
247 The advantage of overriding these functions instead of the higher-level
248 ones (underflow, overflow etc) is that you can leave all the buffering
249 higher-level functions. */
250
251/* The 'sysread' hook is used to read data from the external file into
252 an existing buffer. It generalizes the Unix read(2) function.
253 It matches the streambuf::sys_read virtual function, which is
6d52618b 254 specific to this implementation. */
79937577 255typedef _IO_ssize_t (*_IO_read_t) (_IO_FILE *, void *, _IO_ssize_t);
40a55d20 256#define _IO_SYSREAD(FP, DATA, LEN) JUMP2 (__read, FP, DATA, LEN)
6e06ae59 257#define _IO_WSYSREAD(FP, DATA, LEN) WJUMP2 (__read, FP, DATA, LEN)
f65fd747
UD
258
259/* The 'syswrite' hook is used to write data from an existing buffer
260 to an external file. It generalizes the Unix write(2) function.
261 It matches the streambuf::sys_write virtual function, which is
6d52618b 262 specific to this implementation. */
79937577 263typedef _IO_ssize_t (*_IO_write_t) (_IO_FILE *, const void *, _IO_ssize_t);
40a55d20 264#define _IO_SYSWRITE(FP, DATA, LEN) JUMP2 (__write, FP, DATA, LEN)
6e06ae59 265#define _IO_WSYSWRITE(FP, DATA, LEN) WJUMP2 (__write, FP, DATA, LEN)
f65fd747
UD
266
267/* The 'sysseek' hook is used to re-position an external file.
268 It generalizes the Unix lseek(2) function.
269 It matches the streambuf::sys_seek virtual function, which is
6d52618b 270 specific to this implementation. */
79937577 271typedef _IO_off64_t (*_IO_seek_t) (_IO_FILE *, _IO_off64_t, int);
40a55d20 272#define _IO_SYSSEEK(FP, OFFSET, MODE) JUMP2 (__seek, FP, OFFSET, MODE)
6e06ae59 273#define _IO_WSYSSEEK(FP, OFFSET, MODE) WJUMP2 (__seek, FP, OFFSET, MODE)
f65fd747
UD
274
275/* The 'sysclose' hook is used to finalize (close, finish up) an
276 external file. It generalizes the Unix close(2) function.
277 It matches the streambuf::sys_close virtual function, which is
278 specific to this implementation. */
79937577 279typedef int (*_IO_close_t) (_IO_FILE *); /* finalize */
40a55d20 280#define _IO_SYSCLOSE(FP) JUMP0 (__close, FP)
6e06ae59 281#define _IO_WSYSCLOSE(FP) WJUMP0 (__close, FP)
f65fd747
UD
282
283/* The 'sysstat' hook is used to get information about an external file
284 into a struct stat buffer. It generalizes the Unix fstat(2) call.
285 It matches the streambuf::sys_stat virtual function, which is
6d52618b 286 specific to this implementation. */
79937577 287typedef int (*_IO_stat_t) (_IO_FILE *, void *);
40a55d20 288#define _IO_SYSSTAT(FP, BUF) JUMP1 (__stat, FP, BUF)
6e06ae59 289#define _IO_WSYSSTAT(FP, BUF) WJUMP1 (__stat, FP, BUF)
96aa2d94 290
dfd2257a
UD
291/* The 'showmany' hook can be used to get an image how much input is
292 available. In many cases the answer will be 0 which means unknown
293 but some cases one can provide real information. */
79937577 294typedef int (*_IO_showmanyc_t) (_IO_FILE *);
dfd2257a 295#define _IO_SHOWMANYC(FP) JUMP0 (__showmanyc, FP)
6e06ae59 296#define _IO_WSHOWMANYC(FP) WJUMP0 (__showmanyc, FP)
dfd2257a
UD
297
298/* The 'imbue' hook is used to get information about the currently
299 installed locales. */
79937577 300typedef void (*_IO_imbue_t) (_IO_FILE *, void *);
dfd2257a 301#define _IO_IMBUE(FP, LOCALE) JUMP1 (__imbue, FP, LOCALE)
6e06ae59 302#define _IO_WIMBUE(FP, LOCALE) WJUMP1 (__imbue, FP, LOCALE)
dfd2257a 303
f65fd747 304
96aa2d94
RM
305#define _IO_CHAR_TYPE char /* unsigned char ? */
306#define _IO_INT_TYPE int
307
40a55d20
UD
308struct _IO_jump_t
309{
203e5603
JM
310 JUMP_FIELD(size_t, __dummy);
311 JUMP_FIELD(size_t, __dummy2);
96aa2d94
RM
312 JUMP_FIELD(_IO_finish_t, __finish);
313 JUMP_FIELD(_IO_overflow_t, __overflow);
314 JUMP_FIELD(_IO_underflow_t, __underflow);
315 JUMP_FIELD(_IO_underflow_t, __uflow);
316 JUMP_FIELD(_IO_pbackfail_t, __pbackfail);
317 /* showmany */
318 JUMP_FIELD(_IO_xsputn_t, __xsputn);
319 JUMP_FIELD(_IO_xsgetn_t, __xsgetn);
320 JUMP_FIELD(_IO_seekoff_t, __seekoff);
321 JUMP_FIELD(_IO_seekpos_t, __seekpos);
322 JUMP_FIELD(_IO_setbuf_t, __setbuf);
323 JUMP_FIELD(_IO_sync_t, __sync);
324 JUMP_FIELD(_IO_doallocate_t, __doallocate);
325 JUMP_FIELD(_IO_read_t, __read);
326 JUMP_FIELD(_IO_write_t, __write);
327 JUMP_FIELD(_IO_seek_t, __seek);
328 JUMP_FIELD(_IO_close_t, __close);
329 JUMP_FIELD(_IO_stat_t, __stat);
dfd2257a
UD
330 JUMP_FIELD(_IO_showmanyc_t, __showmanyc);
331 JUMP_FIELD(_IO_imbue_t, __imbue);
96aa2d94
RM
332#if 0
333 get_column;
334 set_column;
335#endif
336};
337
338/* We always allocate an extra word following an _IO_FILE.
f65fd747 339 This contains a pointer to the function jump table used.
96aa2d94
RM
340 This is for compatibility with C++ streambuf; the word can
341 be used to smash to a pointer to a virtual function table. */
342
40a55d20
UD
343struct _IO_FILE_plus
344{
96aa2d94 345 _IO_FILE file;
96aa2d94 346 const struct _IO_jump_t *vtable;
96aa2d94
RM
347};
348
7ea11363
UD
349#ifdef _IO_USE_OLD_IO_FILE
350/* This structure is used by the compatibility code as if it were an
351 _IO_FILE_plus, but has enough space to initialize the _mode argument
352 of an _IO_FILE_complete. */
353struct _IO_FILE_complete_plus
354{
355 struct _IO_FILE_complete file;
356 const struct _IO_jump_t *vtable;
357};
358#endif
359
2ca8b1ee
GM
360/* Special file type for fopencookie function. */
361struct _IO_cookie_file
362{
363 struct _IO_FILE_plus __fp;
364 void *__cookie;
365 _IO_cookie_io_functions_t __io_functions;
366};
367
c9fc9559
RM
368_IO_FILE *_IO_fopencookie (void *cookie, const char *mode,
369 _IO_cookie_io_functions_t io_functions);
370
371
3fc9ca4e
UD
372/* Iterator type for walking global linked list of _IO_FILE objects. */
373
73c115ed 374typedef struct _IO_FILE *_IO_ITER;
3fc9ca4e 375
96aa2d94
RM
376/* Generic functions */
377
79937577
UD
378extern void _IO_switch_to_main_get_area (_IO_FILE *) __THROW;
379extern void _IO_switch_to_backup_area (_IO_FILE *) __THROW;
0fca3153 380extern int _IO_switch_to_get_mode (_IO_FILE *);
d18ea0c5 381libc_hidden_proto (_IO_switch_to_get_mode)
db3476af 382extern void _IO_init_internal (_IO_FILE *, int) attribute_hidden;
79937577 383extern int _IO_sputbackc (_IO_FILE *, int) __THROW;
d18ea0c5 384libc_hidden_proto (_IO_sputbackc)
79937577
UD
385extern int _IO_sungetc (_IO_FILE *) __THROW;
386extern void _IO_un_link (struct _IO_FILE_plus *) __THROW;
d18ea0c5 387libc_hidden_proto (_IO_un_link)
79937577 388extern void _IO_link_in (struct _IO_FILE_plus *) __THROW;
d18ea0c5 389libc_hidden_proto (_IO_link_in)
79937577 390extern void _IO_doallocbuf (_IO_FILE *) __THROW;
d18ea0c5 391libc_hidden_proto (_IO_doallocbuf)
79937577 392extern void _IO_unsave_markers (_IO_FILE *) __THROW;
d18ea0c5 393libc_hidden_proto (_IO_unsave_markers)
79937577 394extern void _IO_setb (_IO_FILE *, char *, char *, int) __THROW;
d18ea0c5 395libc_hidden_proto (_IO_setb)
79937577 396extern unsigned _IO_adjust_column (unsigned, const char *, int) __THROW;
d18ea0c5 397libc_hidden_proto (_IO_adjust_column)
40a55d20 398#define _IO_sputn(__fp, __s, __n) _IO_XSPUTN (__fp, __s, __n)
96aa2d94 399
d18ea0c5
AS
400_IO_ssize_t _IO_least_wmarker (_IO_FILE *, wchar_t *) __THROW;
401libc_hidden_proto (_IO_least_wmarker)
79937577 402extern void _IO_switch_to_main_wget_area (_IO_FILE *) __THROW;
d18ea0c5 403libc_hidden_proto (_IO_switch_to_main_wget_area)
79937577 404extern void _IO_switch_to_wbackup_area (_IO_FILE *) __THROW;
d18ea0c5 405libc_hidden_proto (_IO_switch_to_wbackup_area)
0fca3153 406extern int _IO_switch_to_wget_mode (_IO_FILE *);
d18ea0c5 407libc_hidden_proto (_IO_switch_to_wget_mode)
79937577 408extern void _IO_wsetb (_IO_FILE *, wchar_t *, wchar_t *, int) __THROW;
d18ea0c5 409libc_hidden_proto (_IO_wsetb)
79937577 410extern wint_t _IO_sputbackwc (_IO_FILE *, wint_t) __THROW;
d18ea0c5 411libc_hidden_proto (_IO_sputbackwc)
79937577
UD
412extern wint_t _IO_sungetwc (_IO_FILE *) __THROW;
413extern void _IO_wdoallocbuf (_IO_FILE *) __THROW;
d18ea0c5 414libc_hidden_proto (_IO_wdoallocbuf)
79937577
UD
415extern void _IO_unsave_wmarkers (_IO_FILE *) __THROW;
416extern unsigned _IO_adjust_wcolumn (unsigned, const wchar_t *, int) __THROW;
000232b9 417extern _IO_off64_t get_file_offset (_IO_FILE *fp);
d64b6ad0 418
96aa2d94
RM
419/* Marker-related function. */
420
0fca3153
UD
421extern void _IO_init_marker (struct _IO_marker *, _IO_FILE *);
422extern void _IO_init_wmarker (struct _IO_marker *, _IO_FILE *);
79937577
UD
423extern void _IO_remove_marker (struct _IO_marker *) __THROW;
424extern int _IO_marker_difference (struct _IO_marker *, struct _IO_marker *)
425 __THROW;
426extern int _IO_marker_delta (struct _IO_marker *) __THROW;
427extern int _IO_wmarker_delta (struct _IO_marker *) __THROW;
428extern int _IO_seekmark (_IO_FILE *, struct _IO_marker *, int) __THROW;
429extern int _IO_seekwmark (_IO_FILE *, struct _IO_marker *, int) __THROW;
96aa2d94 430
79937577 431/* Functions for iterating global list and dealing with its lock */
3fc9ca4e 432
79937577 433extern _IO_ITER _IO_iter_begin (void) __THROW;
1d2b6e0c 434libc_hidden_proto (_IO_iter_begin)
79937577 435extern _IO_ITER _IO_iter_end (void) __THROW;
1d2b6e0c 436libc_hidden_proto (_IO_iter_end)
79937577 437extern _IO_ITER _IO_iter_next (_IO_ITER) __THROW;
1d2b6e0c 438libc_hidden_proto (_IO_iter_next)
79937577 439extern _IO_FILE *_IO_iter_file (_IO_ITER) __THROW;
1d2b6e0c 440libc_hidden_proto (_IO_iter_file)
79937577 441extern void _IO_list_lock (void) __THROW;
245eab02 442libc_hidden_proto (_IO_list_lock)
79937577 443extern void _IO_list_unlock (void) __THROW;
245eab02 444libc_hidden_proto (_IO_list_unlock)
79937577 445extern void _IO_list_resetlock (void) __THROW;
245eab02 446libc_hidden_proto (_IO_list_resetlock)
3fc9ca4e 447
96aa2d94
RM
448/* Default jumptable functions. */
449
79937577 450extern int _IO_default_underflow (_IO_FILE *) __THROW;
0fca3153 451extern int _IO_default_uflow (_IO_FILE *);
d18ea0c5 452libc_hidden_proto (_IO_default_uflow)
0fca3153 453extern wint_t _IO_wdefault_uflow (_IO_FILE *);
d18ea0c5 454libc_hidden_proto (_IO_wdefault_uflow)
79937577 455extern int _IO_default_doallocate (_IO_FILE *) __THROW;
d18ea0c5 456libc_hidden_proto (_IO_default_doallocate)
79937577 457extern int _IO_wdefault_doallocate (_IO_FILE *) __THROW;
d18ea0c5 458libc_hidden_proto (_IO_wdefault_doallocate)
79937577 459extern void _IO_default_finish (_IO_FILE *, int) __THROW;
d18ea0c5 460libc_hidden_proto (_IO_default_finish)
79937577 461extern void _IO_wdefault_finish (_IO_FILE *, int) __THROW;
d18ea0c5 462libc_hidden_proto (_IO_wdefault_finish)
79937577 463extern int _IO_default_pbackfail (_IO_FILE *, int) __THROW;
d18ea0c5 464libc_hidden_proto (_IO_default_pbackfail)
79937577 465extern wint_t _IO_wdefault_pbackfail (_IO_FILE *, wint_t) __THROW;
d18ea0c5 466libc_hidden_proto (_IO_wdefault_pbackfail)
0fca3153 467extern _IO_FILE* _IO_default_setbuf (_IO_FILE *, char *, _IO_ssize_t);
102070bc 468extern _IO_size_t _IO_default_xsputn (_IO_FILE *, const void *, _IO_size_t);
d18ea0c5 469libc_hidden_proto (_IO_default_xsputn)
102070bc 470extern _IO_size_t _IO_wdefault_xsputn (_IO_FILE *, const void *, _IO_size_t);
d18ea0c5 471libc_hidden_proto (_IO_wdefault_xsputn)
102070bc 472extern _IO_size_t _IO_default_xsgetn (_IO_FILE *, void *, _IO_size_t);
d18ea0c5 473libc_hidden_proto (_IO_default_xsgetn)
102070bc 474extern _IO_size_t _IO_wdefault_xsgetn (_IO_FILE *, void *, _IO_size_t);
d18ea0c5 475libc_hidden_proto (_IO_wdefault_xsgetn)
79937577
UD
476extern _IO_off64_t _IO_default_seekoff (_IO_FILE *, _IO_off64_t, int, int)
477 __THROW;
0fca3153 478extern _IO_off64_t _IO_default_seekpos (_IO_FILE *, _IO_off64_t, int);
102070bc
UD
479extern _IO_ssize_t _IO_default_write (_IO_FILE *, const void *, _IO_ssize_t);
480extern _IO_ssize_t _IO_default_read (_IO_FILE *, void *, _IO_ssize_t);
79937577
UD
481extern int _IO_default_stat (_IO_FILE *, void *) __THROW;
482extern _IO_off64_t _IO_default_seek (_IO_FILE *, _IO_off64_t, int) __THROW;
483extern int _IO_default_sync (_IO_FILE *) __THROW;
40a55d20 484#define _IO_default_close ((_IO_close_t) _IO_default_sync)
79937577
UD
485extern int _IO_default_showmanyc (_IO_FILE *) __THROW;
486extern void _IO_default_imbue (_IO_FILE *, void *) __THROW;
96aa2d94 487
b2637a22 488extern const struct _IO_jump_t _IO_file_jumps;
15a686af 489libc_hidden_proto (_IO_file_jumps)
b2637a22
UD
490extern const struct _IO_jump_t _IO_file_jumps_mmap attribute_hidden;
491extern const struct _IO_jump_t _IO_file_jumps_maybe_mmap attribute_hidden;
492extern const struct _IO_jump_t _IO_wfile_jumps;
15a686af 493libc_hidden_proto (_IO_wfile_jumps)
b2637a22
UD
494extern const struct _IO_jump_t _IO_wfile_jumps_mmap attribute_hidden;
495extern const struct _IO_jump_t _IO_wfile_jumps_maybe_mmap attribute_hidden;
496extern const struct _IO_jump_t _IO_old_file_jumps attribute_hidden;
497extern const struct _IO_jump_t _IO_streambuf_jumps;
498extern const struct _IO_jump_t _IO_old_proc_jumps attribute_hidden;
499extern const struct _IO_jump_t _IO_str_jumps attribute_hidden;
500extern const struct _IO_jump_t _IO_wstr_jumps attribute_hidden;
97d261ad 501extern const struct _IO_codecvt __libio_codecvt attribute_hidden;
0fca3153 502extern int _IO_do_write (_IO_FILE *, const char *, _IO_size_t);
d18ea0c5 503libc_hidden_proto (_IO_do_write)
0fca3153
UD
504extern int _IO_new_do_write (_IO_FILE *, const char *, _IO_size_t);
505extern int _IO_old_do_write (_IO_FILE *, const char *, _IO_size_t);
506extern int _IO_wdo_write (_IO_FILE *, const wchar_t *, _IO_size_t);
d18ea0c5 507libc_hidden_proto (_IO_wdo_write)
0fca3153
UD
508extern int _IO_flush_all_lockp (int);
509extern int _IO_flush_all (void);
d18ea0c5 510libc_hidden_proto (_IO_flush_all)
0fca3153
UD
511extern int _IO_cleanup (void);
512extern void _IO_flush_all_linebuffered (void);
d18ea0c5 513libc_hidden_proto (_IO_flush_all_linebuffered)
0fca3153
UD
514extern int _IO_new_fgetpos (_IO_FILE *, _IO_fpos_t *);
515extern int _IO_old_fgetpos (_IO_FILE *, _IO_fpos_t *);
516extern int _IO_new_fsetpos (_IO_FILE *, const _IO_fpos_t *);
517extern int _IO_old_fsetpos (_IO_FILE *, const _IO_fpos_t *);
518extern int _IO_new_fgetpos64 (_IO_FILE *, _IO_fpos64_t *);
519extern int _IO_old_fgetpos64 (_IO_FILE *, _IO_fpos64_t *);
520extern int _IO_new_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *);
521extern int _IO_old_fsetpos64 (_IO_FILE *, const _IO_fpos64_t *);
79937577 522extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW;
d64b6ad0 523
96aa2d94 524
319d719d
UD
525#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
526# define _IO_do_flush(_f) \
d64b6ad0 527 ((_f)->_mode <= 0 \
d18ea0c5
AS
528 ? _IO_do_write(_f, (_f)->_IO_write_base, \
529 (_f)->_IO_write_ptr-(_f)->_IO_write_base) \
530 : _IO_wdo_write(_f, (_f)->_wide_data->_IO_write_base, \
531 ((_f)->_wide_data->_IO_write_ptr \
532 - (_f)->_wide_data->_IO_write_base)))
319d719d
UD
533#else
534# define _IO_do_flush(_f) \
d18ea0c5
AS
535 _IO_do_write(_f, (_f)->_IO_write_base, \
536 (_f)->_IO_write_ptr-(_f)->_IO_write_base)
319d719d 537#endif
6973fc01
UD
538#define _IO_old_do_flush(_f) \
539 _IO_old_do_write(_f, (_f)->_IO_write_base, \
540 (_f)->_IO_write_ptr-(_f)->_IO_write_base)
96aa2d94
RM
541#define _IO_in_put_mode(_fp) ((_fp)->_flags & _IO_CURRENTLY_PUTTING)
542#define _IO_mask_flags(fp, f, mask) \
543 ((fp)->_flags = ((fp)->_flags & ~(mask)) | ((f) & (mask)))
544#define _IO_setg(fp, eb, g, eg) ((fp)->_IO_read_base = (eb),\
545 (fp)->_IO_read_ptr = (g), (fp)->_IO_read_end = (eg))
d64b6ad0
UD
546#define _IO_wsetg(fp, eb, g, eg) ((fp)->_wide_data->_IO_read_base = (eb),\
547 (fp)->_wide_data->_IO_read_ptr = (g), \
548 (fp)->_wide_data->_IO_read_end = (eg))
96aa2d94 549#define _IO_setp(__fp, __p, __ep) \
d64b6ad0
UD
550 ((__fp)->_IO_write_base = (__fp)->_IO_write_ptr \
551 = __p, (__fp)->_IO_write_end = (__ep))
552#define _IO_wsetp(__fp, __p, __ep) \
553 ((__fp)->_wide_data->_IO_write_base \
554 = (__fp)->_wide_data->_IO_write_ptr = __p, \
555 (__fp)->_wide_data->_IO_write_end = (__ep))
96aa2d94 556#define _IO_have_backup(fp) ((fp)->_IO_save_base != NULL)
d64b6ad0 557#define _IO_have_wbackup(fp) ((fp)->_wide_data->_IO_save_base != NULL)
96aa2d94
RM
558#define _IO_in_backup(fp) ((fp)->_flags & _IO_IN_BACKUP)
559#define _IO_have_markers(fp) ((fp)->_markers != NULL)
f65fd747 560#define _IO_blen(fp) ((fp)->_IO_buf_end - (fp)->_IO_buf_base)
d64b6ad0
UD
561#define _IO_wblen(fp) ((fp)->_wide_data->_IO_buf_end \
562 - (fp)->_wide_data->_IO_buf_base)
96aa2d94
RM
563
564/* Jumptable functions for files. */
565
79937577 566extern int _IO_file_doallocate (_IO_FILE *) __THROW;
d18ea0c5 567libc_hidden_proto (_IO_file_doallocate)
0fca3153 568extern _IO_FILE* _IO_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
d18ea0c5 569libc_hidden_proto (_IO_file_setbuf)
0fca3153 570extern _IO_off64_t _IO_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
d18ea0c5 571libc_hidden_proto (_IO_file_seekoff)
79937577
UD
572extern _IO_off64_t _IO_file_seekoff_mmap (_IO_FILE *, _IO_off64_t, int, int)
573 __THROW;
0fca3153 574extern _IO_size_t _IO_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
d18ea0c5 575libc_hidden_proto (_IO_file_xsputn)
0fca3153 576extern _IO_size_t _IO_file_xsgetn (_IO_FILE *, void *, _IO_size_t);
d18ea0c5 577libc_hidden_proto (_IO_file_xsgetn)
79937577 578extern int _IO_file_stat (_IO_FILE *, void *) __THROW;
d18ea0c5 579libc_hidden_proto (_IO_file_stat)
79937577 580extern int _IO_file_close (_IO_FILE *) __THROW;
d18ea0c5 581libc_hidden_proto (_IO_file_close)
79937577 582extern int _IO_file_close_mmap (_IO_FILE *) __THROW;
0fca3153 583extern int _IO_file_underflow (_IO_FILE *);
d18ea0c5 584libc_hidden_proto (_IO_file_underflow)
0fca3153
UD
585extern int _IO_file_underflow_mmap (_IO_FILE *);
586extern int _IO_file_underflow_maybe_mmap (_IO_FILE *);
587extern int _IO_file_overflow (_IO_FILE *, int);
d18ea0c5 588libc_hidden_proto (_IO_file_overflow)
110215a9 589#define _IO_file_is_open(__fp) ((__fp)->_fileno != -1)
0fca3153 590extern _IO_FILE* _IO_file_attach (_IO_FILE *, int);
d18ea0c5 591libc_hidden_proto (_IO_file_attach)
0fca3153 592extern _IO_FILE* _IO_file_open (_IO_FILE *, const char *, int, int, int, int);
ee2a5ae8 593libc_hidden_proto (_IO_file_open)
0fca3153 594extern _IO_FILE* _IO_file_fopen (_IO_FILE *, const char *, const char *, int);
d18ea0c5 595libc_hidden_proto (_IO_file_fopen)
0fca3153
UD
596extern _IO_ssize_t _IO_file_write (_IO_FILE *, const void *, _IO_ssize_t);
597extern _IO_ssize_t _IO_file_read (_IO_FILE *, void *, _IO_ssize_t);
d18ea0c5 598libc_hidden_proto (_IO_file_read)
0fca3153 599extern int _IO_file_sync (_IO_FILE *);
d18ea0c5 600libc_hidden_proto (_IO_file_sync)
0fca3153 601extern int _IO_file_close_it (_IO_FILE *);
d18ea0c5 602libc_hidden_proto (_IO_file_close_it)
79937577 603extern _IO_off64_t _IO_file_seek (_IO_FILE *, _IO_off64_t, int) __THROW;
d18ea0c5 604libc_hidden_proto (_IO_file_seek)
0fca3153 605extern void _IO_file_finish (_IO_FILE *, int);
d18ea0c5 606libc_hidden_proto (_IO_file_finish)
79937577 607
0fca3153
UD
608extern _IO_FILE* _IO_new_file_attach (_IO_FILE *, int);
609extern int _IO_new_file_close_it (_IO_FILE *);
610extern void _IO_new_file_finish (_IO_FILE *, int);
79937577 611extern _IO_FILE* _IO_new_file_fopen (_IO_FILE *, const char *, const char *,
0fca3153 612 int);
79937577
UD
613extern void _IO_no_init (_IO_FILE *, int, int, struct _IO_wide_data *,
614 const struct _IO_jump_t *) __THROW;
db3476af
FW
615extern void _IO_new_file_init_internal (struct _IO_FILE_plus *)
616 __THROW attribute_hidden;
0fca3153
UD
617extern _IO_FILE* _IO_new_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
618extern _IO_FILE* _IO_file_setbuf_mmap (_IO_FILE *, char *, _IO_ssize_t);
619extern int _IO_new_file_sync (_IO_FILE *);
620extern int _IO_new_file_underflow (_IO_FILE *);
621extern int _IO_new_file_overflow (_IO_FILE *, int);
622extern _IO_off64_t _IO_new_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
623extern _IO_ssize_t _IO_new_file_write (_IO_FILE *, const void *, _IO_ssize_t);
624extern _IO_size_t _IO_new_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
625
626extern _IO_FILE* _IO_old_file_setbuf (_IO_FILE *, char *, _IO_ssize_t);
627extern _IO_off64_t _IO_old_file_seekoff (_IO_FILE *, _IO_off64_t, int, int);
628extern _IO_size_t _IO_old_file_xsputn (_IO_FILE *, const void *, _IO_size_t);
629extern int _IO_old_file_underflow (_IO_FILE *);
630extern int _IO_old_file_overflow (_IO_FILE *, int);
db3476af
FW
631extern void _IO_old_file_init_internal (struct _IO_FILE_plus *)
632 __THROW attribute_hidden;
0fca3153
UD
633extern _IO_FILE* _IO_old_file_attach (_IO_FILE *, int);
634extern _IO_FILE* _IO_old_file_fopen (_IO_FILE *, const char *, const char *);
635extern _IO_ssize_t _IO_old_file_write (_IO_FILE *, const void *, _IO_ssize_t);
636extern int _IO_old_file_sync (_IO_FILE *);
637extern int _IO_old_file_close_it (_IO_FILE *);
638extern void _IO_old_file_finish (_IO_FILE *, int);
79937577
UD
639
640extern int _IO_wfile_doallocate (_IO_FILE *) __THROW;
0fca3153 641extern _IO_size_t _IO_wfile_xsputn (_IO_FILE *, const void *, _IO_size_t);
d18ea0c5 642libc_hidden_proto (_IO_wfile_xsputn)
0fca3153
UD
643extern _IO_FILE* _IO_wfile_setbuf (_IO_FILE *, wchar_t *, _IO_ssize_t);
644extern wint_t _IO_wfile_sync (_IO_FILE *);
d18ea0c5 645libc_hidden_proto (_IO_wfile_sync)
0fca3153 646extern wint_t _IO_wfile_underflow (_IO_FILE *);
d18ea0c5 647libc_hidden_proto (_IO_wfile_underflow)
0fca3153 648extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t);
d18ea0c5 649libc_hidden_proto (_IO_wfile_overflow)
0fca3153 650extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int);
d18ea0c5 651libc_hidden_proto (_IO_wfile_seekoff)
d64b6ad0 652
96aa2d94 653/* Jumptable functions for proc_files. */
79937577
UD
654extern _IO_FILE* _IO_proc_open (_IO_FILE *, const char *, const char *)
655 __THROW;
656extern _IO_FILE* _IO_new_proc_open (_IO_FILE *, const char *, const char *)
657 __THROW;
0fca3153 658extern _IO_FILE* _IO_old_proc_open (_IO_FILE *, const char *, const char *);
79937577
UD
659extern int _IO_proc_close (_IO_FILE *) __THROW;
660extern int _IO_new_proc_close (_IO_FILE *) __THROW;
0fca3153 661extern int _IO_old_proc_close (_IO_FILE *);
96aa2d94
RM
662
663/* Jumptable functions for strfiles. */
79937577 664extern int _IO_str_underflow (_IO_FILE *) __THROW;
d18ea0c5 665libc_hidden_proto (_IO_str_underflow)
79937577 666extern int _IO_str_overflow (_IO_FILE *, int) __THROW;
d18ea0c5 667libc_hidden_proto (_IO_str_overflow)
79937577 668extern int _IO_str_pbackfail (_IO_FILE *, int) __THROW;
d18ea0c5 669libc_hidden_proto (_IO_str_pbackfail)
79937577 670extern _IO_off64_t _IO_str_seekoff (_IO_FILE *, _IO_off64_t, int, int) __THROW;
d18ea0c5 671libc_hidden_proto (_IO_str_seekoff)
79937577 672extern void _IO_str_finish (_IO_FILE *, int) __THROW;
96aa2d94
RM
673
674/* Other strfile functions */
2ca8b1ee 675struct _IO_strfile_;
79937577 676extern _IO_ssize_t _IO_str_count (_IO_FILE *) __THROW;
96aa2d94 677
d64b6ad0 678/* And the wide character versions. */
79937577
UD
679extern void _IO_wstr_init_static (_IO_FILE *, wchar_t *, _IO_size_t, wchar_t *)
680 __THROW;
681extern _IO_ssize_t _IO_wstr_count (_IO_FILE *) __THROW;
682extern _IO_wint_t _IO_wstr_overflow (_IO_FILE *, _IO_wint_t) __THROW;
683extern _IO_wint_t _IO_wstr_underflow (_IO_FILE *) __THROW;
684extern _IO_off64_t _IO_wstr_seekoff (_IO_FILE *, _IO_off64_t, int, int)
685 __THROW;
686extern _IO_wint_t _IO_wstr_pbackfail (_IO_FILE *, _IO_wint_t) __THROW;
687extern void _IO_wstr_finish (_IO_FILE *, int) __THROW;
688
a784e502 689extern int _IO_vasprintf (char **result_ptr, const char *format,
79937577 690 _IO_va_list args) __THROW;
a784e502 691extern int _IO_vdprintf (int d, const char *format, _IO_va_list arg);
79937577 692extern int _IO_vsnprintf (char *string, _IO_size_t maxlen,
a784e502 693 const char *format, _IO_va_list args) __THROW;
79937577
UD
694
695
102070bc 696extern _IO_size_t _IO_getline (_IO_FILE *,char *, _IO_size_t, int, int);
d18ea0c5 697libc_hidden_proto (_IO_getline)
79937577 698extern _IO_size_t _IO_getline_info (_IO_FILE *,char *, _IO_size_t,
102070bc 699 int, int, int *);
d18ea0c5 700libc_hidden_proto (_IO_getline_info)
0fca3153 701extern _IO_ssize_t _IO_getdelim (char **, _IO_size_t *, int, _IO_FILE *);
102070bc 702extern _IO_size_t _IO_getwline (_IO_FILE *,wchar_t *, _IO_size_t, wint_t, int);
79937577 703extern _IO_size_t _IO_getwline_info (_IO_FILE *,wchar_t *, _IO_size_t,
102070bc 704 wint_t, int, wint_t *);
96aa2d94 705
2ca8b1ee 706extern struct _IO_FILE_plus *_IO_list_all;
d18ea0c5 707libc_hidden_proto (_IO_list_all)
79937577 708extern void (*_IO_cleanup_registration_needed) (void);
96aa2d94 709
79937577
UD
710extern void _IO_str_init_static_internal (struct _IO_strfile_ *, char *,
711 _IO_size_t, char *) __THROW;
52a16e58 712extern _IO_off64_t _IO_seekoff_unlocked (_IO_FILE *, _IO_off64_t, int, int)
0fca3153 713 attribute_hidden;
52a16e58 714extern _IO_off64_t _IO_seekpos_unlocked (_IO_FILE *, _IO_off64_t, int)
0fca3153 715 attribute_hidden;
77fe0b9c 716
96aa2d94 717#ifndef EOF
40a55d20 718# define EOF (-1)
96aa2d94
RM
719#endif
720#ifndef NULL
40a55d20 721# if defined __GNUG__ && \
f8b87ef0 722 (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
40a55d20
UD
723# define NULL (__null)
724# else
725# if !defined(__cplusplus)
726# define NULL ((void*)0)
727# else
728# define NULL (0)
729# endif
730# endif
f65fd747 731#endif
96aa2d94 732
f8b87ef0
UD
733#if _G_HAVE_MMAP
734
40a55d20
UD
735# include <unistd.h>
736# include <fcntl.h>
737# include <sys/mman.h>
738# include <sys/param.h>
f8b87ef0 739
40a55d20
UD
740# if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
741# define MAP_ANONYMOUS MAP_ANON
742# endif
f8b87ef0 743
40a55d20
UD
744# if !defined(MAP_ANONYMOUS) || !defined(EXEC_PAGESIZE)
745# undef _G_HAVE_MMAP
746# define _G_HAVE_MMAP 0
747# endif
f8b87ef0
UD
748
749#endif /* _G_HAVE_MMAP */
750
751#if _G_HAVE_MMAP
752
40a55d20 753# ifdef _LIBC
10dc2a90 754/* When using this code in the GNU libc we must not pollute the name space. */
40a55d20
UD
755# define mmap __mmap
756# define munmap __munmap
dfd2257a 757# define ftruncate __ftruncate
40a55d20 758# endif
f8b87ef0 759#endif /* _G_HAVE_MMAP */
96aa2d94
RM
760
761#ifndef OS_FSTAT
40a55d20 762# define OS_FSTAT fstat
96aa2d94 763#endif
79937577 764extern int _IO_vscanf (const char *, _IO_va_list) __THROW;
96aa2d94 765
d64b6ad0 766/* _IO_pos_BAD is an _IO_off64_t value indicating error, unknown, or EOF. */
96aa2d94 767#ifndef _IO_pos_BAD
d64b6ad0 768# define _IO_pos_BAD ((_IO_off64_t) -1)
96aa2d94 769#endif
d64b6ad0 770/* _IO_pos_adjust adjust an _IO_off64_t by some number of bytes. */
96aa2d94 771#ifndef _IO_pos_adjust
d64b6ad0 772# define _IO_pos_adjust(pos, delta) ((pos) += (delta))
96aa2d94 773#endif
d64b6ad0 774/* _IO_pos_0 is an _IO_off64_t value indicating beginning of file. */
96aa2d94 775#ifndef _IO_pos_0
d64b6ad0 776# define _IO_pos_0 ((_IO_off64_t) 0)
96aa2d94
RM
777#endif
778
4547c1a4
UD
779#ifdef __cplusplus
780}
781#endif
96aa2d94 782
499e7464 783#ifdef _IO_MTSAFE_IO
96aa2d94 784/* check following! */
1ddf537f 785# ifdef _IO_USE_OLD_IO_FILE
d64b6ad0 786# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
96aa2d94 787 { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
319d719d 788 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \
73c115ed 789 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock }
1ddf537f 790# else
319d719d
UD
791# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
792# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
1ddf537f 793 { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
319d719d 794 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \
d64b6ad0
UD
795 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\
796 NULL, WDP, 0 }
319d719d
UD
797# else
798# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
799 { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
800 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \
801 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\
802 0 }
803# endif
1ddf537f 804# endif
499e7464 805#else
1ddf537f 806# ifdef _IO_USE_OLD_IO_FILE
b4e3df5d 807# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
499e7464 808 { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
73c115ed
GM
809 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \
810 0, _IO_pos_BAD }
1ddf537f 811# else
319d719d
UD
812# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
813# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
1ddf537f 814 { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
319d719d 815 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \
d64b6ad0
UD
816 0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD, \
817 NULL, WDP, 0 }
319d719d
UD
818# else
819# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
820 { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
821 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \
822 0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD, \
823 0 }
824# endif
1ddf537f 825# endif
499e7464 826#endif
96aa2d94 827
965a54a4 828#define _IO_va_start(args, last) va_start(args, last)
96aa2d94
RM
829
830extern struct _IO_fake_stdiobuf _IO_stdin_buf, _IO_stdout_buf, _IO_stderr_buf;
831
832#if 1
40a55d20 833# define COERCE_FILE(FILE) /* Nothing */
96aa2d94
RM
834#else
835/* This is part of the kludge for binary compatibility with old stdio. */
40a55d20 836# define COERCE_FILE(FILE) \
96aa2d94
RM
837 (((FILE)->_IO_file_flags & _IO_MAGIC_MASK) == _OLD_MAGIC_MASK \
838 && (FILE) = *(FILE**)&((int*)fp)[1])
839#endif
840
841#ifdef EINVAL
40a55d20 842# define MAYBE_SET_EINVAL __set_errno (EINVAL)
96aa2d94 843#else
40a55d20 844# define MAYBE_SET_EINVAL /* nothing */
96aa2d94
RM
845#endif
846
f65fd747 847#ifdef IO_DEBUG
40a55d20 848# define CHECK_FILE(FILE, RET) \
96aa2d94
RM
849 if ((FILE) == NULL) { MAYBE_SET_EINVAL; return RET; } \
850 else { COERCE_FILE(FILE); \
851 if (((FILE)->_IO_file_flags & _IO_MAGIC_MASK) != _IO_MAGIC) \
68dbb3a6 852 { MAYBE_SET_EINVAL; return RET; }}
96aa2d94 853#else
40a55d20 854# define CHECK_FILE(FILE, RET) COERCE_FILE (FILE)
96aa2d94 855#endif
eef80cf8
UD
856
857static inline void
858__attribute__ ((__always_inline__))
859_IO_acquire_lock_fct (_IO_FILE **p)
860{
861 _IO_FILE *fp = *p;
862 if ((fp->_flags & _IO_USER_LOCK) == 0)
863 _IO_funlockfile (fp);
864}
b257c726
UD
865
866static inline void
867__attribute__ ((__always_inline__))
868_IO_acquire_lock_clear_flags2_fct (_IO_FILE **p)
869{
870 _IO_FILE *fp = *p;
874aa523 871 fp->_flags2 &= ~(_IO_FLAGS2_FORTIFY | _IO_FLAGS2_SCANF_STD);
b257c726
UD
872 if ((fp->_flags & _IO_USER_LOCK) == 0)
873 _IO_funlockfile (fp);
874}
b2e1c562 875
4f41c682 876#if !defined _IO_MTSAFE_IO && IS_IN (libc)
b2e1c562
RM
877# define _IO_acquire_lock(_fp) \
878 do { \
879 _IO_FILE *_IO_acquire_lock_file = NULL
880# define _IO_acquire_lock_clear_flags2(_fp) \
881 do { \
882 _IO_FILE *_IO_acquire_lock_file = (_fp)
883# define _IO_release_lock(_fp) \
884 if (_IO_acquire_lock_file != NULL) \
885 _IO_acquire_lock_file->_flags2 &= ~(_IO_FLAGS2_FORTIFY \
886 | _IO_FLAGS2_SCANF_STD); \
887 } while (0)
888#endif
db3476af
FW
889
890/* Collect all vtables in a special section for vtable verification.
891 These symbols cover the extent of this section. */
892symbol_set_declare (__libc_IO_vtables)
893
894/* libio vtables need to carry this attribute so that they pass
895 validation. */
896#define libio_vtable __attribute__ ((section ("__libc_IO_vtables")))
897
898#ifdef SHARED
899/* If equal to &_IO_vtable_check (with pointer guard protection),
900 unknown vtable pointers are valid. This function pointer is solely
901 used as a flag. */
902extern void (*IO_accept_foreign_vtables) (void) attribute_hidden;
903
904/* Assigns the passed function pointer (either NULL or
905 &_IO_vtable_check) to IO_accept_foreign_vtables. */
906static inline void
907IO_set_accept_foreign_vtables (void (*flag) (void))
908{
92777f34 909#ifdef PTR_MANGLE
db3476af 910 PTR_MANGLE (flag);
92777f34 911#endif
db3476af
FW
912 atomic_store_relaxed (&IO_accept_foreign_vtables, flag);
913}
914
915#else /* !SHARED */
916
917/* The statically-linked version does nothing. */
918static inline void
919IO_set_accept_foreign_vtables (void (*flag) (void))
920{
921}
922
923#endif
924
925/* Check if unknown vtable pointers are permitted; otherwise,
926 terminate the process. */
927void _IO_vtable_check (void) attribute_hidden;
928
929/* Perform vtable pointer validation. If validation fails, terminate
930 the process. */
931static inline const struct _IO_jump_t *
932IO_validate_vtable (const struct _IO_jump_t *vtable)
933{
934 /* Fast path: The vtable pointer is within the __libc_IO_vtables
935 section. */
936 uintptr_t section_length = __stop___libc_IO_vtables - __start___libc_IO_vtables;
937 const char *ptr = (const char *) vtable;
938 uintptr_t offset = ptr - __start___libc_IO_vtables;
939 if (__glibc_unlikely (offset >= section_length))
940 /* The vtable pointer is not in the expected section. Use the
941 slow path, which will terminate the process if necessary. */
942 _IO_vtable_check ();
943 return vtable;
944}