17777dab0Sopenharmony_ci#ifndef _STDIO_H
27777dab0Sopenharmony_ci#define _STDIO_H
37777dab0Sopenharmony_ci
47777dab0Sopenharmony_ci#ifdef __cplusplus
57777dab0Sopenharmony_ciextern "C" {
67777dab0Sopenharmony_ci#endif
77777dab0Sopenharmony_ci
87777dab0Sopenharmony_ci#include <features.h>
97777dab0Sopenharmony_ci#include <stdint.h>
107777dab0Sopenharmony_ci
117777dab0Sopenharmony_ci#define __NEED_FILE
127777dab0Sopenharmony_ci#define __NEED___isoc_va_list
137777dab0Sopenharmony_ci#define __NEED_size_t
147777dab0Sopenharmony_ci
157777dab0Sopenharmony_ci#if __STDC_VERSION__ < 201112L
167777dab0Sopenharmony_ci#define __NEED_struct__IO_FILE
177777dab0Sopenharmony_ci#endif
187777dab0Sopenharmony_ci
197777dab0Sopenharmony_ci#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
207777dab0Sopenharmony_ci || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
217777dab0Sopenharmony_ci || defined(_BSD_SOURCE)
227777dab0Sopenharmony_ci#define __NEED_ssize_t
237777dab0Sopenharmony_ci#define __NEED_off_t
247777dab0Sopenharmony_ci#define __NEED_va_list
257777dab0Sopenharmony_ci#endif
267777dab0Sopenharmony_ci
277777dab0Sopenharmony_ci#include <bits/alltypes.h>
287777dab0Sopenharmony_ci
297777dab0Sopenharmony_ci#ifdef __cplusplus
307777dab0Sopenharmony_ci#define NULL 0L
317777dab0Sopenharmony_ci#else
327777dab0Sopenharmony_ci#define NULL ((void*)0)
337777dab0Sopenharmony_ci#endif
347777dab0Sopenharmony_ci
357777dab0Sopenharmony_ci#undef EOF
367777dab0Sopenharmony_ci#define EOF (-1)
377777dab0Sopenharmony_ci
387777dab0Sopenharmony_ci#undef SEEK_SET
397777dab0Sopenharmony_ci#undef SEEK_CUR
407777dab0Sopenharmony_ci#undef SEEK_END
417777dab0Sopenharmony_ci#define SEEK_SET 0
427777dab0Sopenharmony_ci#define SEEK_CUR 1
437777dab0Sopenharmony_ci#define SEEK_END 2
447777dab0Sopenharmony_ci
457777dab0Sopenharmony_ci#define _IOFBF 0
467777dab0Sopenharmony_ci#define _IOLBF 1
477777dab0Sopenharmony_ci#define _IONBF 2
487777dab0Sopenharmony_ci
497777dab0Sopenharmony_ci#define BUFSIZ 1024
507777dab0Sopenharmony_ci#define FILENAME_MAX 4096
517777dab0Sopenharmony_ci#define FOPEN_MAX 1000
527777dab0Sopenharmony_ci#define TMP_MAX 10000
537777dab0Sopenharmony_ci#define L_tmpnam 20
547777dab0Sopenharmony_ci
557777dab0Sopenharmony_citypedef union _G_fpos64_t {
567777dab0Sopenharmony_ci	char __opaque[16];
577777dab0Sopenharmony_ci	long long __lldata;
587777dab0Sopenharmony_ci	double __align;
597777dab0Sopenharmony_ci} fpos_t;
607777dab0Sopenharmony_ci
617777dab0Sopenharmony_ciextern FILE *const stdin;
627777dab0Sopenharmony_ciextern FILE *const stdout;
637777dab0Sopenharmony_ciextern FILE *const stderr;
647777dab0Sopenharmony_ci
657777dab0Sopenharmony_ci#define stdin  (stdin)
667777dab0Sopenharmony_ci#define stdout (stdout)
677777dab0Sopenharmony_ci#define stderr (stderr)
687777dab0Sopenharmony_ci
697777dab0Sopenharmony_ciFILE *fopen(const char *__restrict, const char *__restrict);
707777dab0Sopenharmony_ciFILE *freopen(const char *__restrict, const char *__restrict, FILE *__restrict);
717777dab0Sopenharmony_ciint fclose(FILE *);
727777dab0Sopenharmony_ci
737777dab0Sopenharmony_ciint remove(const char *);
747777dab0Sopenharmony_ciint rename(const char *, const char *);
757777dab0Sopenharmony_ci
767777dab0Sopenharmony_ciint feof(FILE *);
777777dab0Sopenharmony_ciint ferror(FILE *);
787777dab0Sopenharmony_ciint fflush(FILE *);
797777dab0Sopenharmony_civoid clearerr(FILE *);
807777dab0Sopenharmony_ci
817777dab0Sopenharmony_ciint fseek(FILE *, long, int);
827777dab0Sopenharmony_cilong ftell(FILE *);
837777dab0Sopenharmony_civoid rewind(FILE *);
847777dab0Sopenharmony_ci
857777dab0Sopenharmony_ciint fgetpos(FILE *__restrict, fpos_t *__restrict);
867777dab0Sopenharmony_ciint fsetpos(FILE *, const fpos_t *);
877777dab0Sopenharmony_ci
887777dab0Sopenharmony_cisize_t fread(void *__restrict, size_t, size_t, FILE *__restrict);
897777dab0Sopenharmony_cisize_t fwrite(const void *__restrict, size_t, size_t, FILE *__restrict);
907777dab0Sopenharmony_ci
917777dab0Sopenharmony_ciint fgetc(FILE *);
927777dab0Sopenharmony_ciint getc(FILE *);
937777dab0Sopenharmony_ciint getchar(void);
947777dab0Sopenharmony_ciint ungetc(int, FILE *);
957777dab0Sopenharmony_ci
967777dab0Sopenharmony_ciint fputc(int, FILE *);
977777dab0Sopenharmony_ciint putc(int, FILE *);
987777dab0Sopenharmony_ciint putchar(int);
997777dab0Sopenharmony_ci
1007777dab0Sopenharmony_cichar *fgets(char *__restrict, int, FILE *__restrict);
1017777dab0Sopenharmony_ci#if __STDC_VERSION__ < 201112L
1027777dab0Sopenharmony_cichar *gets(char *);
1037777dab0Sopenharmony_ci#endif
1047777dab0Sopenharmony_ci
1057777dab0Sopenharmony_ciint fputs(const char *__restrict, FILE *__restrict);
1067777dab0Sopenharmony_ciint puts(const char *);
1077777dab0Sopenharmony_ci
1087777dab0Sopenharmony_ciint printf(const char *__restrict, ...);
1097777dab0Sopenharmony_ciint fprintf(FILE *__restrict, const char *__restrict, ...);
1107777dab0Sopenharmony_ciint sprintf(char *__restrict, const char *__restrict, ...);
1117777dab0Sopenharmony_ciint snprintf(char *__restrict, size_t, const char *__restrict, ...);
1127777dab0Sopenharmony_ci
1137777dab0Sopenharmony_ciint vprintf(const char *__restrict, __isoc_va_list);
1147777dab0Sopenharmony_ciint vfprintf(FILE *__restrict, const char *__restrict, __isoc_va_list);
1157777dab0Sopenharmony_ciint vsprintf(char *__restrict, const char *__restrict, __isoc_va_list);
1167777dab0Sopenharmony_ciint vsnprintf(char *__restrict, size_t, const char *__restrict, __isoc_va_list);
1177777dab0Sopenharmony_ci
1187777dab0Sopenharmony_ciint scanf(const char *__restrict, ...);
1197777dab0Sopenharmony_ciint fscanf(FILE *__restrict, const char *__restrict, ...);
1207777dab0Sopenharmony_ciint sscanf(const char *__restrict, const char *__restrict, ...);
1217777dab0Sopenharmony_ciint vscanf(const char *__restrict, __isoc_va_list);
1227777dab0Sopenharmony_ciint vfscanf(FILE *__restrict, const char *__restrict, __isoc_va_list);
1237777dab0Sopenharmony_ciint vsscanf(const char *__restrict, const char *__restrict, __isoc_va_list);
1247777dab0Sopenharmony_ci
1257777dab0Sopenharmony_civoid perror(const char *);
1267777dab0Sopenharmony_ci
1277777dab0Sopenharmony_ciint setvbuf(FILE *__restrict, char *__restrict, int, size_t);
1287777dab0Sopenharmony_civoid setbuf(FILE *__restrict, char *__restrict);
1297777dab0Sopenharmony_ci
1307777dab0Sopenharmony_cichar *tmpnam(char *);
1317777dab0Sopenharmony_ciFILE *tmpfile(void);
1327777dab0Sopenharmony_ci
1337777dab0Sopenharmony_ci#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
1347777dab0Sopenharmony_ci || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
1357777dab0Sopenharmony_ci || defined(_BSD_SOURCE)
1367777dab0Sopenharmony_ciFILE *fmemopen(void *__restrict, size_t, const char *__restrict);
1377777dab0Sopenharmony_ciFILE *open_memstream(char **, size_t *);
1387777dab0Sopenharmony_ciFILE *fdopen(int, const char *);
1397777dab0Sopenharmony_ciFILE *popen(const char *, const char *);
1407777dab0Sopenharmony_ciint pclose(FILE *);
1417777dab0Sopenharmony_ciint fileno(FILE *);
1427777dab0Sopenharmony_ciint fseeko(FILE *, off_t, int);
1437777dab0Sopenharmony_cioff_t ftello(FILE *);
1447777dab0Sopenharmony_ciint dprintf(int, const char *__restrict, ...);
1457777dab0Sopenharmony_ciint vdprintf(int, const char *__restrict, __isoc_va_list);
1467777dab0Sopenharmony_civoid flockfile(FILE *);
1477777dab0Sopenharmony_ciint ftrylockfile(FILE *);
1487777dab0Sopenharmony_civoid funlockfile(FILE *);
1497777dab0Sopenharmony_ciint getc_unlocked(FILE *);
1507777dab0Sopenharmony_ciint getchar_unlocked(void);
1517777dab0Sopenharmony_ciint putc_unlocked(int, FILE *);
1527777dab0Sopenharmony_ciint putchar_unlocked(int);
1537777dab0Sopenharmony_cissize_t getdelim(char **__restrict, size_t *__restrict, int, FILE *__restrict);
1547777dab0Sopenharmony_cissize_t getline(char **__restrict, size_t *__restrict, FILE *__restrict);
1557777dab0Sopenharmony_ciint renameat(int, const char *, int, const char *);
1567777dab0Sopenharmony_ci#define RENAME_NOREPLACE (1 << 0)
1577777dab0Sopenharmony_ci#define RENAME_EXCHANGE  (1 << 1)
1587777dab0Sopenharmony_ci#define RENAME_WHITEOUT  (1 << 2)
1597777dab0Sopenharmony_ciint renameat2(int, const char *, int, const char *, unsigned int);
1607777dab0Sopenharmony_cichar *ctermid(char *);
1617777dab0Sopenharmony_ci#define L_ctermid 20
1627777dab0Sopenharmony_ci#endif
1637777dab0Sopenharmony_ci
1647777dab0Sopenharmony_ci
1657777dab0Sopenharmony_ci#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
1667777dab0Sopenharmony_ci || defined(_BSD_SOURCE)
1677777dab0Sopenharmony_ci#define P_tmpdir "/tmp"
1687777dab0Sopenharmony_cichar *tempnam(const char *, const char *);
1697777dab0Sopenharmony_ci#endif
1707777dab0Sopenharmony_ci
1717777dab0Sopenharmony_ci#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
1727777dab0Sopenharmony_ci#define L_cuserid 20
1737777dab0Sopenharmony_civoid setlinebuf(FILE *);
1747777dab0Sopenharmony_civoid setbuffer(FILE *, char *, size_t);
1757777dab0Sopenharmony_ciint fgetc_unlocked(FILE *);
1767777dab0Sopenharmony_ciint fputc_unlocked(int, FILE *);
1777777dab0Sopenharmony_ciint fflush_unlocked(FILE *);
1787777dab0Sopenharmony_cisize_t fread_unlocked(void *, size_t, size_t, FILE *);
1797777dab0Sopenharmony_cisize_t fwrite_unlocked(const void *, size_t, size_t, FILE *);
1807777dab0Sopenharmony_civoid clearerr_unlocked(FILE *);
1817777dab0Sopenharmony_ciint feof_unlocked(FILE *);
1827777dab0Sopenharmony_ciint ferror_unlocked(FILE *);
1837777dab0Sopenharmony_ciint fileno_unlocked(FILE *);
1847777dab0Sopenharmony_ciint putw(int, FILE *);
1857777dab0Sopenharmony_cichar *fgetln(FILE *, size_t *);
1867777dab0Sopenharmony_ciint asprintf(char **, const char *, ...);
1877777dab0Sopenharmony_ciint vasprintf(char **, const char *, __isoc_va_list);
1887777dab0Sopenharmony_ci#endif
1897777dab0Sopenharmony_ci
1907777dab0Sopenharmony_ci#ifdef _GNU_SOURCE
1917777dab0Sopenharmony_cichar *fgets_unlocked(char *, int, FILE *);
1927777dab0Sopenharmony_ciint fputs_unlocked(const char *, FILE *);
1937777dab0Sopenharmony_ci
1947777dab0Sopenharmony_citypedef ssize_t (cookie_read_function_t)(void *, char *, size_t);
1957777dab0Sopenharmony_citypedef ssize_t (cookie_write_function_t)(void *, const char *, size_t);
1967777dab0Sopenharmony_citypedef int (cookie_seek_function_t)(void *, off_t *, int);
1977777dab0Sopenharmony_citypedef int (cookie_close_function_t)(void *);
1987777dab0Sopenharmony_ci
1997777dab0Sopenharmony_citypedef struct _IO_cookie_io_functions_t {
2007777dab0Sopenharmony_ci	cookie_read_function_t *read;
2017777dab0Sopenharmony_ci	cookie_write_function_t *write;
2027777dab0Sopenharmony_ci	cookie_seek_function_t *seek;
2037777dab0Sopenharmony_ci	cookie_close_function_t *close;
2047777dab0Sopenharmony_ci} cookie_io_functions_t;
2057777dab0Sopenharmony_ciFILE *fopencookie(void *, const char *, cookie_io_functions_t);
2067777dab0Sopenharmony_ci#endif
2077777dab0Sopenharmony_ci
2087777dab0Sopenharmony_ci#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
2097777dab0Sopenharmony_ci#define tmpfile64 tmpfile
2107777dab0Sopenharmony_ci#define fopen64 fopen
2117777dab0Sopenharmony_ci#define freopen64 freopen
2127777dab0Sopenharmony_ci#define fseeko64 fseeko
2137777dab0Sopenharmony_ci#define ftello64 ftello
2147777dab0Sopenharmony_ci#define fgetpos64 fgetpos
2157777dab0Sopenharmony_ci#define fsetpos64 fsetpos
2167777dab0Sopenharmony_ci#define fpos64_t fpos_t
2177777dab0Sopenharmony_ci#define off64_t off_t
2187777dab0Sopenharmony_ci#endif
2197777dab0Sopenharmony_ci
2207777dab0Sopenharmony_ci/**
2217777dab0Sopenharmony_ci * @brief Enumerates fd owner type.
2227777dab0Sopenharmony_ci *
2237777dab0Sopenharmony_ci * @since 12
2247777dab0Sopenharmony_ci */
2257777dab0Sopenharmony_cienum fdsan_owner_type {
2267777dab0Sopenharmony_ci    /* Default type value */
2277777dab0Sopenharmony_ci    FDSAN_OWNER_TYPE_DEFAULT = 0,
2287777dab0Sopenharmony_ci    /* Max value */
2297777dab0Sopenharmony_ci    FDSAN_OWNER_TYPE_MAX = 255,
2307777dab0Sopenharmony_ci    /* File */
2317777dab0Sopenharmony_ci    FDSAN_OWNER_TYPE_FILE = 1,
2327777dab0Sopenharmony_ci    /* Directory */
2337777dab0Sopenharmony_ci    FDSAN_OWNER_TYPE_DIRECTORY = 2,
2347777dab0Sopenharmony_ci    /* Unique fd */
2357777dab0Sopenharmony_ci    FDSAN_OWNER_TYPE_UNIQUE_FD = 3,
2367777dab0Sopenharmony_ci    /* Zip archive */
2377777dab0Sopenharmony_ci    FDSAN_OWNER_TYPE_ZIP_ARCHIVE = 4,
2387777dab0Sopenharmony_ci};
2397777dab0Sopenharmony_ci
2407777dab0Sopenharmony_ci/**
2417777dab0Sopenharmony_ci * @brief Create an owner tag using specified fdsan_owner_type and at least 56 bits tag value.
2427777dab0Sopenharmony_ci *
2437777dab0Sopenharmony_ci * @param type: Indicate the specified fdsan_owner_type.
2447777dab0Sopenharmony_ci * @param tag: Indicate the specified tag value, at least 56 bits, usually specified as sturct address such as FILE*.
2457777dab0Sopenharmony_ci * @return Return the created tag, which can be used to exchange.
2467777dab0Sopenharmony_ci * @since 12
2477777dab0Sopenharmony_ci */
2487777dab0Sopenharmony_ciuint64_t fdsan_create_owner_tag(enum fdsan_owner_type type, uint64_t tag);
2497777dab0Sopenharmony_ci
2507777dab0Sopenharmony_ci/**
2517777dab0Sopenharmony_ci * @brief Exchange owner tag for specified fd.
2527777dab0Sopenharmony_ci *
2537777dab0Sopenharmony_ci * This method will check if param expected_tag is euqal to current owner tag, fdsan error will occur if not.
2547777dab0Sopenharmony_ci *
2557777dab0Sopenharmony_ci * @param fd: Specified fd.
2567777dab0Sopenharmony_ci * @param expected_tag: Used to check if equal to current owner tag.
2577777dab0Sopenharmony_ci * @param new_tag: Used to exchange the specified fd owner tag.
2587777dab0Sopenharmony_ci * @since 12
2597777dab0Sopenharmony_ci */
2607777dab0Sopenharmony_civoid fdsan_exchange_owner_tag(int fd, uint64_t expected_tag, uint64_t new_tag);
2617777dab0Sopenharmony_ci
2627777dab0Sopenharmony_ci/**
2637777dab0Sopenharmony_ci * @brief Check fd owner tag and close fd.
2647777dab0Sopenharmony_ci *
2657777dab0Sopenharmony_ci * This method will check if param tag is euqal to current owner tag, fdsan error will occur if not,
2667777dab0Sopenharmony_ci * then call syscall to close fd.
2677777dab0Sopenharmony_ci *
2687777dab0Sopenharmony_ci * @param fd: Specified fd.
2697777dab0Sopenharmony_ci * @param tag: Used to check if equal to current owner tag.
2707777dab0Sopenharmony_ci * @return Return close result, 0 success and -1 if fail.
2717777dab0Sopenharmony_ci * @since 12
2727777dab0Sopenharmony_ci */
2737777dab0Sopenharmony_ciint fdsan_close_with_tag(int fd, uint64_t tag);
2747777dab0Sopenharmony_ci
2757777dab0Sopenharmony_ci/**
2767777dab0Sopenharmony_ci * @brief Get specified fd's owner tag.
2777777dab0Sopenharmony_ci *
2787777dab0Sopenharmony_ci * @param fd: Specified fd.
2797777dab0Sopenharmony_ci * @return Return tag value of specified fd, return 0 if fd is not in fd table.
2807777dab0Sopenharmony_ci * @since 12
2817777dab0Sopenharmony_ci */
2827777dab0Sopenharmony_ciuint64_t fdsan_get_owner_tag(int fd);
2837777dab0Sopenharmony_ci
2847777dab0Sopenharmony_ci/**
2857777dab0Sopenharmony_ci * @brief Get owner fd type
2867777dab0Sopenharmony_ci *
2877777dab0Sopenharmony_ci * @param tag: Specified tag, which usually comes from {@link fdsan_get_owner_tag}
2887777dab0Sopenharmony_ci * @return Return type value of tag, possible value: FILE*, DIR*, unique_fd, ZipArchive, unknown type and so on.
2897777dab0Sopenharmony_ci * @since 12
2907777dab0Sopenharmony_ci */
2917777dab0Sopenharmony_ciconst char* fdsan_get_tag_type(uint64_t tag);
2927777dab0Sopenharmony_ci
2937777dab0Sopenharmony_ci/**
2947777dab0Sopenharmony_ci * @brief Get owner fd tag value.
2957777dab0Sopenharmony_ci *
2967777dab0Sopenharmony_ci * @param tag: Specified tag, which usually comes from {@link fdsan_get_owner_tag}
2977777dab0Sopenharmony_ci * @return Return value of tag, last 56 bits are valid.
2987777dab0Sopenharmony_ci * @since 12
2997777dab0Sopenharmony_ci */
3007777dab0Sopenharmony_ciuint64_t fdsan_get_tag_value(uint64_t tag);
3017777dab0Sopenharmony_ci
3027777dab0Sopenharmony_ci/**
3037777dab0Sopenharmony_ci * @brief Enumerates fdsan error level.
3047777dab0Sopenharmony_ci *
3057777dab0Sopenharmony_ci * @since 12
3067777dab0Sopenharmony_ci */
3077777dab0Sopenharmony_cienum fdsan_error_level {
3087777dab0Sopenharmony_ci    /* Do nothing if fdsan error occurs. */
3097777dab0Sopenharmony_ci    FDSAN_ERROR_LEVEL_DISABLED,
3107777dab0Sopenharmony_ci    /* Warning once if fdsan error occurs, and then downgrade to FDSAN_ERROR_LEVEL_DISABLED. */
3117777dab0Sopenharmony_ci    FDSAN_ERROR_LEVEL_WARN_ONCE,
3127777dab0Sopenharmony_ci    /* Keep warning only if fdsan error occurs. */
3137777dab0Sopenharmony_ci    FDSAN_ERROR_LEVEL_WARN_ALWAYS,
3147777dab0Sopenharmony_ci    /* Abort on fdsan error. */
3157777dab0Sopenharmony_ci    FDSAN_ERROR_LEVEL_FATAL,
3167777dab0Sopenharmony_ci};
3177777dab0Sopenharmony_ci
3187777dab0Sopenharmony_ci/**
3197777dab0Sopenharmony_ci * @brief Get fdsan error level.
3207777dab0Sopenharmony_ci *
3217777dab0Sopenharmony_ci * @return Return fdsan error level enumerate value.
3227777dab0Sopenharmony_ci * @since 12
3237777dab0Sopenharmony_ci */
3247777dab0Sopenharmony_cienum fdsan_error_level fdsan_get_error_level();
3257777dab0Sopenharmony_ci
3267777dab0Sopenharmony_ci/**
3277777dab0Sopenharmony_ci * @brief Set fdsan error level.
3287777dab0Sopenharmony_ci *
3297777dab0Sopenharmony_ci * @param new_level: Used to set fdsan error level.
3307777dab0Sopenharmony_ci * @return Return old fdsan error level enumerate value.
3317777dab0Sopenharmony_ci * @since 12
3327777dab0Sopenharmony_ci */
3337777dab0Sopenharmony_cienum fdsan_error_level fdsan_set_error_level(enum fdsan_error_level new_level);
3347777dab0Sopenharmony_ci
3357777dab0Sopenharmony_ci#include <fortify/stdio.h>
3367777dab0Sopenharmony_ci
3377777dab0Sopenharmony_ci#ifdef __cplusplus
3387777dab0Sopenharmony_ci}
3397777dab0Sopenharmony_ci#endif
3407777dab0Sopenharmony_ci
3417777dab0Sopenharmony_ci#endif
342