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}