/*
 * fclose — закрыть поток: сбросить буфер (_file_sync), закрыть fd,
 * освободить буфер и слот таблицы.  ВАЖНО: ошибки отложенной записи
 * вылезают именно здесь — проверять результат fclose у пишущих
 * потоков.  Консольные псевдопотоки (stdin/stdout/stderr) распознаются
 * по флагам и успешно игнорируются.
 */

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

int fclose(FILE *fp)
{
#ifndef LIBC_NOCHECK
    if (!fp) {
        errno = EBADF;
        return EOF;
    }
#endif
    if (fp->flags & (_F_CONIN | _F_CONOUT)) {
        return 0;
    }
    int rc = _file_sync(fp);          /* сброс несброшенной записи */
    if (close(fp->fd) < 0) rc = EOF;
    if (fp->buf) free(fp->buf);
    fp->flags = 0;                    /* слот свободен */
    return rc;
}
