nx_descriptor_socket_gate_t209.nx source
↩ module page · 34 lines · 1473 B
1// Native descriptor/socket ABI regression; caller supplies a fresh test-only socket path.
2import "nx_syscalls.nx"
3import "nx_gate_verdict.nx"
4func main(argc:i64,argv:*i64)->i64 {
5 if argc!=2 {return 2}
6 let path:*u8=argv[1] as *u8
7 let ctr:*i64=gv_ctr()
8 let server:i64=sys_unix_listen(path,1)
9 gv_check("test socket created",server>=0,ctr)
10 if server<0{return 1}
11 let client:i64=sys_unix_connect_fd(path)
12 gv_check("local client connects",client>=0,ctr)
13 if client>=0 {
14 let addr:*u8=sys_mmap_try(SCM_SUN_BYTES)
15 let len:*i64=sys_mmap_try(__size_of(i64)) as *i64
16 if (addr as i64)<=0||(len as i64)<=0 {sys_close(client);sys_close(server);sys_unlinkat(path);return 1}
17 len[0]=SCM_SUN_BYTES
18 let rc:i64=__syscall(205,client,addr,len,0,0,0)
19 gv_check("portable getpeername reaches connected socket",rc==0,ctr)
20 var same:i64=1;var i:i64=0
21 if rc!=0 {same=0}
22 else {
23 if addr[0]!=(SCM_AF_UNIX as u8)||addr[1]!=(0 as u8){same=0}
24 while path[i]!=(0 as u8)&&i<SCM_SUN_PATH_MAX {if addr[SCM_SUN_PATH_OFF+i]!=path[i]{same=0};i=i+1}
25 if len[0]!=SCM_SUN_PATH_OFF+i+1||addr[SCM_SUN_PATH_OFF+i]!=(0 as u8){same=0}
26 }
27 gv_check("peer address equals actual named listener",same==1,ctr)
28 sys_munmap_direct(addr,SCM_SUN_BYTES);sys_munmap_direct(len as *u8,__size_of(i64))
29 sys_close(client)
30 }
31 sys_close(server)
32 gv_check("owned socket cleanup",sys_unlinkat(path)==0,ctr)
33 return gv_verdict("DESCRIPTOR-SOCKET-ABI",ctr,"native connected socket; no external traffic")
34}