stdio.h revision 2ad11a96a169eedbab5ecdfac23fcfb095df2140
11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$OpenBSD: stdio.h,v 1.35 2006/01/13 18:10:09 miod Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$NetBSD: stdio.h,v 1.18 1996/04/25 18:29:21 jtc Exp $	*/
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1990 The Regents of the University of California.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code is derived from software contributed to Berkeley by
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Chris Torek.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    may be used to endorse or promote products derived from this software
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    without specific prior written permission.
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	@(#)stdio.h	5.17 (Berkeley) 6/3/91
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef	_STDIO_H_
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_STDIO_H_
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
41df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes/*
42df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes * This file must contain a reference to __gnuc_va_list so that GCC's
43df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes * fixincludes knows that that's what's being used for va_list, and so
44df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes * to leave our <stdio.h> alone. (fixincludes gets in the way of pointing
45df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes * one toolchain at various different sets of platform headers.)
46df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes * If you alter this comment, be sure to keep "__gnuc_va_list" in it!
47df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes */
48df85f50b82efc96e348c3d88e67b7bcdb263921fElliott Hughes
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
503975cec694a0c9b42e3f7e671fcd678da92836c3Elliott Hughes#include <sys/types.h>
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdarg.h>
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stddef.h>
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
557d56ccbfaac2b702e4be0f71038efb7f251ef637Elliott Hughes#define __need_NULL
567d56ccbfaac2b702e4be0f71038efb7f251ef637Elliott Hughes#include <stddef.h>
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_FSTDIO			/* Define for new stdio with functions. */
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef off_t fpos_t;		/* stdio file position type */
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * NB: to fit things in six character monocase externals, the stdio
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code uses the prefix `__s' for stdio objects, typically followed
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by a three-character attempt at a mnemonic.
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* stdio buffers */
692ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#if defined(__LP64__)
702ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughesstruct __sbuf {
712ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes  unsigned char* _base;
722ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes  size_t _size;
732ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes};
742ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#else
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct __sbuf {
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_base;
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_size;
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
792ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#endif
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * stdio state variables.
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following always hold:
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *		_lbfsize is -_bf._size, else _lbfsize is 0
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SRD, _w is 0
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SWR, _r is 0
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This ensures that the getc and putc macros (or inline functions) never
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * try to write or read from a file that is in `read' or `write' mode.
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * (Moreover, they can, and do, automatically switch from read mode to
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * write mode, and back, on "r+" and "w+" files.)
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _lbfsize is used only to make the inline line-buffered output stream
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code as compact as possible.
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub, _up, and _ur are used when ungetc() pushes back more characters
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * than fit in the current _bf, or when ungetc() pushes back a character
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that does not match the previous one in _bf.  When this happens,
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
104c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden *
105c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * NOTE: if you change this structure, you also need to update the
106c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * std() initializer in findfp.c.
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	struct __sFILE {
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_p;	/* current position in (some) buffer */
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_r;		/* read space left for getc() */
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_w;		/* write space left for putc() */
1122ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#if defined(__LP64__)
1132ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes	int	_flags;		/* flags, below; this FILE is free if 0 */
1142ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes	int	_file;		/* fileno, if Unix descriptor, else -1 */
1152ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#else
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_flags;		/* flags, below; this FILE is free if 0 */
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_file;		/* fileno, if Unix descriptor, else -1 */
1182ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#endif
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* operations */
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	void	*_cookie;	/* cookie passed to io functions */
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_close)(void *);
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_read)(void *, char *, int);
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	(*_seek)(void *, fpos_t, int);
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_write)(void *, const char *, int);
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* extension data, to avoid further ABI breakage */
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _ext;
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* data for long sequences of ungetc() */
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_ur;		/* saved _r when _r is counting ungetc data */
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* tricks to meet minimum requirements even when malloc() fails */
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* separate buffer for fgetln() when line crosses buffer boundary */
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _lb;	/* buffer for fgetln() */
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Unix stdio files get aligned to block boundaries on fseek() */
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	_offset;	/* current lseek offset */
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} FILE;
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern FILE __sF[];
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SLBF	0x0001		/* line buffered */
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SNBF	0x0002		/* unbuffered */
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SRD	0x0004		/* OK to read */
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SWR	0x0008		/* OK to write */
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* RD and WR are never simultaneously asserted */
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SRW	0x0010		/* open for reading & writing */
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SEOF	0x0020		/* found EOF */
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SERR	0x0040		/* found error */
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SMBF	0x0080		/* _buf is from malloc */
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SAPP	0x0100		/* fdopen()ed in append mode */
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SSTR	0x0200		/* this is an sprintf/snprintf string */
162d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#define	__SOPT	0x0400		/* do fseek() optimization */
163d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#define	__SNPT	0x0800		/* do not do fseek() optimization */
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SOFF	0x1000		/* set iff _offset is in fact correct */
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SMOD	0x2000		/* true => fgetln modified _p text */
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	__SALC	0x4000		/* allocate string space dynamically */
167f582340a6a48588aa50da17e1620e8f91b146941Kenny Root#define	__SIGN	0x8000		/* ignore this file in _fwalk */
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following three definitions are for ANSI C, which took them
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from System V, which brilliantly took internal interface macros and
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * made them official arguments to setvbuf(), without renaming them.
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Hence, these ugly _IOxxx names are *supposed* to appear in user code.
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Although numbered as their counterparts above, the implementation
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * does not rely on this.
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IOFBF	0		/* setvbuf should set fully buffered */
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IOLBF	1		/* setvbuf should set line buffered */
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_IONBF	2		/* setvbuf should set unbuffered */
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	BUFSIZ	1024		/* size of buffer used by setbuf */
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	EOF	(-1)
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
186d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * FOPEN_MAX is a minimum maximum, and is the number of streams that
187d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * stdio can provide without attempting to allocate further resources
188d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * (which could fail).  Do not use this for anything.
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
190d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FOPEN_MAX	20	/* must be <= OPEN_MAX <sys/syslimits.h> */
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	FILENAME_MAX	1024	/* must be <= PATH_MAX <sys/syslimits.h> */
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __XPG_VISIBLE
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	P_tmpdir	"/tmp/"
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_tmpnam	1024	/* XXX must be == PATH_MAX */
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	TMP_MAX		308915776
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
201d04c18397946f87ac4495351537c31a3d67257daElliott Hughes/* Always ensure that these are consistent with <fcntl.h> and <unistd.h>! */
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_SET
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_SET	0	/* set file offset to offset */
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_CUR
2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_CUR	1	/* set file offset to current plus offset */
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef SEEK_END
2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	SEEK_END	2	/* set file offset to EOF plus offset */
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stdin	(&__sF[0])
2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stdout	(&__sF[1])
2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	stderr	(&__sF[2])
2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in ANSI C standard.
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 clearerr(FILE *);
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fclose(FILE *);
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 feof(FILE *);
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ferror(FILE *);
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fflush(FILE *);
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fgetc(FILE *);
226d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*fgets(char * __restrict, int, FILE * __restrict);
227d04c18397946f87ac4495351537c31a3d67257daElliott HughesFILE	*fopen(const char * __restrict , const char * __restrict);
228d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fprintf(FILE * __restrict , const char * __restrict, ...)
229d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fputc(int, FILE *);
231d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fputs(const char * __restrict, FILE * __restrict);
232d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t	 fread(void * __restrict, size_t, size_t, FILE * __restrict);
233d04c18397946f87ac4495351537c31a3d67257daElliott HughesFILE	*freopen(const char * __restrict, const char * __restrict,
234d04c18397946f87ac4495351537c31a3d67257daElliott Hughes	    FILE * __restrict);
235d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fscanf(FILE * __restrict, const char * __restrict, ...)
236d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 3);
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fseek(FILE *, long, int);
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlong	 ftell(FILE *);
239d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t	 fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc(FILE *);
2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar(void);
242eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t	 getdelim(char ** __restrict, size_t * __restrict, int,
243eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdea	    FILE * __restrict);
244eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t	 getline(char ** __restrict, size_t * __restrict, FILE * __restrict);
245c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 perror(const char *);
247d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 printf(const char * __restrict, ...)
248d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(1, 2);
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc(int, FILE *);
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar(int);
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 puts(const char *);
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 remove(const char *);
2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 rewind(FILE *);
254d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 scanf(const char * __restrict, ...)
255d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(1, 2);
256d04c18397946f87ac4495351537c31a3d67257daElliott Hughesvoid	 setbuf(FILE * __restrict, char * __restrict);
257d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 setvbuf(FILE * __restrict, char * __restrict, int, size_t);
258d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 sscanf(const char * __restrict, const char * __restrict, ...)
259d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 3);
2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*tmpfile(void);
2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ungetc(int, FILE *);
262d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vfprintf(FILE * __restrict, const char * __restrict, __va_list)
263d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
264d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vprintf(const char * __restrict, __va_list)
265d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(1, 0);
266d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
267fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughesint dprintf(int, const char * __restrict, ...) __printflike(2, 3);
268fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughesint vdprintf(int, const char * __restrict, __va_list) __printflike(2, 0);
269fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughes
270d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#ifndef __AUDIT__
2719635046e53e14ff44348853a9cacdffd444b35aeDan Albert#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
272c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* gets(char*) __warnattr("gets is very unsafe; consider using fgets");
2739635046e53e14ff44348853a9cacdffd444b35aeDan Albert#endif
274c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughesint sprintf(char* __restrict, const char* __restrict, ...)
275c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes    __printflike(2, 3) __warnattr("sprintf is often misused; please use snprintf");
276c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* tmpnam(char*) __warnattr("tmpnam possibly used unsafely; consider using mkstemp");
277c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughesint vsprintf(char* __restrict, const char* __restrict, __va_list)
278c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes    __printflike(2, 0) __warnattr("vsprintf is often misused; please use vsnprintf");
279c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes#if __XPG_VISIBLE
280c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* tempnam(const char*, const char*)
281c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes    __warnattr("tempnam possibly used unsafely; consider using mkstemp");
282c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes#endif
283d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#endif
284d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
285f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int rename(const char*, const char*);
286f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int renameat(int, const char*, int, const char*);
287d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
288d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fgetpos(FILE * __restrict, fpos_t * __restrict);
289d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fsetpos(FILE *, const fpos_t *);
290d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
291d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fseeko(FILE *, off_t, int);
292d04c18397946f87ac4495351537c31a3d67257daElliott Hughesoff_t	 ftello(FILE *);
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
295d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 snprintf(char * __restrict, size_t, const char * __restrict, ...)
296d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(3, 4);
297d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vfscanf(FILE * __restrict, const char * __restrict, __va_list)
298d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 0);
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vscanf(const char *, __va_list)
300d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(1, 0);
301d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list)
302d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(3, 0);
303d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsscanf(const char * __restrict, const char * __restrict, __va_list)
304d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 0);
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in POSIX 1003.1.
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_ctermid	1024	/* size for ctermid(); PATH_MAX */
3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*fdopen(int, const char *);
3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fileno(FILE *);
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
32050ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#if (__POSIX_VISIBLE >= 199209)
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 pclose(FILE *);
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*popen(const char *, const char *);
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE >= 199506
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 flockfile(FILE *);
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ftrylockfile(FILE *);
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 funlockfile(FILE *);
3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * These are normally used through macros as defined below, but POSIX
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * requires functions as well.
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc_unlocked(FILE *);
3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar_unlocked(void);
3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc_unlocked(int, FILE *);
3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar_unlocked(int);
3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __POSIX_VISIBLE >= 199506 */
3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3406b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes#if __POSIX_VISIBLE >= 200809
3416b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott HughesFILE* fmemopen(void*, size_t, const char*);
3426b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott HughesFILE* open_memstream(char**, size_t*);
3436b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes#endif /* __POSIX_VISIBLE >= 200809 */
3446b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Routines that are purely local.
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
354d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 asprintf(char ** __restrict, const char * __restrict, ...)
355d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
356d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*fgetln(FILE * __restrict, size_t * __restrict);
3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fpurge(FILE *);
3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 setbuffer(FILE *, char *, int);
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 setlinebuf(FILE *);
360d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vasprintf(char ** __restrict, const char * __restrict,
361d04c18397946f87ac4495351537c31a3d67257daElliott Hughes    __va_list)
362d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
3632b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughes
3642b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesvoid clearerr_unlocked(FILE*);
3652b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesint feof_unlocked(FILE*);
3662b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesint ferror_unlocked(FILE*);
3672b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughes
3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Stdio function-access interface.
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*funopen(const void *,
3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, char *, int),
3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, const char *, int),
3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		fpos_t (*)(void *, fpos_t, int),
3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *));
3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
384c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if defined(__BIONIC_FORTIFY)
385cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
386ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes__BEGIN_DECLS
387ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes
388cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
389d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 0)
3909b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsnprintf(char *dest, size_t size, const char *format, __va_list ap)
3919b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
3929020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    return __builtin___vsnprintf_chk(dest, size, 0, __bos(dest), format, ap);
3939b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
3949b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
3959b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
396d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 0)
3979b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsprintf(char *dest, const char *format, __va_list ap)
398cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
3999020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    return __builtin___vsprintf_chk(dest, 0, __bos(dest), format, ap);
400cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
401cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
402621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#if defined(__clang__)
4037eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #if !defined(snprintf)
4047eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define __wrap_snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__)
4057eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define snprintf(...) __wrap_snprintf(__VA_ARGS__)
4067eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #endif
407621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#else
408cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
409d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 4)
410621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevichint snprintf(char *dest, size_t size, const char *format, ...)
411cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
412621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich    return __builtin___snprintf_chk(dest, size, 0,
413621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich        __bos(dest), format, __builtin_va_arg_pack());
4149b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
415621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#endif
4169b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
417c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if defined(__clang__)
4187eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #if !defined(sprintf)
4197eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define __wrap_sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__)
4207eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define sprintf(...) __wrap_sprintf(__VA_ARGS__)
4217eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #endif
422c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#else
4239b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
424d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 3)
4259b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint sprintf(char *dest, const char *format, ...)
4269b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
4279b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___sprintf_chk(dest, 0,
42878d6d9888c24c50f65d694dc8283afdcb58db84cNick Kralevich        __bos(dest), format, __builtin_va_arg_pack());
429cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
430c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif
431cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
432cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hughesextern char* __fgets_chk(char*, int, FILE*, size_t);
4332cfb4e8e2e217ef0e4140dcbf9b3da809781158cElliott Hughesextern char* __fgets_real(char*, int, FILE*) __RENAME(fgets);
434b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5Nick Kralevich__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer");
435b24c0637d06fe0980b9e13a8d0c3e6f4dbda9cd5Nick Kralevich__errordecl(__fgets_too_small_error, "fgets called with size less than zero");
436cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hughes
437cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hughes#if !defined(__clang__)
438965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
439965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich__BIONIC_FORTIFY_INLINE
440cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hugheschar *fgets(char* dest, int size, FILE* stream) {
4419020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    size_t bos = __bos(dest);
442965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
443965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
444965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always negative. Force a compiler error.
445965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    if (__builtin_constant_p(size) && (size < 0)) {
446965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_small_error();
447965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
448965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
449965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler doesn't know destination size. Don't call __fgets_chk
4509b6cc223a36835c4367a036d4cfeff14d25bc742Nick Kralevich    if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
451965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
452965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
453965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
454965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
455965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always <= the actual object size. Don't call __fgets_chk
45641b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes    if (__builtin_constant_p(size) && (size <= (int) bos)) {
457965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
458965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
459965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
460965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
461965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always > the actual object size. Force a compiler error.
46241b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes    if (__builtin_constant_p(size) && (size > (int) bos)) {
463965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_big_error();
464965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
465965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
466965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    return __fgets_chk(dest, size, stream, bos);
467965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich}
468965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
469c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* !defined(__clang__) */
470c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich
471ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes__END_DECLS
472ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes
473c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* defined(__BIONIC_FORTIFY) */
474cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _STDIO_H_ */
476