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 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 423975cec694a0c9b42e3f7e671fcd678da92836c3Elliott Hughes#include <sys/types.h> 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdarg.h> 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stddef.h> 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 477d56ccbfaac2b702e4be0f71038efb7f251ef637Elliott Hughes#define __need_NULL 487d56ccbfaac2b702e4be0f71038efb7f251ef637Elliott Hughes#include <stddef.h> 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 50658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__BEGIN_DECLS 51658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert 529677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughestypedef off_t fpos_t; 539677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughestypedef off64_t fpos64_t; 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 55f0141dfab10a4b332769d52fa76631a64741297aElliott Hughesstruct __sFILE; 56f0141dfab10a4b332769d52fa76631a64741297aElliott Hughestypedef struct __sFILE FILE; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 58168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughesextern FILE* stdin; 59168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughesextern FILE* stdout; 60168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughesextern FILE* stderr; 61168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughes/* C99 and earlier plus current C++ standards say these must be macros. */ 62168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughes#define stdin stdin 63168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughes#define stdout stdout 64168667c972a1e9ede5b64ad6cee0666e9b96d4d8Elliott Hughes#define stderr stderr 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The following three definitions are for ANSI C, which took them 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from System V, which brilliantly took internal interface macros and 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * made them official arguments to setvbuf(), without renaming them. 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Hence, these ugly _IOxxx names are *supposed* to appear in user code. 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Although numbered as their counterparts above, the implementation 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * does not rely on this. 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _IOFBF 0 /* setvbuf should set fully buffered */ 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _IOLBF 1 /* setvbuf should set line buffered */ 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _IONBF 2 /* setvbuf should set unbuffered */ 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define BUFSIZ 1024 /* size of buffer used by setbuf */ 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EOF (-1) 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 83d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * FOPEN_MAX is a minimum maximum, and is the number of streams that 84d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * stdio can provide without attempting to allocate further resources 85d04c18397946f87ac4495351537c31a3d67257daElliott Hughes * (which could fail). Do not use this for anything. 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 87d04c18397946f87ac4495351537c31a3d67257daElliott Hughes 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FOPEN_MAX 20 /* must be <= OPEN_MAX <sys/syslimits.h> */ 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FILENAME_MAX 1024 /* must be <= PATH_MAX <sys/syslimits.h> */ 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */ 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __XPG_VISIBLE 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define P_tmpdir "/tmp/" 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define L_tmpnam 1024 /* XXX must be == PATH_MAX */ 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TMP_MAX 308915776 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981ed337dbdfd419db0365f4457b96fe129d21db90Elliott Hughes#define SEEK_SET 0 991ed337dbdfd419db0365f4457b96fe129d21db90Elliott Hughes#define SEEK_CUR 1 1001ed337dbdfd419db0365f4457b96fe129d21db90Elliott Hughes#define SEEK_END 2 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in ANSI C standard. 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid clearerr(FILE *); 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint fclose(FILE *); 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint feof(FILE *); 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ferror(FILE *); 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint fflush(FILE *); 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint fgetc(FILE *); 111d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar *fgets(char * __restrict, int, FILE * __restrict); 112d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint fprintf(FILE * __restrict , const char * __restrict, ...) 113d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(2, 3); 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint fputc(int, FILE *); 115d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint fputs(const char * __restrict, FILE * __restrict); 116d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t fread(void * __restrict, size_t, size_t, FILE * __restrict); 117d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint fscanf(FILE * __restrict, const char * __restrict, ...) 118d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __scanflike(2, 3); 119d04c18397946f87ac4495351537c31a3d67257daElliott Hughessize_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict); 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint getc(FILE *); 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint getchar(void); 122eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t getdelim(char ** __restrict, size_t * __restrict, int, 123eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdea FILE * __restrict); 124eac9eb462ed6f7fcfb791e7a08b4011fcca47829Irina Tirdeassize_t getline(char ** __restrict, size_t * __restrict, FILE * __restrict); 125c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid perror(const char *); 127d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint printf(const char * __restrict, ...) 128d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(1, 2); 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint putc(int, FILE *); 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint putchar(int); 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint puts(const char *); 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint remove(const char *); 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid rewind(FILE *); 134d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint scanf(const char * __restrict, ...) 135d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __scanflike(1, 2); 136d04c18397946f87ac4495351537c31a3d67257daElliott Hughesvoid setbuf(FILE * __restrict, char * __restrict); 137d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint setvbuf(FILE * __restrict, char * __restrict, int, size_t); 138d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint sscanf(const char * __restrict, const char * __restrict, ...) 139d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __scanflike(2, 3); 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ungetc(int, FILE *); 141d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint vfprintf(FILE * __restrict, const char * __restrict, __va_list) 142d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(2, 0); 143d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint vprintf(const char * __restrict, __va_list) 144d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(1, 0); 145d04c18397946f87ac4495351537c31a3d67257daElliott Hughes 146fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughesint dprintf(int, const char * __restrict, ...) __printflike(2, 3); 147fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughesint vdprintf(int, const char * __restrict, __va_list) __printflike(2, 0); 148fcac8ff97f6b6cced6546e0096cadc1039b68b5eElliott Hughes 149d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#ifndef __AUDIT__ 1509635046e53e14ff44348853a9cacdffd444b35aeDan Albert#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L 1519b4f77f5cfc45a377b7de7195341a7769a722b74Yabin Cuichar* gets(char*) __attribute__((deprecated("gets is unsafe, use fgets instead"))); 1529635046e53e14ff44348853a9cacdffd444b35aeDan Albert#endif 153c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughesint sprintf(char* __restrict, const char* __restrict, ...) 154c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes __printflike(2, 3) __warnattr("sprintf is often misused; please use snprintf"); 155c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughesint vsprintf(char* __restrict, const char* __restrict, __va_list) 156c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes __printflike(2, 0) __warnattr("vsprintf is often misused; please use vsnprintf"); 1579b4f77f5cfc45a377b7de7195341a7769a722b74Yabin Cuichar* tmpnam(char*) __attribute__((deprecated("tmpnam is unsafe, use mkstemp or tmpfile instead"))); 158c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes#if __XPG_VISIBLE 159c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hugheschar* tempnam(const char*, const char*) 1609b4f77f5cfc45a377b7de7195341a7769a722b74Yabin Cui __attribute__((deprecated("tempnam is unsafe, use mkstemp or tmpfile instead"))); 161c13fb75ceabb47f8292be206db80b93889fccf66Elliott Hughes#endif 162d04c18397946f87ac4495351537c31a3d67257daElliott Hughes#endif 163d04c18397946f87ac4495351537c31a3d67257daElliott Hughes 1649677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint rename(const char*, const char*); 1659677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint renameat(int, const char*, int, const char*); 166d04c18397946f87ac4495351537c31a3d67257daElliott Hughes 1679677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fseek(FILE*, long, int); 1689677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hugheslong ftell(FILE*); 16903e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes 17068dc20d41193831a94df04b994ff2f601dd38d10Elliott Hughes#if defined(__USE_FILE_OFFSET64) 1719677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fgetpos(FILE*, fpos_t*) __RENAME(fgetpos64); 1729677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fsetpos(FILE*, const fpos_t*) __RENAME(fsetpos64); 1739677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fseeko(FILE*, off_t, int) __RENAME(fseeko64); 1749677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesoff_t ftello(FILE*) __RENAME(ftello64); 17503e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes# if defined(__USE_BSD) 17603e65eb03bf0bfaafa797daf91e80e8308968db3Elliott HughesFILE* funopen(const void*, 17703e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*, char*, int), 17803e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*, const char*, int), 17903e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes fpos_t (*)(void*, fpos_t, int), 18003e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*)) __RENAME(funopen64); 18103e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes# endif 18268dc20d41193831a94df04b994ff2f601dd38d10Elliott Hughes#else 1839677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fgetpos(FILE*, fpos_t*); 1849677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fsetpos(FILE*, const fpos_t*); 1859677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fseeko(FILE*, off_t, int); 1869677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesoff_t ftello(FILE*); 18703e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes# if defined(__USE_BSD) 18803e65eb03bf0bfaafa797daf91e80e8308968db3Elliott HughesFILE* funopen(const void*, 18903e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*, char*, int), 19003e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*, const char*, int), 19103e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes fpos_t (*)(void*, fpos_t, int), 19203e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*)); 19303e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes# endif 19468dc20d41193831a94df04b994ff2f601dd38d10Elliott Hughes#endif 1959677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fgetpos64(FILE*, fpos64_t*); 1969677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fsetpos64(FILE*, const fpos64_t*); 1979677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesint fseeko64(FILE*, off64_t, int); 1989677fab88c25fd2e6f3149ad00fb8870963f0675Elliott Hughesoff64_t ftello64(FILE*); 19903e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes#if defined(__USE_BSD) 20003e65eb03bf0bfaafa797daf91e80e8308968db3Elliott HughesFILE* funopen64(const void*, 20103e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*, char*, int), 20203e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*, const char*, int), 20303e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes fpos64_t (*)(void*, fpos64_t, int), 20403e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes int (*)(void*)); 20503e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes#endif 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 207f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott HughesFILE* fopen(const char* __restrict, const char* __restrict); 208f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott HughesFILE* fopen64(const char* __restrict, const char* __restrict); 209f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott HughesFILE* freopen(const char* __restrict, const char* __restrict, FILE* __restrict); 210f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott HughesFILE* freopen64(const char* __restrict, const char* __restrict, FILE* __restrict); 211f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott HughesFILE* tmpfile(void); 212f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott HughesFILE* tmpfile64(void); 213f226ee59e0effedeabed09e2d65be7fa7499cc25Elliott Hughes 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE 215d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint snprintf(char * __restrict, size_t, const char * __restrict, ...) 216d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(3, 4); 217d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint vfscanf(FILE * __restrict, const char * __restrict, __va_list) 218d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __scanflike(2, 0); 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint vscanf(const char *, __va_list) 220d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __scanflike(1, 0); 221d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list) 222d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(3, 0); 223d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint vsscanf(const char * __restrict, const char * __restrict, __va_list) 224d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __scanflike(2, 0); 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */ 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Functions defined in POSIX 1003.1. 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define L_ctermid 1024 /* size for ctermid(); PATH_MAX */ 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE *fdopen(int, const char *); 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint fileno(FILE *); 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 23650ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#if (__POSIX_VISIBLE >= 199209) 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint pclose(FILE *); 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectFILE *popen(const char *, const char *); 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __POSIX_VISIBLE >= 199506 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid flockfile(FILE *); 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ftrylockfile(FILE *); 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid funlockfile(FILE *); 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * These are normally used through macros as defined below, but POSIX 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * requires functions as well. 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint getc_unlocked(FILE *); 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint getchar_unlocked(void); 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint putc_unlocked(int, FILE *); 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint putchar_unlocked(int); 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __POSIX_VISIBLE >= 199506 */ 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2566b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes#if __POSIX_VISIBLE >= 200809 2576b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott HughesFILE* fmemopen(void*, size_t, const char*); 2586b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott HughesFILE* open_memstream(char**, size_t*); 2596b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes#endif /* __POSIX_VISIBLE >= 200809 */ 2606b841db2baa24ffcf2a4e5f975d1d07f1699b918Elliott Hughes 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE || __POSIX_VISIBLE || __XPG_VISIBLE */ 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Routines that are purely local. 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if __BSD_VISIBLE 267d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint asprintf(char ** __restrict, const char * __restrict, ...) 268d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(2, 3); 269d04c18397946f87ac4495351537c31a3d67257daElliott Hugheschar *fgetln(FILE * __restrict, size_t * __restrict); 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint fpurge(FILE *); 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid setbuffer(FILE *, char *, int); 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint setlinebuf(FILE *); 273d04c18397946f87ac4495351537c31a3d67257daElliott Hughesint vasprintf(char ** __restrict, const char * __restrict, 274d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __va_list) 275d04c18397946f87ac4495351537c31a3d67257daElliott Hughes __printflike(2, 0); 2762b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughes 2772b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesvoid clearerr_unlocked(FILE*); 2782b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesint feof_unlocked(FILE*); 2792b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughesint ferror_unlocked(FILE*); 280fb994f4c040da968b7271860535f07daba182069Yabin Cuiint fileno_unlocked(FILE*); 2812b021e10664c3938249eb18b48eeac253cbb3e20Elliott Hughes 28203e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0) 28303e65eb03bf0bfaafa797daf91e80e8308968db3Elliott Hughes#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* __BSD_VISIBLE */ 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 286658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albertextern char* __fgets_chk(char*, int, FILE*, size_t); 287658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albertextern char* __fgets_real(char*, int, FILE*) __RENAME(fgets); 288658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer"); 289658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__errordecl(__fgets_too_small_error, "fgets called with size less than zero"); 290cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich 291fed2659869ec41a93f655be8058568ddab419e01Daniel Micayextern size_t __fread_chk(void * __restrict, size_t, size_t, FILE * __restrict, size_t); 292fed2659869ec41a93f655be8058568ddab419e01Daniel Micayextern size_t __fread_real(void * __restrict, size_t, size_t, FILE * __restrict) __RENAME(fread); 293fed2659869ec41a93f655be8058568ddab419e01Daniel Micay__errordecl(__fread_too_big_error, "fread called with size * count bigger than buffer"); 294fed2659869ec41a93f655be8058568ddab419e01Daniel Micay__errordecl(__fread_overflow, "fread called with overflowing size * count"); 295fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 296fed2659869ec41a93f655be8058568ddab419e01Daniel Micayextern size_t __fwrite_chk(const void * __restrict, size_t, size_t, FILE * __restrict, size_t); 297fed2659869ec41a93f655be8058568ddab419e01Daniel Micayextern size_t __fwrite_real(const void * __restrict, size_t, size_t, FILE * __restrict) __RENAME(fwrite); 298fed2659869ec41a93f655be8058568ddab419e01Daniel Micay__errordecl(__fwrite_too_big_error, "fwrite called with size * count bigger than buffer"); 299fed2659869ec41a93f655be8058568ddab419e01Daniel Micay__errordecl(__fwrite_overflow, "fwrite called with overflowing size * count"); 300fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 301658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert#if defined(__BIONIC_FORTIFY) 302ce45fea03ddfd8d6d1900d6777a002dec98ea1e1Elliott Hughes 303cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE 304d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 0) 3059b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsnprintf(char *dest, size_t size, const char *format, __va_list ap) 3069b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{ 3079020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich return __builtin___vsnprintf_chk(dest, size, 0, __bos(dest), format, ap); 3089b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich} 3099b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich 3109b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE 311d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 0) 3129b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint vsprintf(char *dest, const char *format, __va_list ap) 313cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{ 3149020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich return __builtin___vsprintf_chk(dest, 0, __bos(dest), format, ap); 315cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich} 316cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich 317621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#if defined(__clang__) 3187eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #if !defined(snprintf) 3197eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #define __wrap_snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__) 3207eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #define snprintf(...) __wrap_snprintf(__VA_ARGS__) 3217eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #endif 322621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#else 323cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich__BIONIC_FORTIFY_INLINE 324d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(3, 4) 325621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevichint snprintf(char *dest, size_t size, const char *format, ...) 326cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich{ 327621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich return __builtin___snprintf_chk(dest, size, 0, 328621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich __bos(dest), format, __builtin_va_arg_pack()); 3299b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich} 330621b19dddbfba1cd98c01cb95ce312baa20e0e7cNick Kralevich#endif 3319b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich 332c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#if defined(__clang__) 3337eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #if !defined(sprintf) 3347eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #define __wrap_sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__) 3357eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #define sprintf(...) __wrap_sprintf(__VA_ARGS__) 3367eb28b59c7665654255640e3fac4ccd5a9e1cbabNick Kralevich #endif 337c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#else 3389b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich__BIONIC_FORTIFY_INLINE 339d04c18397946f87ac4495351537c31a3d67257daElliott Hughes__printflike(2, 3) 3409b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevichint sprintf(char *dest, const char *format, ...) 3419b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich{ 3429b549c39c938f54680f282c21e6885f53254bfb0Nick Kralevich return __builtin___sprintf_chk(dest, 0, 34378d6d9888c24c50f65d694dc8283afdcb58db84cNick Kralevich __bos(dest), format, __builtin_va_arg_pack()); 344cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich} 345c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif 346cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich 347fed2659869ec41a93f655be8058568ddab419e01Daniel Micay__BIONIC_FORTIFY_INLINE 348fed2659869ec41a93f655be8058568ddab419e01Daniel Micaysize_t fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict stream) { 349fed2659869ec41a93f655be8058568ddab419e01Daniel Micay size_t bos = __bos0(buf); 350fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 351fed2659869ec41a93f655be8058568ddab419e01Daniel Micay#if !defined(__clang__) 352fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { 353fed2659869ec41a93f655be8058568ddab419e01Daniel Micay return __fread_real(buf, size, count, stream); 354fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 355fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 356fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (__builtin_constant_p(size) && __builtin_constant_p(count)) { 357fed2659869ec41a93f655be8058568ddab419e01Daniel Micay size_t total; 358fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (__size_mul_overflow(size, count, &total)) { 359fed2659869ec41a93f655be8058568ddab419e01Daniel Micay __fread_overflow(); 360fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 361fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 362fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (total > bos) { 363fed2659869ec41a93f655be8058568ddab419e01Daniel Micay __fread_too_big_error(); 364fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 365fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 366fed2659869ec41a93f655be8058568ddab419e01Daniel Micay return __fread_real(buf, size, count, stream); 367fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 368fed2659869ec41a93f655be8058568ddab419e01Daniel Micay#endif 369fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 370fed2659869ec41a93f655be8058568ddab419e01Daniel Micay return __fread_chk(buf, size, count, stream, bos); 371fed2659869ec41a93f655be8058568ddab419e01Daniel Micay} 372fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 373fed2659869ec41a93f655be8058568ddab419e01Daniel Micay__BIONIC_FORTIFY_INLINE 374fed2659869ec41a93f655be8058568ddab419e01Daniel Micaysize_t fwrite(const void * __restrict buf, size_t size, size_t count, FILE * __restrict stream) { 375fed2659869ec41a93f655be8058568ddab419e01Daniel Micay size_t bos = __bos0(buf); 376fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 377fed2659869ec41a93f655be8058568ddab419e01Daniel Micay#if !defined(__clang__) 378fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { 379fed2659869ec41a93f655be8058568ddab419e01Daniel Micay return __fwrite_real(buf, size, count, stream); 380fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 381fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 382fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (__builtin_constant_p(size) && __builtin_constant_p(count)) { 383fed2659869ec41a93f655be8058568ddab419e01Daniel Micay size_t total; 384fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (__size_mul_overflow(size, count, &total)) { 385fed2659869ec41a93f655be8058568ddab419e01Daniel Micay __fwrite_overflow(); 386fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 387fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 388fed2659869ec41a93f655be8058568ddab419e01Daniel Micay if (total > bos) { 389fed2659869ec41a93f655be8058568ddab419e01Daniel Micay __fwrite_too_big_error(); 390fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 391fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 392fed2659869ec41a93f655be8058568ddab419e01Daniel Micay return __fwrite_real(buf, size, count, stream); 393fed2659869ec41a93f655be8058568ddab419e01Daniel Micay } 394fed2659869ec41a93f655be8058568ddab419e01Daniel Micay#endif 395fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 396fed2659869ec41a93f655be8058568ddab419e01Daniel Micay return __fwrite_chk(buf, size, count, stream, bos); 397fed2659869ec41a93f655be8058568ddab419e01Daniel Micay} 398fed2659869ec41a93f655be8058568ddab419e01Daniel Micay 399cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hughes#if !defined(__clang__) 400965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 401965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich__BIONIC_FORTIFY_INLINE 402cd0609f4fcec9bdcb99a2127137c5570b18c499cElliott Hugheschar *fgets(char* dest, int size, FILE* stream) { 4039020fd503c9eb073f70dbc239a212f8ece19359dNick Kralevich size_t bos = __bos(dest); 404965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 405965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // Compiler can prove, at compile time, that the passed in size 406965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // is always negative. Force a compiler error. 407965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich if (__builtin_constant_p(size) && (size < 0)) { 408965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich __fgets_too_small_error(); 409965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich } 410965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 411965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // Compiler doesn't know destination size. Don't call __fgets_chk 4129b6cc223a36835c4367a036d4cfeff14d25bc742Nick Kralevich if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { 413965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich return __fgets_real(dest, size, stream); 414965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich } 415965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 416965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // Compiler can prove, at compile time, that the passed in size 417965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // is always <= the actual object size. Don't call __fgets_chk 41841b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes if (__builtin_constant_p(size) && (size <= (int) bos)) { 419965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich return __fgets_real(dest, size, stream); 420965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich } 421965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 422965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // Compiler can prove, at compile time, that the passed in size 423965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich // is always > the actual object size. Force a compiler error. 42441b3179c9ef03ebb447cac7f5e8405dce399cb17Elliott Hughes if (__builtin_constant_p(size) && (size > (int) bos)) { 425965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich __fgets_too_big_error(); 426965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich } 427965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 428965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich return __fgets_chk(dest, size, stream, bos); 429965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich} 430965dbc6405aa2c3170270cfc53a8d4416444fddbNick Kralevich 431c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* !defined(__clang__) */ 432c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich 433c6eb9854542c115fd9aa87731adcb1b5da57e8acNick Kralevich#endif /* defined(__BIONIC_FORTIFY) */ 434cffdf6693ffb50d2a1258d955a162bca83038f25Nick Kralevich 435658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert__END_DECLS 436658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert 4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _STDIO_H_ */ 438