aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c42
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,