code wiki / _hdl_build / nx_sig_min_probe.nx

nx_sig_min_probe.nx source

↩ module page · 64 lines · 2469 B

1// nx_sig_min_probe.nx -- minimal bisect daemon: accept ONE connection on 2// 127.0.0.1:8446, run nx_ws_upgrade_handshake, print the verdict, exit. 3// Discriminates: segfault here = upgrade-stack bug; clean verdict here = 4// the bug lives in nx_signaling_v2's room/poll layer. license_tier: ORIGINAL 5 6import "nx_syscalls.nx" 7import "nx_websocket_upgrade.nx" 8const K_MAGIC_8446: i64 = 8446 9const K_MAGIC_4096: i64 = 4096 10 11func 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 } 12func p_pn(v: i64) -> i64 { 13 let b: *u8 = sys_mmap(28) 14 if v == 0 { b[0]=48; sys_write(1,b,1); return 0 } 15 var neg: i64 = 0 16 var x: i64 = v 17 if x < 0 { neg = 1; x = 0 - x } 18 var d: i64=0 19 var y: i64=x 20 while y>0 { d=d+1; y=y/10 } 21 var i: i64=d-1 22 y=x 23 while i>=0 { b[i]=(48+(y%10)) as u8; y=y/10; i=i-1 } 24 if neg == 1 { sys_write(1, "-" as *u8, 1) } 25 sys_write(1,b,d) 26 return 0 27} 28 29func main() -> i64 { 30 let sfd: i64 = sys_socket(AF_INET, SOCK_STREAM, 0) 31 if sfd < 0 { return 101 } 32 let opt: *u8 = sys_mmap(8) 33 opt[0] = 1 as u8; opt[1] = 0 as u8; opt[2] = 0 as u8; opt[3] = 0 as u8 34 sys_setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, opt, 4) 35 let addr: *u8 = sys_mmap(16) 36 addr[0] = 2 as u8; addr[1] = 0 as u8 37 addr[2] = ((K_MAGIC_8446 >> 8) & 0xff) as u8 38 addr[3] = (K_MAGIC_8446 & 0xff) as u8 39 addr[4] = 127 as u8; addr[5] = 0 as u8; addr[6] = 0 as u8; addr[7] = 1 as u8 40 var zi: i64 = 8 41 while zi < 16 { addr[zi] = 0 as u8; zi = zi + 1 } 42 if sys_bind(sfd, addr, 16) < 0 { return 102 } 43 if sys_listen(sfd, 4) < 0 { return 103 } 44 p_puts("min probe on 127.0.0.1:8446\n" as *u8) 45 46 let hdr_buf: *u8 = sys_mmap(K_MAGIC_4096) 47 let path_buf: *u8 = sys_mmap(256) 48 let key_buf: *u8 = sys_mmap(128) 49 let path_n_p: *i64 = sys_mmap(16) as *i64 50 let key_n_p: *i64 = sys_mmap(16) as *i64 51 52 let cfd: i64 = sys_accept(sfd) 53 p_puts("accepted fd=" as *u8); p_pn(cfd); p_puts("\n" as *u8) 54 if cfd < 0 { return 104 } 55 let v: i64 = nx_ws_upgrade_handshake(cfd, 56 hdr_buf, K_MAGIC_4096, 57 path_buf, 256, path_n_p, 58 key_buf, 128, key_n_p) 59 p_puts("upgrade verdict=" as *u8); p_pn(v); p_puts(" path_len=" as *u8); p_pn(path_n_p[0]); p_puts("\n" as *u8) 60 sys_close(cfd) 61 sys_close(sfd) 62 if v == NX_WSU_OK { return 0 } 63 return 1 64}