/*
 * fseek — установить позицию файлового потока (SEEK_SET/CUR/END).
 *
 * Сначала _file_sync: сброс накопленной записи либо откат readahead
 * (после него позиция fd = логической позиции потока, поэтому
 * SEEK_CUR считается корректно), затем голый lseek.  ungetc-байт
 * отбрасывается (по стандарту).  Успех снимает _F_EOF.
 * Для консольных псевдопотоков — EBADF/-1.
 */

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

int fseek(FILE *fp, long off, int whence)
{
#ifndef LIBC_NOCHECK
    if (!fp) { errno = EBADF; return -1; }
#endif
    if (fp->flags & (_F_CONIN | _F_CONOUT)) {
        errno = EBADF;
        return -1;
    }
    if (_file_sync(fp)) return -1;
    long r = lseek(fp->fd, off, whence);
    if (r < 0) return -1;
    fp->flags &= (uint8_t)~_F_EOF;
    return 0;
}
