1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//! Guard de rejet NFS.
//!
//! ## Comportement
//!
//! - **Linux** : appel `statfs(2)` sur le chemin fourni (ou son parent si inexistant).
//! Si `f_type == NFS_SUPER_MAGIC (0x6969)`, retourne `Err(StorageError::Core(VaultOnNfs))`.
//! - **Non-Linux** : log `warn` + retour `Ok(())`.
//! Justification : déploiement cible Linux uniquement. Le check NFS est
//! spécifique à Linux (statfs POSIX non standardisé + NFS_SUPER_MAGIC non portatif).
//!
//! ## Constante NFS_SUPER_MAGIC
//!
//! Valeur canonique : `0x6969` (cf. `linux/magic.h`, `statfs(2)` man page).
//! `nix` n'expose pas cette constante publiquement dans `nix::sys::statfs` (vérifié ≤0.31) —
//! on utilise le littéral directement (évite une dépendance sur l'API privée de nix).
use Path;
use crateStorageError;
/// `NFS_SUPER_MAGIC` tel que défini dans `linux/magic.h`.
///
/// Valeur : `0x6969` — retournée dans `statfs.f_type` pour les montages NFS.
/// Ref : `man 2 statfs`, noyau Linux >= 2.4.
/// Note : nix ≥0.30 n'expose toujours pas cette constante publiquement — littéral conservé.
const NFS_SUPER_MAGIC: i64 = 0x6969_i64;
/// Vérifie que `path` réside sur un filesystem local (non NFS).
///
/// Appelé par `FileStorage::new()` avant la construction de l'`Operator` OpenDAL.
/// Implémente le caveat C11 : le vault root NE PEUT PAS être sur NFS.
///
/// ## Stratégie de chemin
///
/// Si `path` n'existe pas encore (init d'un nouveau vault), on vérifie le parent immédiat.
/// Cela permet de rejeter un vault planifié sur NFS avant même sa création.
///
/// ## Non-Linux
///
/// Sur macOS / Windows, le check est skippé avec un warning.
/// NFS_SUPER_MAGIC n'est pas défini sur ces plateformes.
///
/// # Erreurs
///
/// - `StorageError::Io` si `statfs` échoue (permission, chemin invalide).
/// - `StorageError::Core(GradatumError::VaultOnNfs { path })` si NFS détecté.