code wiki / _hdl_build / _eg_httpd_tamper.nx
_eg_httpd_tamper.nx source
↩ module page · 73 lines · 2332 B
1// GENERATED BY nx_eg (generalized emitter-of-emitters) -- control flow synthesized from a structural DATA spec, compiled by nx_cc. license_tier: ORIGINAL
2import "nx_syscalls.nx"
3func eh_find(buf: *u8, n: i64, pat: *u8, plen: i64) -> i64 {
4 var i: i64 = 0
5 while i + plen <= n {
6 var j: i64 = 0
7 var ok: i64 = 1
8 while j < plen {
9 if buf[i+j] != pat[j] { ok = 0 }
10 j = j + 1
11 }
12 if ok == 1 { return 1 }
13 i = i + 1
14 }
15 return 0
16}
17func main() -> i64 {
18 let port: i64 = 18080
19 let addr: *u8 = sys_mmap(16)
20 addr[0] = 2 as u8
21 addr[1] = 0 as u8
22 addr[2] = ((port >> 8) & 0xff) as u8
23 addr[3] = (port & 0xff) as u8
24 addr[4] = 127 as u8
25 addr[5] = 0 as u8
26 addr[6] = 0 as u8
27 addr[7] = 1 as u8
28 addr[8] = 0 as u8
29 addr[9] = 0 as u8
30 addr[10] = 0 as u8
31 addr[11] = 0 as u8
32 addr[12] = 0 as u8
33 addr[13] = 0 as u8
34 addr[14] = 0 as u8
35 addr[15] = 0 as u8
36 let lfd: i64 = sys_socket(2, 1, 0)
37 if lfd < 0 { return 10 }
38 let optval: *u8 = sys_mmap(4)
39 optval[0] = 1 as u8
40 optval[1] = 0 as u8
41 optval[2] = 0 as u8
42 optval[3] = 0 as u8
43 sys_setsockopt(lfd, 1, 2, optval, 4)
44 let brc: i64 = sys_bind(lfd, addr, 16)
45 if brc < 0 { return 20 }
46 let lrc: i64 = sys_listen(lfd, 16)
47 if lrc < 0 { return 30 }
48 let req: *u8 = sys_mmap(4096)
49 let ok200: *u8 = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 2\r\nConnection: close\r\n\r\nok" as *u8
50 let nf404: *u8 = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nnot found" as *u8
51 var served: i64 = 0
52 while served < 64 {
53 let cfd: i64 = sys_accept(lfd)
54 if cfd < 0 { continue }
55 let pid: i64 = sys_fork()
56 if pid == 0 {
57 sys_close(lfd)
58 let rn: i64 = sys_read(cfd, req, 4096)
59 var resp: *u8 = nf404
60 var rlen: i64 = 99
61 let is_health: i64 = eh_find(req, rn, "GET /XXXXXXX" as *u8, 11)
62 if is_health == 1 { resp = ok200 }
63 if is_health == 1 { rlen = 85 }
64 sys_write(cfd, resp, rlen)
65 sys_close(cfd)
66 sys_exit(0)
67 }
68 sys_close(cfd)
69 served = served + 1
70 }
71 sys_close(lfd)
72 return 0
73}