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