diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2018-05-13 23:43:10 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2018-05-13 23:43:10 +0200 |
commit | 3e854ba53063062a4824966ae1b6c93e6100cea4 (patch) | |
tree | dd5de5c014018d7c4ba50dde77d886d2f1c42d10 /src/redirector.c | |
parent | d336c8771f617df35c43f28feae6c3f83512deaf (diff) |
POTD skeleton #49.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src/redirector.c')
-rw-r--r-- | src/redirector.c | 69 |
1 files changed, 41 insertions, 28 deletions
diff --git a/src/redirector.c b/src/redirector.c index 9366079..c21fa61 100644 --- a/src/redirector.c +++ b/src/redirector.c @@ -15,11 +15,11 @@ typedef struct client_thread { pthread_t self; psocket client_sock; char host_buf[NI_MAXHOST], service_buf[NI_MAXSERV]; - const redirector_ctx *rdr_ctx; + redirector_ctx *rdr_ctx; } client_thread; typedef struct server_event { - const redirector_ctx **rdr_ctx; + redirector_ctx **rdr_ctx; const size_t siz; } server_event; @@ -32,7 +32,7 @@ static forward_state fwd_state_string(const forward_state c_state, const client_thread *args, const psocket *fwd); static int -redirector_mainloop(event_ctx *ev_ctx, const redirector_ctx *rdr_ctx[], size_t siz) +redirector_mainloop(event_ctx *ev_ctx, redirector_ctx *rdr_ctx[], size_t siz) __attribute__((noreturn)); static int redirector_accept_client(event_ctx *ev_ctx, int fd, void *user_data); static void * @@ -40,19 +40,26 @@ client_mainloop(void *arg); static int client_io(event_ctx *ev_ctx, int src_fd, void *user_data); -void redirector_init_ctx(redirector_ctx **ctx, forward_ctx *fwd_ctx) +int redirector_init_ctx(redirector_ctx **ctx) { - assert(ctx && fwd_ctx); + forward_ctx *fwd; + + assert(ctx); if (!*ctx) *ctx = (redirector_ctx *) malloc(sizeof(**ctx)); assert(*ctx); memset(*ctx, 0, sizeof(**ctx)); - (*ctx)->fwd_ctx = fwd_ctx; + fwd = &(*ctx)->fwd_ctx; + if (fwd_init_ctx(&fwd)) + return 1; + + return 0; } int redirector_setup(redirector_ctx *ctx, - const char *listen_addr, const char *listen_port) + const char *listen_addr, const char *listen_port, + const char *host, const char *port) { int s; struct addrinfo *srv_addr = NULL; @@ -60,8 +67,9 @@ int redirector_setup(redirector_ctx *ctx, assert(ctx); assert(listen_addr || listen_port); - D2("Try to listen on %s:%s", - (listen_addr ? listen_addr : "*"), listen_port); + D2("Try to listen on %s:%s and forward to %s:%s", + (listen_addr ? listen_addr : "*"), listen_port, + host, port); s = socket_init_in(listen_addr, listen_port, &srv_addr); if (s) { E_GAIERR(s, "Could not initialise server socket"); @@ -78,12 +86,17 @@ int redirector_setup(redirector_ctx *ctx, return 1; } + if (fwd_setup_client(&ctx->fwd_ctx, host, port)) + return 1; + if (fwd_validate_ctx(&ctx->fwd_ctx)) + return 1; + return 0; } int redirector_validate_ctx(const redirector_ctx *ctx) { - assert(ctx && ctx->fwd_ctx); + assert(ctx); assert(ctx->sock.fd >= 0 && ctx->sock.addr_len > 0); return 0; @@ -145,7 +158,7 @@ pid_t redirector_daemonize(event_ctx *ev_ctx, redirector_ctx *rdr_ctx[], size_t return -1; case 0: N("%s", "Server daemon mainloop"); - redirector_mainloop(ev_ctx, (const redirector_ctx **) rdr_ctx, siz); + redirector_mainloop(ev_ctx, rdr_ctx, siz); break; } D2("Server daemon pid: %d", p); @@ -172,14 +185,14 @@ fwd_state_string(const forward_state c_state, const client_thread *args, break; case CON_OUT_ERROR: N("Lost forward connection to %s:%s: %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, fwd->fd); break; case CON_OUT_TERMINATED: N("Forward connection terminated: %s:%s: %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, fwd->fd); break; } @@ -187,7 +200,7 @@ fwd_state_string(const forward_state c_state, const client_thread *args, return c_state; } -static int redirector_mainloop(event_ctx *ev_ctx, const redirector_ctx *rdr_ctx[], size_t siz) +static int redirector_mainloop(event_ctx *ev_ctx, redirector_ctx *rdr_ctx[], size_t siz) { int rc; server_event ev_srv = { rdr_ctx, siz }; @@ -207,7 +220,7 @@ static int redirector_accept_client(event_ctx *ev_ctx, int fd, void *user_data) int s; server_event *ev_srv = (server_event *) user_data; client_thread *args; - const redirector_ctx *rdr_ctx; + redirector_ctx *rdr_ctx; (void) ev_ctx; assert(ev_srv); @@ -278,21 +291,21 @@ client_mainloop(void *arg) goto finish; } - if (fwd_connect_sock(args->rdr_ctx->fwd_ctx, &fwd)) { + if (fwd_connect_sock(&args->rdr_ctx->fwd_ctx, &fwd)) { E_STRERR("Forward connection to %s:%s server fd %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, args->rdr_ctx->sock.fd); goto finish; } N("Forwarding connection to %s:%s forward fd %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, fwd.fd); + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, fwd.fd); if (event_add_sock(ev_ctx, &fwd)) { E_STRERR("Forward event context add to %s:%s forward fd %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, fwd.fd); + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, fwd.fd); goto finish; } @@ -303,14 +316,14 @@ client_mainloop(void *arg) s = socket_nonblock(&args->client_sock); if (s) { E_STRERR("Socket non blocking mode to %s:%s forward fd %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, fwd.fd); + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, fwd.fd); goto finish; } if (event_add_sock(ev_ctx, &args->client_sock)) { E_STRERR("Forward event context add to %s:%s forward fd %d", - args->rdr_ctx->fwd_ctx->host_buf, - args->rdr_ctx->fwd_ctx->service_buf, fwd.fd); + args->rdr_ctx->fwd_ctx.host_buf, + args->rdr_ctx->fwd_ctx.service_buf, fwd.fd); goto finish; } |