stdio.h revision 658727e111ed6dee7be5239494f0764f7b1b02f8
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
58658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__BEGIN_DECLS
59658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	_FSTDIO			/* Define for new stdio with functions. */
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef off_t fpos_t;		/* stdio file position type */
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * NB: to fit things in six character monocase externals, the stdio
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code uses the prefix `__s' for stdio objects, typically followed
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by a three-character attempt at a mnemonic.
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* stdio buffers */
712ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#if defined(__LP64__)
722ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughesstruct __sbuf {
732ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes  unsigned char* _base;
742ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes  size_t _size;
752ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes};
762ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#else
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct __sbuf {
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_base;
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_size;
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
812ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#endif
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * stdio state variables.
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following always hold:
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *		_lbfsize is -_bf._size, else _lbfsize is 0
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SRD, _w is 0
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	if _flags&__SWR, _r is 0
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This ensures that the getc and putc macros (or inline functions) never
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * try to write or read from a file that is in `read' or `write' mode.
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * (Moreover, they can, and do, automatically switch from read mode to
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * write mode, and back, on "r+" and "w+" files.)
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _lbfsize is used only to make the inline line-buffered output stream
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * code as compact as possible.
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub, _up, and _ur are used when ungetc() pushes back more characters
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * than fit in the current _bf, or when ungetc() pushes back a character
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that does not match the previous one in _bf.  When this happens,
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
106c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden *
107c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * NOTE: if you change this structure, you also need to update the
108c1202510b67f200b668d85ac0190db2b179b0c4dAndy McFadden * std() initializer in findfp.c.
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef	struct __sFILE {
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_p;	/* current position in (some) buffer */
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_r;		/* read space left for getc() */
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_w;		/* write space left for putc() */
1142ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#if defined(__LP64__)
1152ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes	int	_flags;		/* flags, below; this FILE is free if 0 */
1162ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes	int	_file;		/* fileno, if Unix descriptor, else -1 */
1172ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#else
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_flags;		/* flags, below; this FILE is free if 0 */
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	short	_file;		/* fileno, if Unix descriptor, else -1 */
1202ad11a96a169eedbab5ecdfac23fcfb095df2140Elliott Hughes#endif
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* operations */
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	void	*_cookie;	/* cookie passed to io functions */
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_close)(void *);
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_read)(void *, char *, int);
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	(*_seek)(void *, fpos_t, int);
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	(*_write)(void *, const char *, int);
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* extension data, to avoid further ABI breakage */
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _ext;
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* data for long sequences of ungetc() */
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char *_up;	/* saved _p when _p is doing ungetc data */
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_ur;		/* saved _r when _r is counting ungetc data */
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* tricks to meet minimum requirements even when malloc() fails */
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* separate buffer for fgetln() when line crosses buffer boundary */
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct	__sbuf _lb;	/* buffer for fgetln() */
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Unix stdio files get aligned to block boundaries on fseek() */
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	fpos_t	_offset;	/* current lseek offset */
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} FILE;
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern FILE __sF[];
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 Projectvoid	 clearerr(FILE *);
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fclose(FILE *);
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 feof(FILE *);
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ferror(FILE *);
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fflush(FILE *);
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fgetc(FILE *);
225d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*fgets(char * __restrict, int, FILE * __restrict);
226d04c18397946f87ac4495351537c31a3d67257daElliott HughesFILE	*fopen(const char * __restrict , const char * __restrict);
227d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fprintf(FILE * __restrict , const char * __restrict, ...)
228d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fputc(int, FILE *);
230d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fputs(const char * __restrict, FILE * __restrict);
231d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t	 fread(void * __restrict, size_t, size_t, FILE * __restrict);
232d04c18397946f87ac4495351537c31a3d67257daElliott HughesFILE	*freopen(const char * __restrict, const char * __restrict,
233d04c18397946f87ac4495351537c31a3d67257daElliott Hughes	    FILE * __restrict);
234d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fscanf(FILE * __restrict, const char * __restrict, ...)
235d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 3);
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fseek(FILE *, long, int);
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlong	 ftell(FILE *);
238d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t	 fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc(FILE *);
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar(void);
241eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t	 getdelim(char ** __restrict, size_t * __restrict, int,
242eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdea	    FILE * __restrict);
243eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t	 getline(char ** __restrict, size_t * __restrict, FILE * __restrict);
244c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 perror(const char *);
246d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 printf(const char * __restrict, ...)
247d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(1, 2);
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc(int, FILE *);
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar(int);
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 puts(const char *);
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 remove(const char *);
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 rewind(FILE *);
253d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 scanf(const char * __restrict, ...)
254d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(1, 2);
255d04c18397946f87ac4495351537c31a3d67257daElliott Hughesvoid	 setbuf(FILE * __restrict, char * __restrict);
256d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 setvbuf(FILE * __restrict, char * __restrict, int, size_t);
257d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 sscanf(const char * __restrict, const char * __restrict, ...)
258d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 3);
2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*tmpfile(void);
2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ungetc(int, FILE *);
261d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vfprintf(FILE * __restrict, const char * __restrict, __va_list)
262d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
263d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vprintf(const char * __restrict, __va_list)
264d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(1, 0);
265d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
266fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughesint dprintf(int, const char * __restrict, ...) __printflike(2, 3);
267fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughesint vdprintf(int, const char * __restrict, __va_list) __printflike(2, 0);
268fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughes
269d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#ifndef __AUDIT__
2709635046e53e14ff44348853a9cacdffd444b35aeDan Albert#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
271c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* gets(char*) __warnattr("gets is very unsafe; consider using fgets");
2729635046e53e14ff44348853a9cacdffd444b35aeDan Albert#endif
273c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughesint sprintf(char* __restrict, const char* __restrict, ...)
274c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes    __printflike(2, 3) __warnattr("sprintf is often misused; please use snprintf");
275c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* tmpnam(char*) __warnattr("tmpnam possibly used unsafely; consider using mkstemp");
276c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughesint vsprintf(char* __restrict, const char* __restrict, __va_list)
277c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes    __printflike(2, 0) __warnattr("vsprintf is often misused; please use vsnprintf");
278c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes#if __XPG_VISIBLE
279c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* tempnam(const char*, const char*)
280c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes    __warnattr("tempnam possibly used unsafely; consider using mkstemp");
281c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes#endif
282d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#endif
283d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
284f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int rename(const char*, const char*);
285f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int renameat(int, const char*, int, const char*);
286d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
287d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fgetpos(FILE * __restrict, fpos_t * __restrict);
288d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fsetpos(FILE *, const fpos_t *);
289d04c18397946f87ac4495351537c31a3d67257daElliott Hughes
290d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 fseeko(FILE *, off_t, int);
291d04c18397946f87ac4495351537c31a3d67257daElliott Hughesoff_t	 ftello(FILE *);
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
294d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 snprintf(char * __restrict, size_t, const char * __restrict, ...)
295d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(3, 4);
296d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vfscanf(FILE * __restrict, const char * __restrict, __va_list)
297d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 0);
2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 vscanf(const char *, __va_list)
299d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(1, 0);
300d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list)
301d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(3, 0);
302d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vsscanf(const char * __restrict, const char * __restrict, __va_list)
303d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__scanflike(2, 0);
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in POSIX 1003.1.
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	L_ctermid	1024	/* size for ctermid(); PATH_MAX */
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*fdopen(int, const char *);
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fileno(FILE *);
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
31550ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#if (__POSIX_VISIBLE >= 199209)
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 pclose(FILE *);
3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*popen(const char *, const char *);
3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE >= 199506
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 flockfile(FILE *);
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 ftrylockfile(FILE *);
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 funlockfile(FILE *);
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * These are normally used through macros as defined below, but POSIX
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * requires functions as well.
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getc_unlocked(FILE *);
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 getchar_unlocked(void);
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putc_unlocked(int, FILE *);
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 putchar_unlocked(int);
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __POSIX_VISIBLE >= 199506 */
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3356b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes#if __POSIX_VISIBLE >= 200809
3366b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott HughesFILE* fmemopen(void*, size_t, const char*);
3376b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott HughesFILE* open_memstream(char**, size_t*);
3386b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes#endif /* __POSIX_VISIBLE >= 200809 */
3396b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes
3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */
3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Routines that are purely local.
3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE
346d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 asprintf(char ** __restrict, const char * __restrict, ...)
347d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 3);
348d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar	*fgetln(FILE * __restrict, size_t * __restrict);
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 fpurge(FILE *);
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid	 setbuffer(FILE *, char *, int);
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint	 setlinebuf(FILE *);
352d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint	 vasprintf(char ** __restrict, const char * __restrict,
353d04c18397946f87ac4495351537c31a3d67257daElliott Hughes    __va_list)
354d04c18397946f87ac4495351537c31a3d67257daElliott Hughes		__printflike(2, 0);
3552b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughes
3562b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesvoid clearerr_unlocked(FILE*);
3572b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesint feof_unlocked(FILE*);
3582b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesint ferror_unlocked(FILE*);
3592b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughes
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Stdio function-access interface.
3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE	*funopen(const void *,
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, char *, int),
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *, const char *, int),
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		fpos_t (*)(void *, fpos_t, int),
3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int (*)(void *));
368658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
373658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albertextern char* __fgets_chk(char*, int, FILE*, size_t);
374658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albertextern char* __fgets_real(char*, int, FILE*) __RENAME(fgets);
375658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer");
376658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__errordecl(__fgets_too_small_error, "fgets called with size less than zero");
377cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
378658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert#if defined(__BIONIC_FORTIFY)
379ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes
380cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
381d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 0)
3829b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsnprintf(char *dest, size_t size, const char *format, __va_list ap)
3839b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
3849020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    return __builtin___vsnprintf_chk(dest, size, 0, __bos(dest), format, ap);
3859b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
3869b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
3879b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
388d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 0)
3899b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsprintf(char *dest, const char *format, __va_list ap)
390cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
3919020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    return __builtin___vsprintf_chk(dest, 0, __bos(dest), format, ap);
392cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
393cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
394621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#if defined(__clang__)
3957eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #if !defined(snprintf)
3967eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define __wrap_snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__)
3977eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define snprintf(...) __wrap_snprintf(__VA_ARGS__)
3987eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #endif
399621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#else
400cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE
401d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 4)
402621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevichint snprintf(char *dest, size_t size, const char *format, ...)
403cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{
404621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich    return __builtin___snprintf_chk(dest, size, 0,
405621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich        __bos(dest), format, __builtin_va_arg_pack());
4069b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich}
407621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#endif
4089b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich
409c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if defined(__clang__)
4107eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #if !defined(sprintf)
4117eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define __wrap_sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__)
4127eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich    #define sprintf(...) __wrap_sprintf(__VA_ARGS__)
4137eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich  #endif
414c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#else
4159b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE
416d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 3)
4179b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint sprintf(char *dest, const char *format, ...)
4189b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{
4199b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich    return __builtin___sprintf_chk(dest, 0,
42078d6d9888c24c50f65d694dc8283afdcb58db84cNick Kralevich        __bos(dest), format, __builtin_va_arg_pack());
421cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich}
422c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif
423cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
424cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hughes#if !defined(__clang__)
425965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
426965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich__BIONIC_FORTIFY_INLINE
427cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hugheschar *fgets(char* dest, int size, FILE* stream) {
4289020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich    size_t bos = __bos(dest);
429965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
430965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
431965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always negative. Force a compiler error.
432965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    if (__builtin_constant_p(size) && (size < 0)) {
433965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_small_error();
434965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
435965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
436965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler doesn't know destination size. Don't call __fgets_chk
4379b6cc223a36835c4367a036d4cfeff14d25bc742Nick Kralevich    if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
438965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
439965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
440965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
441965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
442965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always <= the actual object size. Don't call __fgets_chk
44341b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes    if (__builtin_constant_p(size) && (size <= (int) bos)) {
444965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        return __fgets_real(dest, size, stream);
445965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
446965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
447965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // Compiler can prove, at compile time, that the passed in size
448965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    // is always > the actual object size. Force a compiler error.
44941b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes    if (__builtin_constant_p(size) && (size > (int) bos)) {
450965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich        __fgets_too_big_error();
451965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    }
452965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
453965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich    return __fgets_chk(dest, size, stream, bos);
454965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich}
455965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich
456c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* !defined(__clang__) */
457c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich
458c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* defined(__BIONIC_FORTIFY) */
459cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich
460658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__END_DECLS
461658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert
4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _STDIO_H_ */
463