/*
 * freopen — переоткрыть поток на другой файл, переиспользуя тот же
 * FILE* (и его буфер, если уже выделен).
 *
 * Для файлового потока: сброс буфера, close старого fd, open нового.
 * Для консольного псевдопотока (stdout/stderr/stdin): превращает его
 * в файловый — работает ТОЛЬКО для операций через FILE* (fputs(...,
 * stdout) и т.п.); printf/puts/putchar идут через ESTEX напрямую и
 * НЕ перенаправляются.  NULL при ошибке (поток при этом закрыт —
 * по стандарту).
 */

#include <fcntl.h>
#include <unistd.h>
#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;
}
