nx_fcntl_probe.nx source
↩ module page · 49 lines · 2418 B
1// nx_fcntl_probe.nx -- which syscall number actually reaches fcntl on this target?
2// Rule 2: verify library APIs in-container, never trust the header.
3// expect_exit: 0 license_tier: ORIGINAL
4import "nx_syscalls.nx"
5import "nx_connect.nx" // bounded connect: a raw sys_connect hangs ~127s on a black-holed host
6import "nx_fcntl.nx"
7const K_MAGIC_19791: i64 = 19791
8
9func p_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
10func p_putn(v: i64) -> i64 {
11 let b: *u8 = sys_mmap(32)
12 if v == 0 { b[0] = 48 as u8; sys_write(1, b, 1); return 0 }
13 var x: i64 = v
14 var neg: i64 = 0
15 if x < 0 { neg = 1; x = 0 - x }
16 var n: i64 = 0
17 while x > 0 { b[n] = ((x - (x / 10) * 10) + 48) as u8; n = n + 1; x = x / 10 }
18 let r: *u8 = sys_mmap(48)
19 var i: i64 = 0
20 if neg == 1 { r[0] = 45 as u8; i = 1 }
21 var k: i64 = 0
22 while k < n { r[i + k] = b[n - 1 - k]; k = k + 1 }
23 sys_write(1, r, i + n)
24 return 0
25}
26
27func main(argc: i64, argv: *i64) -> i64 {
28 let fd: i64 = sys_socket(AF_INET, SOCK_STREAM, 0)
29 p_puts("socket fd = " as *u8); p_putn(fd); p_puts("\n" as *u8)
30
31 p_puts("nx_fcntl(fd, NX_F_GETFL=3, 0) = " as *u8); p_putn(nx_fcntl(fd, NX_F_GETFL, 0)); p_puts("\n" as *u8)
32 p_puts("__syscall(25, fd, 3, 0) [rv64 num] = " as *u8); p_putn(__syscall(25, fd, 3, 0, 0, 0, 0)); p_puts("\n" as *u8)
33 p_puts("__syscall(72, fd, 3, 0) [x86 num] = " as *u8); p_putn(__syscall(72, fd, 3, 0, 0, 0, 0)); p_puts("\n" as *u8)
34 p_puts("NX_SYS_FCNTL const value = " as *u8); p_putn(NX_SYS_FCNTL); p_puts("\n" as *u8)
35 p_puts("NX_O_NONBLOCK = " as *u8); p_putn(NX_O_NONBLOCK); p_puts("\n" as *u8)
36
37 // and does bind/listen work at all?
38 let s: *u8 = sys_mmap(32)
39 var i: i64 = 0
40 while i < 16 { s[i] = 0 as u8; i = i + 1 }
41 s[0] = 2 as u8; s[2] = (K_MAGIC_19791 >> 8) as u8; s[3] = (K_MAGIC_19791 & 255) as u8
42 s[4] = 127 as u8; s[5] = 0 as u8; s[6] = 0 as u8; s[7] = 1 as u8
43 p_puts("bind rc = " as *u8); p_putn(sys_bind(fd, s, 16)); p_puts("\n" as *u8)
44 p_puts("listen rc = " as *u8); p_putn(sys_listen(fd, 16)); p_puts("\n" as *u8)
45 let c: i64 = sys_socket(AF_INET, SOCK_STREAM, 0)
46 p_puts("raw sys_connect to it = " as *u8); p_putn(nx_connect_bounded(c, s, 16, NX_CONN_DEFAULT_MS)); p_puts("\n" as *u8)
47 sys_close(c); sys_close(fd)
48 return 0
49}