aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/src/server.c b/src/server.c
index 884ec5b..01ad6c9 100644
--- a/src/server.c
+++ b/src/server.c
@@ -24,24 +24,51 @@ client_mainloop_epoll(void *arg);
static int client_io_epoll(struct epoll_event *ev);
-int server_init_ctx(server_ctx **ctx, init_cb init_fn)
+int server_init_ctx(server_ctx **ctx, forward_ctx *fwd_ctx)
{
- assert(ctx);
+ assert(ctx && fwd_ctx);
if (!*ctx)
*ctx = (server_ctx *) malloc(sizeof(**ctx));
- assert(*ctx || init_fn);
+ assert(*ctx);
memset(*ctx, 0, sizeof(**ctx));
- if (!init_fn(*ctx))
+ (*ctx)->fwd_ctx = fwd_ctx;
+
+ return 0;
+}
+
+int server_setup(server_ctx *ctx,
+ const char *listen_addr, const char *listen_port)
+{
+ int s;
+ struct addrinfo *srv_addr = NULL;
+
+ assert(ctx);
+ assert(listen_addr || listen_port);
+
+ D2("Try to listen on %s:%s", listen_addr, listen_port);
+ s = socket_init_in(listen_addr, listen_port, &srv_addr);
+ if (s) {
+ E_GAIERR(s, "Could not initialise server socket");
return 1;
+ }
+ if (socket_bind_in(&ctx->sock, srv_addr)) {
+ E_STRERR("Could not bind server socket");
+ return 1;
+ }
+ if (socket_listen_in(&ctx->sock)) {
+ E_STRERR("Could not listen on server socket");
+ return 1;
+ }
return 0;
}
int server_validate_ctx(const server_ctx *ctx)
{
- assert(ctx);
- assert(ctx->server_cbs.on_listen && ctx->server_cbs.on_shutdown);
+ assert(ctx && ctx->fwd_ctx);
+ assert(ctx->sock.fd >= 0 && ctx->sock.addr_len > 0);
+
return 0;
}