use fmt; use net; use net::tcp; use net::ip; use io; use os; use unix::poll; use bufio; use drawing; use packet_reader; def PORT: u16 = 41460; type conn = net::socket; export fn main() void = { const listener = tcp::listen(ip::ANY_V4, PORT)!; loop(listener); }; fn loop(listener: net::socket) void = { // pollfds[0] is the listener // pollfds[n>0] corresponds to packet_readers[n-1] let pollfds: []poll::pollfd = alloc([ poll::pollfd { fd = listener, events = poll::event::POLLIN, revents = 0 }]); let packet_readers: []packet_reader::packet_reader = []; for (true) { fmt::println("poll.")!; poll::poll(pollfds, poll::INDEF)!; if (0 != pollfds[0].revents & poll::event::POLLIN) { fmt::println("new conn")!; const new_conn = tcp::accept(pollfds[0].fd)!; fmt::println("a")!; append(pollfds, poll::pollfd { fd = new_conn, events = poll::event::POLLIN, revents = 0 }); append(packet_readers, packet_reader::new()); fmt::printfln("there are now {},{} conns.",len(pollfds),len(packet_readers))!; }; for (let i = 1z; i < len(pollfds); i += 1) { if (0 != pollfds[i].revents & poll::event::POLLIN) { match (packet_reader::read(&packet_readers[i-1], pollfds[i].fd)) { case void => let j = 1; for (const packet_bytes => packet_reader::next(&packet_readers[i-1])) { fmt::printf("#{}:{} got {:2}",i,j,len(packet_bytes))!; j += 1; for (let byte .. packet_bytes) fmt::printf(" {:x}",byte)!; const op = drawing::deser_op(packet_bytes) as drawing::op_circle; fmt::printfln("\t({:+6},{:+6})",op.0,op.1)!; for (let k = 1z; k < len(pollfds); k += 1) { if (k == i) continue; fmt::printfln("\t -> #{}",k)!; io::writeall(pollfds[k].fd, packet_bytes)!; }; }; case let err: io::error => fmt::printfln("#{} error: {}",i,io::strerror(err))!; delete(pollfds[i]); delete(packet_readers[i-1]); i -= 1; case io::EOF => fmt::printfln("#{} disconnect",i)!; delete(pollfds[i]); delete(packet_readers[i-1]); i -= 1; }; }; }; }; };