1570af302Sopenharmony_ci#ifndef _STDIO_H
2570af302Sopenharmony_ci#define _STDIO_H
3570af302Sopenharmony_ci
4570af302Sopenharmony_ci#ifdef __cplusplus
5570af302Sopenharmony_ciextern "C" {
6570af302Sopenharmony_ci#endif
7570af302Sopenharmony_ci
8570af302Sopenharmony_ci#include <features.h>
9570af302Sopenharmony_ci#include <stdint.h>
10570af302Sopenharmony_ci
11570af302Sopenharmony_ci#define __NEED_FILE
12570af302Sopenharmony_ci#define __NEED___isoc_va_list
13570af302Sopenharmony_ci#define __NEED_size_t
14570af302Sopenharmony_ci
15570af302Sopenharmony_ci#if __STDC_VERSION__ < 201112L
16570af302Sopenharmony_ci#define __NEED_struct__IO_FILE
17570af302Sopenharmony_ci#endif
18570af302Sopenharmony_ci
19570af302Sopenharmony_ci#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
20570af302Sopenharmony_ci || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
21570af302Sopenharmony_ci || defined(_BSD_SOURCE)
22570af302Sopenharmony_ci#define __NEED_ssize_t
23570af302Sopenharmony_ci#define __NEED_off_t
24570af302Sopenharmony_ci#define __NEED_va_list
25570af302Sopenharmony_ci#endif
26570af302Sopenharmony_ci
27570af302Sopenharmony_ci#include <bits/alltypes.h>
28570af302Sopenharmony_ci
29570af302Sopenharmony_ci#if __cplusplus >= 201103L
30570af302Sopenharmony_ci#define NULL nullptr
31570af302Sopenharmony_ci#elif defined(__cplusplus)
32570af302Sopenharmony_ci#define NULL 0L
33570af302Sopenharmony_ci#else
34570af302Sopenharmony_ci#define NULL ((void*)0)
35570af302Sopenharmony_ci#endif
36570af302Sopenharmony_ci
37570af302Sopenharmony_ci#undef EOF
38570af302Sopenharmony_ci#define EOF (-1)
39570af302Sopenharmony_ci
40570af302Sopenharmony_ci#undef SEEK_SET
41570af302Sopenharmony_ci#undef SEEK_CUR
42570af302Sopenharmony_ci#undef SEEK_END
43570af302Sopenharmony_ci#define SEEK_SET 0
44570af302Sopenharmony_ci#define SEEK_CUR 1
45570af302Sopenharmony_ci#define SEEK_END 2
46570af302Sopenharmony_ci
47570af302Sopenharmony_ci#define _IOFBF 0
48570af302Sopenharmony_ci#define _IOLBF 1
49570af302Sopenharmony_ci#define _IONBF 2
50570af302Sopenharmony_ci
51570af302Sopenharmony_ci#define BUFSIZ 1024
52570af302Sopenharmony_ci#define FILENAME_MAX 4096
53570af302Sopenharmony_ci#define FOPEN_MAX 1000
54570af302Sopenharmony_ci#define TMP_MAX 10000
55570af302Sopenharmony_ci#define L_tmpnam 20
56570af302Sopenharmony_ci
57570af302Sopenharmony_citypedef union _G_fpos64_t {
58570af302Sopenharmony_ci	char __opaque[16];
59570af302Sopenharmony_ci	long long __lldata;
60570af302Sopenharmony_ci	double __align;
61570af302Sopenharmony_ci} fpos_t;
62570af302Sopenharmony_ci
63570af302Sopenharmony_ciextern FILE *const stdin;
64570af302Sopenharmony_ciextern FILE *const stdout;
65570af302Sopenharmony_ciextern FILE *const stderr;
66570af302Sopenharmony_ci
67570af302Sopenharmony_ci#define stdin  (stdin)
68570af302Sopenharmony_ci#define stdout (stdout)
69570af302Sopenharmony_ci#define stderr (stderr)
70570af302Sopenharmony_ci
71570af302Sopenharmony_ciFILE *fopen(const char *__restrict, const char *__restrict);
72570af302Sopenharmony_ciFILE *freopen(const char *__restrict, const char *__restrict, FILE *__restrict);
73570af302Sopenharmony_ciint fclose(FILE *);
74570af302Sopenharmony_ci
75570af302Sopenharmony_ciint remove(const char *);
76570af302Sopenharmony_ciint rename(const char *, const char *);
77570af302Sopenharmony_ci
78570af302Sopenharmony_ciint feof(FILE *);
79570af302Sopenharmony_ciint ferror(FILE *);
80570af302Sopenharmony_ciint fflush(FILE *);
81570af302Sopenharmony_civoid clearerr(FILE *);
82570af302Sopenharmony_ci
83570af302Sopenharmony_ciint fseek(FILE *, long, int);
84570af302Sopenharmony_cilong ftell(FILE *);
85570af302Sopenharmony_civoid rewind(FILE *);
86570af302Sopenharmony_ci
87570af302Sopenharmony_ciint fgetpos(FILE *__restrict, fpos_t *__restrict);
88570af302Sopenharmony_ciint fsetpos(FILE *, const fpos_t *);
89570af302Sopenharmony_ci
90570af302Sopenharmony_cisize_t fread(void *__restrict, size_t, size_t, FILE *__restrict);
91570af302Sopenharmony_cisize_t fwrite(const void *__restrict, size_t, size_t, FILE *__restrict);
92570af302Sopenharmony_ci
93570af302Sopenharmony_ciint fgetc(FILE *);
94570af302Sopenharmony_ciint getc(FILE *);
95570af302Sopenharmony_ciint getchar(void);
96570af302Sopenharmony_ciint ungetc(int, FILE *);
97570af302Sopenharmony_ci
98570af302Sopenharmony_ciint fputc(int, FILE *);
99570af302Sopenharmony_ciint putc(int, FILE *);
100570af302Sopenharmony_ciint putchar(int);
101570af302Sopenharmony_ci
102570af302Sopenharmony_cichar *fgets(char *__restrict, int, FILE *__restrict);
103570af302Sopenharmony_ci#if __STDC_VERSION__ < 201112L
104570af302Sopenharmony_cichar *gets(char *);
105570af302Sopenharmony_ci#endif
106570af302Sopenharmony_ci
107570af302Sopenharmony_ciint fputs(const char *__restrict, FILE *__restrict);
108570af302Sopenharmony_ciint puts(const char *);
109570af302Sopenharmony_ci
110570af302Sopenharmony_ciint printf(const char *__restrict, ...);
111570af302Sopenharmony_ciint fprintf(FILE *__restrict, const char *__restrict, ...);
112570af302Sopenharmony_ciint sprintf(char *__restrict, const char *__restrict, ...);
113570af302Sopenharmony_ciint snprintf(char *__restrict, size_t, const char *__restrict, ...);
114570af302Sopenharmony_ci
115570af302Sopenharmony_ciint vprintf(const char *__restrict, __isoc_va_list);
116570af302Sopenharmony_ciint vfprintf(FILE *__restrict, const char *__restrict, __isoc_va_list);
117570af302Sopenharmony_ciint vsprintf(char *__restrict, const char *__restrict, __isoc_va_list);
118570af302Sopenharmony_ciint vsnprintf(char *__restrict, size_t, const char *__restrict, __isoc_va_list);
119570af302Sopenharmony_ci
120570af302Sopenharmony_ciint scanf(const char *__restrict, ...);
121570af302Sopenharmony_ciint fscanf(FILE *__restrict, const char *__restrict, ...);
122570af302Sopenharmony_ciint sscanf(const char *__restrict, const char *__restrict, ...);
123570af302Sopenharmony_ciint vscanf(const char *__restrict, __isoc_va_list);
124570af302Sopenharmony_ciint vfscanf(FILE *__restrict, const char *__restrict, __isoc_va_list);
125570af302Sopenharmony_ciint vsscanf(const char *__restrict, const char *__restrict, __isoc_va_list);
126570af302Sopenharmony_ci
127570af302Sopenharmony_civoid perror(const char *);
128570af302Sopenharmony_ci
129570af302Sopenharmony_ciint setvbuf(FILE *__restrict, char *__restrict, int, size_t);
130570af302Sopenharmony_civoid setbuf(FILE *__restrict, char *__restrict);
131570af302Sopenharmony_ci
132570af302Sopenharmony_cichar *tmpnam(char *);
133570af302Sopenharmony_ciFILE *tmpfile(void);
134570af302Sopenharmony_ci
135570af302Sopenharmony_ci#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
136570af302Sopenharmony_ci || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
137570af302Sopenharmony_ci || defined(_BSD_SOURCE)
138570af302Sopenharmony_ciFILE *fmemopen(void *__restrict, size_t, const char *__restrict);
139570af302Sopenharmony_ciFILE *open_memstream(char **, size_t *);
140570af302Sopenharmony_ciFILE *fdopen(int, const char *);
141570af302Sopenharmony_ciFILE *popen(const char *, const char *);
142570af302Sopenharmony_ciint pclose(FILE *);
143570af302Sopenharmony_ciint fileno(FILE *);
144570af302Sopenharmony_ciint fseeko(FILE *, off_t, int);
145570af302Sopenharmony_cioff_t ftello(FILE *);
146570af302Sopenharmony_ciint dprintf(int, const char *__restrict, ...);
147570af302Sopenharmony_ciint vdprintf(int, const char *__restrict, __isoc_va_list);
148570af302Sopenharmony_civoid flockfile(FILE *);
149570af302Sopenharmony_ciint ftrylockfile(FILE *);
150570af302Sopenharmony_civoid funlockfile(FILE *);
151570af302Sopenharmony_ciint getc_unlocked(FILE *);
152570af302Sopenharmony_ciint getchar_unlocked(void);
153570af302Sopenharmony_ciint putc_unlocked(int, FILE *);
154570af302Sopenharmony_ciint putchar_unlocked(int);
155570af302Sopenharmony_cissize_t getdelim(char **__restrict, size_t *__restrict, int, FILE *__restrict);
156570af302Sopenharmony_cissize_t getline(char **__restrict, size_t *__restrict, FILE *__restrict);
157570af302Sopenharmony_ciint renameat(int, const char *, int, const char *);
158570af302Sopenharmony_ci#define RENAME_NOREPLACE (1 << 0)
159570af302Sopenharmony_ci#define RENAME_EXCHANGE  (1 << 1)
160570af302Sopenharmony_ci#define RENAME_WHITEOUT  (1 << 2)
161570af302Sopenharmony_ciint renameat2(int, const char *, int, const char *, unsigned int);
162570af302Sopenharmony_cichar *ctermid(char *);
163570af302Sopenharmony_ci#define L_ctermid 20
164570af302Sopenharmony_ci#endif
165570af302Sopenharmony_ci
166570af302Sopenharmony_ci
167570af302Sopenharmony_ci#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
168570af302Sopenharmony_ci || defined(_BSD_SOURCE)
169570af302Sopenharmony_ci#define P_tmpdir "/tmp"
170570af302Sopenharmony_cichar *tempnam(const char *, const char *);
171570af302Sopenharmony_ci#endif
172570af302Sopenharmony_ci
173570af302Sopenharmony_ci#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
174570af302Sopenharmony_ci#define L_cuserid 20
175570af302Sopenharmony_cichar *cuserid(char *);
176570af302Sopenharmony_civoid setlinebuf(FILE *);
177570af302Sopenharmony_civoid setbuffer(FILE *, char *, size_t);
178570af302Sopenharmony_ciint fgetc_unlocked(FILE *);
179570af302Sopenharmony_ciint fputc_unlocked(int, FILE *);
180570af302Sopenharmony_ciint fflush_unlocked(FILE *);
181570af302Sopenharmony_cisize_t fread_unlocked(void *, size_t, size_t, FILE *);
182570af302Sopenharmony_cisize_t fwrite_unlocked(const void *, size_t, size_t, FILE *);
183570af302Sopenharmony_civoid clearerr_unlocked(FILE *);
184570af302Sopenharmony_ciint feof_unlocked(FILE *);
185570af302Sopenharmony_ciint ferror_unlocked(FILE *);
186570af302Sopenharmony_ciint fileno_unlocked(FILE *);
187570af302Sopenharmony_ciint getw(FILE *);
188570af302Sopenharmony_ciint putw(int, FILE *);
189570af302Sopenharmony_cichar *fgetln(FILE *, size_t *);
190570af302Sopenharmony_ciint asprintf(char **, const char *, ...);
191570af302Sopenharmony_ciint vasprintf(char **, const char *, __isoc_va_list);
192570af302Sopenharmony_ci#endif
193570af302Sopenharmony_ci
194570af302Sopenharmony_ci#ifdef _GNU_SOURCE
195570af302Sopenharmony_cichar *fgets_unlocked(char *, int, FILE *);
196570af302Sopenharmony_ciint fputs_unlocked(const char *, FILE *);
197570af302Sopenharmony_ci
198570af302Sopenharmony_citypedef ssize_t (cookie_read_function_t)(void *, char *, size_t);
199570af302Sopenharmony_citypedef ssize_t (cookie_write_function_t)(void *, const char *, size_t);
200570af302Sopenharmony_citypedef int (cookie_seek_function_t)(void *, off_t *, int);
201570af302Sopenharmony_citypedef int (cookie_close_function_t)(void *);
202570af302Sopenharmony_ci
203570af302Sopenharmony_citypedef struct _IO_cookie_io_functions_t {
204570af302Sopenharmony_ci	cookie_read_function_t *read;
205570af302Sopenharmony_ci	cookie_write_function_t *write;
206570af302Sopenharmony_ci	cookie_seek_function_t *seek;
207570af302Sopenharmony_ci	cookie_close_function_t *close;
208570af302Sopenharmony_ci} cookie_io_functions_t;
209570af302Sopenharmony_ci
210570af302Sopenharmony_ciFILE *fopencookie(void *, const char *, cookie_io_functions_t);
211570af302Sopenharmony_ci#endif
212570af302Sopenharmony_ci
213570af302Sopenharmony_ci#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
214570af302Sopenharmony_ci#define tmpfile64 tmpfile
215570af302Sopenharmony_ci#define fopen64 fopen
216570af302Sopenharmony_ci#define freopen64 freopen
217570af302Sopenharmony_ci#define fseeko64 fseeko
218570af302Sopenharmony_ci#define ftello64 ftello
219570af302Sopenharmony_ci#define fgetpos64 fgetpos
220570af302Sopenharmony_ci#define fsetpos64 fsetpos
221570af302Sopenharmony_ci#define fpos64_t fpos_t
222570af302Sopenharmony_ci#define off64_t off_t
223570af302Sopenharmony_ci#endif
224570af302Sopenharmony_ci
225570af302Sopenharmony_cienum fdsan_owner_type {
226570af302Sopenharmony_ci	FDSAN_OWNER_TYPE_DEFAULT = 0,
227570af302Sopenharmony_ci	FDSAN_OWNER_TYPE_MAX = 255,
228570af302Sopenharmony_ci
229570af302Sopenharmony_ci	/* FILE* */
230570af302Sopenharmony_ci	FDSAN_OWNER_TYPE_FILE = 1,
231570af302Sopenharmony_ci
232570af302Sopenharmony_ci	/* DIR* */
233570af302Sopenharmony_ci	FDSAN_OWNER_TYPE_DIRECTORY = 2,
234570af302Sopenharmony_ci
235570af302Sopenharmony_ci	/* unique_fd */
236570af302Sopenharmony_ci	FDSAN_OWNER_TYPE_UNIQUE_FD = 3,
237570af302Sopenharmony_ci
238570af302Sopenharmony_ci	/* ziparchive */
239570af302Sopenharmony_ci	FDSAN_OWNER_TYPE_ZIP_ARCHIVE = 4,
240570af302Sopenharmony_ci};
241570af302Sopenharmony_ci
242570af302Sopenharmony_civoid* fdsan_get_fd_table();
243570af302Sopenharmony_ciuint64_t fdsan_create_owner_tag(enum fdsan_owner_type type, uint64_t tag);
244570af302Sopenharmony_civoid fdsan_exchange_owner_tag(int fd, uint64_t expected_tag, uint64_t new_tag);
245570af302Sopenharmony_ciint fdsan_close_with_tag(int fd, uint64_t tag);
246570af302Sopenharmony_ciuint64_t fdsan_get_owner_tag(int fd);
247570af302Sopenharmony_ciconst char* fdsan_get_tag_type(uint64_t tag);
248570af302Sopenharmony_ciuint64_t fdsan_get_tag_value(uint64_t tag);
249570af302Sopenharmony_ci
250570af302Sopenharmony_cienum fdsan_error_level {
251570af302Sopenharmony_ci	// No errors.
252570af302Sopenharmony_ci	FDSAN_ERROR_LEVEL_DISABLED,
253570af302Sopenharmony_ci
254570af302Sopenharmony_ci	// Warn once(ish) on error, and then downgrade to FDSAN_ERROR_LEVEL_DISABLED.
255570af302Sopenharmony_ci	FDSAN_ERROR_LEVEL_WARN_ONCE,
256570af302Sopenharmony_ci
257570af302Sopenharmony_ci	// Warn always on error.
258570af302Sopenharmony_ci	FDSAN_ERROR_LEVEL_WARN_ALWAYS,
259570af302Sopenharmony_ci
260570af302Sopenharmony_ci	// Abort on error.
261570af302Sopenharmony_ci	FDSAN_ERROR_LEVEL_FATAL,
262570af302Sopenharmony_ci};
263570af302Sopenharmony_ci
264570af302Sopenharmony_cienum fdsan_error_level fdsan_get_error_level();
265570af302Sopenharmony_cienum fdsan_error_level fdsan_set_error_level(enum fdsan_error_level new_level);
266570af302Sopenharmony_cienum fdsan_error_level fdsan_set_error_level_from_param(enum fdsan_error_level default_level);
267570af302Sopenharmony_ci
268570af302Sopenharmony_ci#include <fortify/stdio.h>
269570af302Sopenharmony_ci
270570af302Sopenharmony_ci#ifdef __cplusplus
271570af302Sopenharmony_ci}
272570af302Sopenharmony_ci#endif
273570af302Sopenharmony_ci
274570af302Sopenharmony_ci#endif
275