code wiki / _hdl_build / nx_meet_serve_lib.nx
nx_meet_serve_lib.nx source
↩ module page · 55 lines · 2319 B
1// nx_meet_serve_lib.nx -- P2-LIVE socket serve loop (LIBRARY, no main) for the NISHI MEET platform. Wraps the
2// gated meet_http_handle in a real TCP server: accept -> read request -> handle -> write response -> close.
3// meet_serve_one(lfd,seq) handles ONE connection on an already-bound listening socket (so a gate can bind+fork+
4// drive it); meet_serve(port) is the production bind+listen+accept loop the daemon runs. 100% sovereign. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_meet_lib.nx"
7import "nx_meet_http.nx"
8const K_MAGIC_65536: i64 = 65536
9const K_MAGIC_65535: i64 = 65535
10
11// per-request id "appl-sock-<seq>"
12func meet_id(seq: i64, out: *u8) -> i64 {
13 var o: i64 = mcat(out, 0, "appl-sock-" as *u8)
14 let t: *u8 = sys_mmap(28); var m: i64 = seq; var k: i64 = 0
15 if m == 0 { t[0] = 48 as u8; k = 1 }
16 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
17 var q: i64 = k - 1
18 while q >= 0 { out[o] = t[q]; o = o + 1; q = q - 1 }
19 out[o] = 0 as u8
20 return o
21}
22
23// handle ONE connection on the (already listening) socket lfd. returns 0.
24func meet_serve_one(lfd: i64, seq: i64) -> i64 {
25 let cfd: i64 = sys_accept(lfd)
26 if cfd < 0 { return 0 }
27 sys_set_socket_timeout(cfd, 5)
28 let req: *u8 = sys_mmap(K_MAGIC_65536)
29 let rn: i64 = sys_read(cfd, req, K_MAGIC_65535)
30 if rn > 0 {
31 let id: *u8 = sys_mmap(64); meet_id(seq, id)
32 let resp: *u8 = sys_mmap(K_MAGIC_65536)
33 meet_http_handle(req, rn, id, resp)
34 sys_write(cfd, resp, mlen(resp))
35 }
36 sys_close(cfd)
37 return 0
38}
39
40// production server: bind 0.0.0.0:port, listen, accept forever. returns <0 on bind/listen failure.
41func meet_serve(port: i64) -> i64 {
42 let addr: *u8 = sys_mmap(16)
43 addr[0] = 2 as u8; addr[1] = 0 as u8
44 addr[2] = ((port >> 8) & 0xff) as u8; addr[3] = (port & 0xff) as u8
45 var z: i64 = 4; while z < 16 { addr[z] = 0 as u8; z = z + 1 }
46 let lfd: i64 = sys_socket(2, 1, 0)
47 if lfd < 0 { return 0 - 1 }
48 let optv: *u8 = sys_mmap(4); optv[0] = 1 as u8
49 sys_setsockopt(lfd, 1, 2, optv, 4) // SO_REUSEADDR
50 if sys_bind(lfd, addr, 16) < 0 { return 0 - 1 }
51 if sys_listen(lfd, 16) < 0 { return 0 - 1 }
52 var seq: i64 = 1
53 while seq > 0 { meet_serve_one(lfd, seq); seq = seq + 1 }
54 return 0
55}