Lindenii Project Forge
Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.
/ev/server/server.ha (raw)
use ev;
use io;
use memio;
use os;
export type server = struct {
sock: *ev::file,
clients: []*server_client,
cb: *opaque,
user: nullable *opaque
};
export type server_client = struct {
sock: *ev::file,
server: *server,
rbuf: [os::BUFSZ]u8,
wbuf: []u8,
buf: memio::stream,
};
export fn newserver(sock: *ev::file, cb: *opaque, user: nullable *opaque) (*server | nomem) = {
return alloc(server {
sock = sock,
cb = cb,
user = user,
...
});
};
export fn server_finish(serv: *server) void = {
for (let i = 0z; i < len(serv.clients); i += 1) {
client_close(serv.clients[i]);
i -= 1;
};
free(serv);
};
export fn newclient(serv: *server, sock: *ev::file) (*server_client | nomem) = {
return alloc(server_client {
server = serv,
sock = sock,
buf = memio::dynamic(),
...
});
};
export fn client_close(client: *server_client) void = {
const server = client.server;
for (let i = 0z; i < len(server.clients); i += 1) {
if (server.clients[i] == client) {
delete(server.clients[i]);
break;
};
};
ev::close(client.sock);
io::close(&client.buf)!;
free(client);
};