code wiki / (root) / nx_okserver.nx

nx_okserver.nx source

↩ module page · 39 lines · 1997 B

1// nx_okserver.nx -- minimal sovereign HTTP service: binds the port given as argv[1] (default 8081) and answers every 2// request "HTTP/1.1 200 OK ... OK". A second real service so nx_runsv_all supervises a genuine multi-service stack. 3// Mirrors nx_archive_server's proven socket setup (SO_REUSEADDR, sockaddr_in, accept loop). license_tier: ORIGINAL 4import "nx_syscalls.nx" 5import "nx_gate.nx" 6const K_MAGIC_8081: i64 = 8081 7const K_MAGIC_8192: i64 = 8192 8 9func oks_atoi(s: *u8) -> i64 { var v: i64=0; var i: i64=0; while s[i]!=(0 as u8){ let d: i64=s[i] as i64; if d>=48 { if d<=57 { v=v*10+(d-48) } } i=i+1 } return v } 10func oks_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 11 12func main(argc: i64, argv: *i64) -> i64 { 13 var port: i64 = K_MAGIC_8081 14 if argc >= 2 { port = oks_atoi(argv[1] as *u8) } 15 let fd: i64 = sys_socket(2, 1, 0) 16 if fd < 0 { gw("nx_okserver: socket fail\n" as *u8); return 1 } 17 let opt: *i64 = sys_mmap(8) as *i64; opt[0]=1 18 __syscall(54, fd, 1, 2, opt as i64, 4, 0) // SO_REUSEADDR 19 let addr: *u8 = sys_mmap(16) 20 addr[0]=2 as u8; addr[1]=0 as u8 21 addr[2]=((port>>8)&0xff) as u8; addr[3]=(port&0xff) as u8 // port, big-endian 22 var z: i64=4; while z<16 { addr[z]=0 as u8; z=z+1 } // INADDR_ANY 23 if sys_bind(fd, addr, 16) < 0 { gw("nx_okserver: bind fail :" as *u8); gn(port); gw("\n" as *u8); return 1 } 24 if sys_listen(fd, 16) < 0 { gw("nx_okserver: listen fail\n" as *u8); return 1 } 25 gw("nx_okserver: serving 200 OK on :" as *u8); gn(port); gw("\n" as *u8) 26 let resp: *u8 = "HTTP/1.1 200 OK\r\nContent-Length: 3\r\nConnection: close\r\n\r\nOK\n" as *u8 27 let rl: i64 = oks_strlen(resp) 28 let req: *u8 = sys_mmap(K_MAGIC_8192) 29 var go: i64=1 30 while go==1 { 31 let cfd: i64 = sys_accept(fd) 32 if cfd < 0 { } else { 33 sys_read(cfd, req, K_MAGIC_8192) 34 sys_write(cfd, resp, rl) 35 sys_close(cfd) 36 } 37 } 38 return 0 39}