Skip to main content

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}