diff options
Diffstat (limited to 'src/server.c')
-rw-r--r-- | src/server.c | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/src/server.c b/src/server.c index 8c71554..884ec5b 100644 --- a/src/server.c +++ b/src/server.c @@ -17,25 +17,25 @@ typedef struct client_thread_args { const server_ctx *server_ctx; } client_thread_args; -static int server_accept_client(const server_ctx ctx[], +static int server_accept_client(server_ctx *ctx[], size_t siz, struct epoll_event *event); static void * client_mainloop_epoll(void *arg); static int client_io_epoll(struct epoll_event *ev); -server_ctx * -server_init_ctx(server_ctx *ctx, init_cb init_fn) +int server_init_ctx(server_ctx **ctx, init_cb init_fn) { - if (!ctx) - ctx = (server_ctx *) malloc(sizeof(*ctx)); assert(ctx); + if (!*ctx) + *ctx = (server_ctx *) malloc(sizeof(**ctx)); + assert(*ctx || init_fn); - memset(ctx, 0, sizeof(*ctx)); - if (!init_fn(ctx)) - return NULL; + memset(*ctx, 0, sizeof(**ctx)); + if (!init_fn(*ctx)) + return 1; - return ctx; + return 0; } int server_validate_ctx(const server_ctx *ctx) @@ -45,7 +45,7 @@ int server_validate_ctx(const server_ctx *ctx) return 0; } -int server_setup_epoll(server_ctx ctx[], size_t siz) +int server_setup_epoll(server_ctx *ctx[], size_t siz) { int s, fd = epoll_create1(0); /* flags == 0 -> obsolete size arg is dropped */ struct epoll_event ev; @@ -57,19 +57,19 @@ int server_setup_epoll(server_ctx ctx[], size_t siz) for (size_t i = 0; i < siz; ++i) { memset(&ev, 0, sizeof(ev)); - ev.data.fd = ctx[i].sock.fd; + ev.data.fd = ctx[i]->sock.fd; ev.events = EPOLLIN | EPOLLET; - s = socket_addrtostr_in(&ctx[i].sock, - ctx[i].host_buf, ctx[i].service_buf); + s = socket_addrtostr_in(&ctx[i]->sock, + ctx[i]->host_buf, ctx[i]->service_buf); if (s) { E_GAIERR(s, "Convert socket address to string"); return -2; } N("Redirector service listening on %s:%s", - ctx[i].host_buf, ctx[i].service_buf); + ctx[i]->host_buf, ctx[i]->service_buf); - s = epoll_ctl(fd, EPOLL_CTL_ADD, ctx[i].sock.fd, &ev); + s = epoll_ctl(fd, EPOLL_CTL_ADD, ctx[i]->sock.fd, &ev); if (s) { close(fd); return -3; @@ -79,7 +79,7 @@ int server_setup_epoll(server_ctx ctx[], size_t siz) return fd; } -int server_mainloop_epoll(int epoll_fd, const server_ctx ctx[], size_t siz) +int server_mainloop_epoll(int epoll_fd, server_ctx *ctx[], size_t siz) { static struct epoll_event *events = NULL; @@ -120,7 +120,7 @@ int server_mainloop_epoll(int epoll_fd, const server_ctx ctx[], size_t siz) return 0; } -static int server_accept_client(const server_ctx ctx[], +static int server_accept_client(server_ctx *ctx[], size_t siz, struct epoll_event *event) { size_t i; @@ -128,15 +128,15 @@ static int server_accept_client(const server_ctx ctx[], client_thread_args *args; for (i = 0; i < siz; ++i) { - if (ctx[i].sock.fd == event->data.fd) { + if (ctx[i]->sock.fd == event->data.fd) { args = (client_thread_args *) calloc(1, sizeof(client_thread_args)); - if (socket_accept_in(&ctx[i].sock, &args->client_psock)) { + if (socket_accept_in(&ctx[i]->sock, &args->client_psock)) { E_STRERR("Could not accept client connection"); return 0; } - args->server_ctx = &ctx[i]; + args->server_ctx = ctx[i]; s = socket_addrtostr_in(&args->client_psock, args->host_buf, args->service_buf); if (s) { @@ -145,7 +145,7 @@ static int server_accept_client(const server_ctx ctx[], } N("New connection from %s:%s to %s:%s: %d", args->host_buf, args->service_buf, - ctx[i].host_buf, ctx[i].service_buf, + ctx[i]->host_buf, ctx[i]->service_buf, args->client_psock.fd); if (pthread_create(&args->self, NULL, |