air_sys_types/ipc.rs
1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
5//! Types de la famille `ipc` — eventfd, pipe, opérations zero-copy.
6//!
7//! Cf. `docs/specs/layer-0/family-ipc.md`.
8
9use bitflags::bitflags;
10
11bitflags! {
12 /// Drapeaux pour `eventfd2(2)` (cf. `linux/eventfd.h`).
13 ///
14 /// `CLOEXEC` est la valeur recommandée par défaut pour éviter la fuite
15 /// du FD lors d'un `exec`. `NONBLOCK` est utile pour l'intégration
16 /// avec un reactor io_uring.
17 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
18 pub struct EventFdFlags: i32 {
19 /// Ferme le FD à l'`exec` (O_CLOEXEC). Recommandé par défaut.
20 const CLOEXEC = 0x0008_0000; // O_CLOEXEC
21 /// Mode non-bloquant : `read`/`write` retournent `EAGAIN`
22 /// si l'opération bloquerait.
23 const NONBLOCK = 0x0000_0800; // O_NONBLOCK
24 /// Mode sémaphore : chaque `read` retourne 1 et décrémente
25 /// le compteur d'une unité, au lieu de retourner et remettre
26 /// à zéro la valeur entière.
27 const SEMAPHORE = 0x0000_0001; // EFD_SEMAPHORE
28 }
29}
30
31bitflags! {
32 /// Drapeaux pour `pipe2(2)` (cf. `linux/fcntl.h`).
33 ///
34 /// `CLOEXEC` est fortement recommandé pour tous les pipes créés par
35 /// Air afin d'éviter la fuite vers les processus fils via `exec`.
36 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
37 pub struct PipeFlags: i32 {
38 /// Ferme les deux extrémités à l'`exec`. Recommandé par défaut.
39 const CLOEXEC = 0x0008_0000; // O_CLOEXEC
40 /// Mode paquet : chaque `write` produit un paquet discret côté
41 /// lecture (utile pour les protocoles message-oriented).
42 // O_DIRECT — **valeur dépendante de l'architecture** (0x4000 sur
43 // x86_64, 0x10000 sur aarch64, ABI asm-generic).
44 const DIRECT = if cfg!(target_arch = "x86_64") { 0x0000_4000 } else { 0x0001_0000 };
45 /// Les deux extrémités sont non-bloquantes.
46 const NONBLOCK = 0x0000_0800; // O_NONBLOCK
47 }
48}
49
50bitflags! {
51 /// Drapeaux pour `splice(2)`, `tee(2)` et `vmsplice(2)`
52 /// (cf. `linux/splice.h`).
53 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
54 pub struct SpliceFlags: u32 {
55 /// Déplace les pages au lieu de les copier quand c'est possible.
56 /// Hint kernel seulement : peut ne pas avoir d'effet.
57 const MOVE = 1;
58 /// Retourne `EAGAIN` si l'opération bloquerait.
59 const NONBLOCK = 2;
60 /// Indique au kernel que davantage de données suivront.
61 /// Permet des optimisations de fragmentation des paquets TCP.
62 const MORE = 4;
63 /// **DANGEREUX.** Donne les pages userspace au pipe kernel
64 /// sans copie. Les pages ne doivent PLUS être modifiées après
65 /// l'appel. Uniquement pour `vmsplice`.
66 const GIFT = 8;
67 }
68}