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}