Files
Sprinter-SDCC/libc/io/close.c
T
snark13 057dd615ba 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>
2026-07-06 16:09:29 +03:00

31 lines
815 B
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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;
}