057dd615ba
- ESTEX WRITE ($14) на успехе возвращает DE=0, а НЕ счётчик записанного (вопреки докам; solid-c в своём fflush тоже отключил сравнение по счётчику) — write() теперь судит по CF/A: CF=0&A=0 → n, CF=0&A!=0 → ENOSPC/-1 - DSS выдаёт 8 манипуляторов (fd 2..9; fd 1 держит шелл под запущенный exe), а 9-й OPEN не возвращает 06h — ВЕШАЕТ систему; предохранитель _fd_guard: счётчик в open()/close(), отказ EMFILE без захода в DSS - tests/fdmax — эмпирика лимита (8 хендлов, затем EMFILE=6); tests/fbench — бенчмарк буферизации (floor 512-байтными read, оценка небуферизованного по 1-байтным, fgetc/fgets/fputc) - filetest расширен: raw-probe возврата write, сценарий r+ (чтение-запись-чтение с инвалидацией буфера), ungetc, fprintf Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
31 lines
815 B
C
31 lines
815 B
C
/*
|
||
* close — закрыть файловый хендл ESTEX CLOSE ($12).
|
||
* Возвращает 0 или -1 + errno. На успехе декрементирует счётчик
|
||
* открытых манипуляторов (_fd_guard.h — защита от зависания DSS).
|
||
*/
|
||
|
||
#include <unistd.h>
|
||
#include "_fd_guard.h"
|
||
|
||
int close(int fd) __naked
|
||
{
|
||
(void)fd;
|
||
__asm
|
||
push ix
|
||
ld a, l
|
||
ld c, #0x12 ; ESTEX CLOSE
|
||
rst #0x10
|
||
pop ix
|
||
jr c, _oclose_err
|
||
;; успех — минус один открытый манипулятор
|
||
ld hl, #__fd_open_count
|
||
dec (hl)
|
||
ld de, #0
|
||
ret
|
||
_oclose_err:
|
||
call __errno_set
|
||
ld de, #-1
|
||
ret
|
||
__endasm;
|
||
}
|