/*
 * fdopen — завернуть уже открытый низкоуровневый fd в поток FILE*
 * (Solid-C категория C).  Режим должен соответствовать тому, с которым
 * открывался fd — библиотека проверить это не может.  После fdopen
 * файл закрывается через fclose (не close!): fclose сбросит буфер и
 * закроет сам fd.  Счётчик _fd_guard не трогаем — fd уже посчитан
 * своим open().
 */

#include <errno.h>
#include "_file.h"

FILE *fdopen(int fd, const char *mode)
{
    if (fd < 0) { errno = EBADF; return 0; }

    uint8_t ff;
    if (_file_mode_flags(mode, &ff) < 0) return 0;

    FILE *fp = _file_slot_take();
    if (!fp) return 0;

    fp->fd    = fd;
    fp->buf   = 0;
    fp->curp  = 0;
    fp->level = 0;
    fp->hold  = EOF;
    fp->flags = ff;
    return fp;
}
