code wiki / (root) / nx_fcntl_probe.nx

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}