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}