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