code wiki / (root) / nx_descriptor_socket_gate_t209.nx

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}