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}