/* * freopen — переоткрыть поток на другой файл, переиспользуя тот же * FILE* (и его буфер, если уже выделен). * * Для файлового потока: сброс буфера, close старого fd, open нового. * Для консольного псевдопотока (stdout/stderr/stdin): превращает его * в файловый — работает ТОЛЬКО для операций через FILE* (fputs(..., * stdout) и т.п.); printf/puts/putchar идут через ESTEX напрямую и * НЕ перенаправляются. NULL при ошибке (поток при этом закрыт — * по стандарту). */ #include #include #include "_file.h" FILE *freopen(const char *path, const char *mode, FILE *fp) { if (!fp) return 0; uint8_t ff; int oflags = _file_mode_flags(mode, &ff); /* Закрыть текущее содержимое потока (буфер сохраняем). */ if (!(fp->flags & (_F_CONIN | _F_CONOUT))) { _file_sync(fp); close(fp->fd); } fp->flags = 0; /* пока свободен/закрыт */ fp->level = 0; fp->curp = fp->buf; fp->hold = EOF; if (oflags < 0) return 0; /* плохой режим — поток закрыт */ int fd = open(path, oflags); if (fd < 0) return 0; fp->fd = fd; fp->flags = ff; return fp; }