Skip to main content

Module terminal

Module terminal 

Source
Expand description

Wrappers de la famille terminal (termios/tty).

Cf. docs/specs/layer-0/family-terminal.md et ADR-060.

Tranche 2 — groupe « Attributs ». Les deux ioctls typés du cœur termios, consommant le type [Termios] d’air-sys-types :

  • tcgetattr (TCGETS) : lit les attributs courants du terminal ;
  • tcsetattr (TCSETS/TCSETSW/TCSETSF) : les applique selon une [SetAction] typée (mapping par match exhaustif — jamais l’arithmétique TCSETS + action, fragile, pointée par l’audit musl §8).

Tranche 3 — groupes « Contrôle de ligne » et « Taille fenêtre ». Les tc* POSIX restants et les ioctls de dimension de fenêtre :

  • tcdrain (TCSBRK, argument 1) : attend la transmission de la sortie ;
  • tcflush (TCFLSH) : purge une [FlushQueue] (entrée/sortie/les deux) ;
  • tcflow (TCXONC) : suspend/reprend le flux selon une [FlowAction] ;
  • tcsendbreak (TCSBRK, argument 0) : envoie un break (durée non paramétrée — honnêteté de contrat, cf. audit musl §6/§8) ;
  • get_winsize/set_winsize (TIOCGWINSZ/TIOCSWINSZ) : lit/écrit la [Winsize] du terminal.

Tranche 4 — groupe « PTY ». Allocation d’une paire maître/esclave de pseudo-terminal :

  • open_pty_master : ouvre un nouveau maître via /dev/ptmx (dogfoode crate::fs::openat) ;
  • pty_number (TIOCGPTN) : numéro [PtyNumber] de l’esclave (/dev/pts/N) ;
  • pty_unlock (TIOCSPTLCK) : déverrouille l’esclave (prérequis d’ouverture) ;
  • pty_peer (TIOCGPTPEER) : ouvre directement l’esclave (anti-TOCTOU, Linux 4.13+) — évite la résolution du chemin /dev/pts/N.

Tranche 5 — groupe « Session / job-control ». Terminal de contrôle et groupes de premier plan :

  • tcgetpgrp (TIOCGPGRP) : groupe de premier plan du terminal (Option<Pid> — un pid_t 0 du kernel = aucun groupe, ADR-021 conv. 1) ;
  • tcsetpgrp (TIOCSPGRP) : installe un groupe de premier plan typé ;
  • session_id (TIOCGSID) : identifiant de session du terminal ;
  • set_ctty (TIOCSCTTY, argument 0) : fait du terminal le terminal de contrôle du leader de session appelant — sans vol (le vol arg=1 exige CAP_SYS_ADMIN, hors périmètre — UNSUPPORTED) ;
  • clear_ctty (TIOCNOTTY) : détache le terminal de contrôle.

Ces cinq-là exigent, pour leur chemin nominal, un terminal de contrôle (que le kernel refuse hors leader de session) : ils sont donc validés dans un enfant forké setsid (tests), et les lignes de leur bras Ok — exécutées uniquement dans cet enfant — sont des exceptions CHILD-EXIT (ADR-035 ; profil LLVM non flushé côté enfant, async-signal-safe — cf. process.rs).

Chaque opération est une fonction dédiée typée (ADR-021 conv. 3 : jamais d’ioctl(fd, REQ, …) générique). Zéro allocation (le [Termios]/[Winsize] vit sur la pile). EINTR est remonté tel quel à l’appelant (ADR-021 conv. 2), aucun retry automatique — tcdrain est un point d’annulation (audit §3). Le maître /dev/ptmx sert de tty réel dans les tests.

Functions§

clear_ctty
clear_ctty (TIOCNOTTY) — détache le terminal de contrôle du processus appelant.
get_winsize
get_winsize (TIOCGWINSZ) — lit les dimensions courantes de la fenêtre du terminal fd.
open_pty_master
open_pty_master — ouvre un nouveau maître de pseudo-terminal via /dev/ptmx.
pty_number
pty_number (TIOCGPTN) — numéro de l’esclave associé au maître master.
pty_peer
pty_peer (TIOCGPTPEER) — ouvre directement l’esclave de master et renvoie son descripteur.
pty_unlock
pty_unlock (TIOCSPTLCK, valeur 0) — déverrouille l’esclave de master.
session_id
session_id (TIOCGSID) — identifiant de session du terminal fd.
set_ctty
set_ctty (TIOCSCTTY, argument 0) — fait de fd le terminal de contrôle du leader de session appelant.
set_winsize
set_winsize (TIOCSWINSZ) — impose les dimensions size à la fenêtre du terminal fd (le kernel émet SIGWINCH vers le groupe de premier plan).
tcdrain
tcdrain (TCSBRK, argument 1) — bloque jusqu’à ce que tous les octets déjà écrits vers fd aient été transmis.
tcflow
tcflow (TCXONC) — suspend ou reprend le flux d’entrée ou de sortie de fd.
tcflush
tcflush (TCFLSH) — purge (jette) les octets non traités de la (des) file(s) désignée(s) par queue.
tcgetattr
tcgetattr (TCGETS) — lit les attributs courants du terminal fd.
tcgetpgrp
tcgetpgrp (TIOCGPGRP) — groupe de premier plan du terminal fd.
tcsendbreak
tcsendbreak (TCSBRK, argument 0) — transmet une séquence de bits 0 (condition BREAK) sur une ligne asynchrone.
tcsetattr
tcsetattr (TCSETS/TCSETSW/TCSETSF) — applique attributes au terminal fd, à l’instant indiqué par action.
tcsetpgrp
tcsetpgrp (TIOCSPGRP) — installe process_group comme groupe de premier plan du terminal fd.