1570af302Sopenharmony_ci#ifndef _STDIO_IMPL_H 2570af302Sopenharmony_ci#define _STDIO_IMPL_H 3570af302Sopenharmony_ci 4570af302Sopenharmony_ci#include <stdio.h> 5570af302Sopenharmony_ci#include <stdlib.h> 6570af302Sopenharmony_ci#include <stdint.h> 7570af302Sopenharmony_ci#include "syscall.h" 8570af302Sopenharmony_ci 9570af302Sopenharmony_ci#define UNGET 8 10570af302Sopenharmony_ci 11570af302Sopenharmony_ci#define FFINALLOCK(f) ((f)->lock>=0 ? __lockfile((f)) : 0) 12570af302Sopenharmony_ci#define FLOCK(f) int __need_unlock = ((f)->lock>=0 ? __lockfile((f)) : 0) 13570af302Sopenharmony_ci#define FUNLOCK(f) do { if (__need_unlock) __unlockfile((f)); } while (0) 14570af302Sopenharmony_ci 15570af302Sopenharmony_ci#define F_PERM 1 16570af302Sopenharmony_ci#define F_NORD 4 17570af302Sopenharmony_ci#define F_NOWR 8 18570af302Sopenharmony_ci#define F_EOF 16 19570af302Sopenharmony_ci#define F_ERR 32 20570af302Sopenharmony_ci#define F_SVB 64 21570af302Sopenharmony_ci#define F_APP 128 22570af302Sopenharmony_ci#define F_NOBUF 256 23570af302Sopenharmony_ci#define F_PBUF 512 24570af302Sopenharmony_ci 25570af302Sopenharmony_ci 26570af302Sopenharmony_ci#define FILE_LIST_NEXT(fl) (fl->next) 27570af302Sopenharmony_ci#define FILE_LIST_HEAD(head) (head) 28570af302Sopenharmony_ci#define FILE_LIST_EMPTY(head) ((head) == NULL) 29570af302Sopenharmony_ci#define FILE_SAVELINK(name, link) void **name = (void *)&(link) 30570af302Sopenharmony_ci#define INVALID_LINK(x) do {(x) = (void *)-1;} while (0) 31570af302Sopenharmony_ci 32570af302Sopenharmony_ci#define FILE_LIST_CHECK_NEXT(fl) do { \ 33570af302Sopenharmony_ci if (FILE_LIST_NEXT(fl) != NULL && FILE_LIST_NEXT(fl)->prev != &fl->next) { \ 34570af302Sopenharmony_ci abort(); \ 35570af302Sopenharmony_ci } \ 36570af302Sopenharmony_ci} while (0) 37570af302Sopenharmony_ci 38570af302Sopenharmony_ci#define FILE_LIST_CHECK_PREV(fl) do { \ 39570af302Sopenharmony_ci if (*fl->prev != fl) { \ 40570af302Sopenharmony_ci abort(); \ 41570af302Sopenharmony_ci } \ 42570af302Sopenharmony_ci} while (0) 43570af302Sopenharmony_ci 44570af302Sopenharmony_ci#define FILE_LIST_CHECK_HEAD(head) do { \ 45570af302Sopenharmony_ci if (FILE_LIST_HEAD(head) != NULL && \ 46570af302Sopenharmony_ci FILE_LIST_HEAD(head)->prev != &FILE_LIST_HEAD(head)) { \ 47570af302Sopenharmony_ci abort(); \ 48570af302Sopenharmony_ci } \ 49570af302Sopenharmony_ci} while (0) 50570af302Sopenharmony_ci 51570af302Sopenharmony_ci 52570af302Sopenharmony_ci#define FILE_LIST_INSERT_HEAD(head, fl) do { \ 53570af302Sopenharmony_ci FILE_LIST_CHECK_HEAD((head)); \ 54570af302Sopenharmony_ci if ((FILE_LIST_NEXT((fl)) = FILE_LIST_HEAD((head))) != NULL) { \ 55570af302Sopenharmony_ci FILE_LIST_HEAD((head))->prev = &FILE_LIST_NEXT((fl)); \ 56570af302Sopenharmony_ci } \ 57570af302Sopenharmony_ci FILE_LIST_HEAD(head) = (fl); \ 58570af302Sopenharmony_ci (fl)->prev = &FILE_LIST_HEAD((head)); \ 59570af302Sopenharmony_ci} while (0) 60570af302Sopenharmony_ci 61570af302Sopenharmony_ci#define FILE_LIST_REMOVE(fl) do { \ 62570af302Sopenharmony_ci FILE_SAVELINK(oldnext, (fl)->next); \ 63570af302Sopenharmony_ci FILE_SAVELINK(oldprev, (fl)->prev); \ 64570af302Sopenharmony_ci FILE_LIST_CHECK_NEXT(fl); \ 65570af302Sopenharmony_ci FILE_LIST_CHECK_PREV(fl); \ 66570af302Sopenharmony_ci if (FILE_LIST_NEXT(fl) != NULL) { \ 67570af302Sopenharmony_ci FILE_LIST_NEXT(fl)->prev = fl->prev; \ 68570af302Sopenharmony_ci } \ 69570af302Sopenharmony_ci *fl->prev = FILE_LIST_NEXT(fl); \ 70570af302Sopenharmony_ci INVALID_LINK(*oldnext); \ 71570af302Sopenharmony_ci INVALID_LINK(*oldprev); \ 72570af302Sopenharmony_ci} while (0) 73570af302Sopenharmony_ci 74570af302Sopenharmony_cistruct _IO_FILE { 75570af302Sopenharmony_ci unsigned flags; 76570af302Sopenharmony_ci unsigned char *rpos, *rend; 77570af302Sopenharmony_ci int (*close)(FILE *); 78570af302Sopenharmony_ci unsigned char *wend, *wpos; 79570af302Sopenharmony_ci unsigned char *mustbezero_1; 80570af302Sopenharmony_ci unsigned char *wbase; 81570af302Sopenharmony_ci size_t (*read)(FILE *, unsigned char *, size_t); 82570af302Sopenharmony_ci size_t (*readx)(FILE *, unsigned char *, size_t); 83570af302Sopenharmony_ci size_t (*write)(FILE *, const unsigned char *, size_t); 84570af302Sopenharmony_ci off_t (*seek)(FILE *, off_t, int); 85570af302Sopenharmony_ci unsigned char *buf; 86570af302Sopenharmony_ci size_t buf_size; 87570af302Sopenharmony_ci /* when allocating buffer dynamically, base == buf - UNGET, 88570af302Sopenharmony_ci * free base when calling fclose. 89570af302Sopenharmony_ci * otherwise, base == NULL, cases: 90570af302Sopenharmony_ci * 1. in stdout, stdin, stdout, base is static array. 91570af302Sopenharmony_ci * 2. call setvbuf to set buffer or non-buffer. 92570af302Sopenharmony_ci * 3. call fmemopen, base == NULL && buf_size != 0. 93570af302Sopenharmony_ci */ 94570af302Sopenharmony_ci unsigned char *base; 95570af302Sopenharmony_ci#ifndef __LITEOS__ 96570af302Sopenharmony_ci FILE **prev, *next; 97570af302Sopenharmony_ci#else 98570af302Sopenharmony_ci FILE *prev, *next; 99570af302Sopenharmony_ci#endif 100570af302Sopenharmony_ci int fd; 101570af302Sopenharmony_ci int pipe_pid; 102570af302Sopenharmony_ci long lockcount; 103570af302Sopenharmony_ci int mode; 104570af302Sopenharmony_ci volatile int lock; 105570af302Sopenharmony_ci int lbf; 106570af302Sopenharmony_ci void *cookie; 107570af302Sopenharmony_ci off_t off; 108570af302Sopenharmony_ci char *getln_buf; 109570af302Sopenharmony_ci void *mustbezero_2; 110570af302Sopenharmony_ci unsigned char *shend; 111570af302Sopenharmony_ci off_t shlim, shcnt; 112570af302Sopenharmony_ci FILE *prev_locked, *next_locked; 113570af302Sopenharmony_ci struct __locale_struct *locale; 114570af302Sopenharmony_ci}; 115570af302Sopenharmony_ci 116570af302Sopenharmony_ciextern hidden FILE *volatile __stdin_used; 117570af302Sopenharmony_ciextern hidden FILE *volatile __stdout_used; 118570af302Sopenharmony_ciextern hidden FILE *volatile __stderr_used; 119570af302Sopenharmony_ci 120570af302Sopenharmony_cihidden int __lockfile(FILE *); 121570af302Sopenharmony_cihidden void __unlockfile(FILE *); 122570af302Sopenharmony_ci 123570af302Sopenharmony_cihidden size_t __stdio_read(FILE *, unsigned char *, size_t); 124570af302Sopenharmony_cihidden size_t __stdio_readx(FILE *, unsigned char *, size_t); 125570af302Sopenharmony_cihidden size_t __stdio_write(FILE *, const unsigned char *, size_t); 126570af302Sopenharmony_cihidden size_t __stdout_write(FILE *, const unsigned char *, size_t); 127570af302Sopenharmony_cihidden off_t __stdio_seek(FILE *, off_t, int); 128570af302Sopenharmony_cihidden int __stdio_close(FILE *); 129570af302Sopenharmony_ci 130570af302Sopenharmony_cihidden int __fill_buffer(FILE *f); 131570af302Sopenharmony_cihidden ssize_t __flush_buffer(FILE *f); 132570af302Sopenharmony_ci 133570af302Sopenharmony_cihidden int __toread(FILE *); 134570af302Sopenharmony_cihidden int __towrite(FILE *); 135570af302Sopenharmony_cihidden int __falloc_buf(FILE *); 136570af302Sopenharmony_ci 137570af302Sopenharmony_cihidden void __stdio_exit(void); 138570af302Sopenharmony_cihidden void __stdio_exit_needed(void); 139570af302Sopenharmony_ci 140570af302Sopenharmony_ci#if defined(__PIC__) && (100*__GNUC__+__GNUC_MINOR__ >= 303) 141570af302Sopenharmony_ci__attribute__((visibility("protected"))) 142570af302Sopenharmony_ci#endif 143570af302Sopenharmony_ciint __overflow(FILE *, int), __uflow(FILE *); 144570af302Sopenharmony_ci 145570af302Sopenharmony_cihidden int __fseeko(FILE *, off_t, int); 146570af302Sopenharmony_cihidden int __fseeko_unlocked(FILE *, off_t, int); 147570af302Sopenharmony_cihidden off_t __ftello(FILE *); 148570af302Sopenharmony_cihidden off_t __ftello_unlocked(FILE *); 149570af302Sopenharmony_cihidden size_t __fwritex(const unsigned char *, size_t, FILE *); 150570af302Sopenharmony_cihidden int __putc_unlocked(int, FILE *); 151570af302Sopenharmony_ci 152570af302Sopenharmony_cihidden FILE *__fdopen(int, const char *); 153570af302Sopenharmony_cihidden FILE *__fdopenx(int, int); 154570af302Sopenharmony_cihidden int __fmodeflags(const char *, int *); 155570af302Sopenharmony_ci 156570af302Sopenharmony_cihidden FILE *__ofl_add(FILE *f); 157570af302Sopenharmony_cihidden FILE **__ofl_lock(void); 158570af302Sopenharmony_cihidden void __ofl_unlock(void); 159570af302Sopenharmony_cihidden void __ofl_free(FILE *f); 160570af302Sopenharmony_cihidden FILE *__ofl_alloc(); 161570af302Sopenharmony_ci 162570af302Sopenharmony_cistruct __pthread; 163570af302Sopenharmony_cihidden void __register_locked_file(FILE *, struct __pthread *); 164570af302Sopenharmony_cihidden void __unlist_locked_file(FILE *); 165570af302Sopenharmony_cihidden void __do_orphaned_stdio_locks(void); 166570af302Sopenharmony_ci 167570af302Sopenharmony_ci#define MAYBE_WAITERS 0x40000000 168570af302Sopenharmony_ci 169570af302Sopenharmony_cihidden void __getopt_msg(const char *, const char *, const char *, size_t); 170570af302Sopenharmony_ci 171570af302Sopenharmony_ci#define feof(f) ((f)->flags & F_EOF) 172570af302Sopenharmony_ci#define ferror(f) ((f)->flags & F_ERR) 173570af302Sopenharmony_ci 174570af302Sopenharmony_ci#define getc_unlocked(f) \ 175570af302Sopenharmony_ci ( ((f)->rpos != (f)->rend) ? *(f)->rpos++ : __uflow((f)) ) 176570af302Sopenharmony_ci 177570af302Sopenharmony_ci#define putc_unlocked(c, f) \ 178570af302Sopenharmony_ci ( (((unsigned char)(c)!=(f)->lbf && (f)->wpos!=(f)->wend)) \ 179570af302Sopenharmony_ci ? *(f)->wpos++ = (unsigned char)(c) \ 180570af302Sopenharmony_ci : __overflow((f),(unsigned char)(c)) ) 181570af302Sopenharmony_ci 182570af302Sopenharmony_ci/* Caller-allocated FILE * operations */ 183570af302Sopenharmony_cihidden FILE *__fopen_rb_ca(const char *, FILE *, unsigned char *, size_t); 184570af302Sopenharmony_cihidden int __fclose_ca(FILE *); 185570af302Sopenharmony_ci 186570af302Sopenharmony_cistatic uint64_t __get_file_tag(FILE* fp) 187570af302Sopenharmony_ci{ 188570af302Sopenharmony_ci if (fp == stdin || fp == stderr || fp == stdout) { 189570af302Sopenharmony_ci return 0; 190570af302Sopenharmony_ci } 191570af302Sopenharmony_ci return fdsan_create_owner_tag(FDSAN_OWNER_TYPE_FILE, (uint64_t)fp); 192570af302Sopenharmony_ci} 193570af302Sopenharmony_ci#endif 194