libc: квирки DSS — возврат WRITE и лимит манипуляторов; тесты fdmax/fbench

- 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>
This commit is contained in:
2026-07-06 16:09:29 +03:00
parent 48d552bf3a
commit 057dd615ba
11 changed files with 361 additions and 58 deletions
+30
View File
@@ -0,0 +1,30 @@
/*
* 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;
}