code wiki / _hdl_build / _fsync_probe.nx
_fsync_probe.nx source
↩ module page · 49 lines · 1881 B
1// _fsync_probe.nx -- runtime probe: which __syscall number reaches x86-64 fsync?
2// Candidates: 82 (rv64/generic fsync, IF the compiler's table translates it) and
3// 74 (x86-64 fsync direct, IF untranslated numbers pass through -- the unlinkat
4// 263 precedent). fsync(valid fd)=0 and fsync(-1)=-9 EBADF identifies the real
5// one; rename-semantics misfire returns -EFAULT(-14)/-ENOENT(-2) = visibly NOT
6// fsync. Verify-library-APIs law: trust runtime, not docs. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8func fpp(s: *u8) -> i64 {
9 var n: i64 = 0
10 while s[n] != (0 as u8) { n = n + 1 }
11 sys_write(1, s, n)
12 return 0
13}
14func fpn(v: i64) -> i64 {
15 let bb: *u8 = sys_mmap(28)
16 var m: i64 = v
17 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
18 let t: *u8 = sys_mmap(28)
19 var k: i64 = 0
20 if m == 0 { t[0] = 48 as u8; k = 1 }
21 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
22 var i: i64 = 0
23 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
24 sys_write(1, bb, k)
25 return 0
26}
27func main() -> i64 {
28 let fd: i64 = sys_openat_wr("/tmp/_fsync_probe.dat" as *u8, 0x1a4)
29 sys_write(fd, "x" as *u8, 1)
30 let a: i64 = __syscall(82, fd, 0, 0, 0, 0, 0)
31 let b: i64 = __syscall(74, fd, 0, 0, 0, 0, 0)
32 let abad: i64 = __syscall(82, 0 - 1, 0, 0, 0, 0, 0)
33 let bbad: i64 = __syscall(74, 0 - 1, 0, 0, 0, 0, 0)
34 sys_close(fd)
35 fpp("PROBE n82 valid=" as *u8)
36 fpn(a)
37 fpp(" bad=" as *u8)
38 fpn(abad)
39 fpp("\nPROBE n74 valid=" as *u8)
40 fpn(b)
41 fpp(" bad=" as *u8)
42 fpn(bbad)
43 fpp("\n" as *u8)
44 // verdict: the number behaving as fsync (0 on valid, -9 EBADF on bad)
45 if a == 0 { if abad == (0 - 9) { fpp("PROBE fsync=82\n" as *u8); return 0 } }
46 if b == 0 { if bbad == (0 - 9) { fpp("PROBE fsync=74\n" as *u8); return 0 } }
47 fpp("PROBE fsync=NONE\n" as *u8)
48 return 1
49}