aboutsummaryrefslogtreecommitdiff
path: root/src/redirector.c
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2018-05-13 23:43:10 +0200
committerToni Uhlig <matzeton@googlemail.com>2018-05-13 23:43:10 +0200
commit3e854ba53063062a4824966ae1b6c93e6100cea4 (patch)
treedd5de5c014018d7c4ba50dde77d886d2f1c42d10 /src/redirector.c
parentd336c8771f617df35c43f28feae6c3f83512deaf (diff)
POTD skeleton #49.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src/redirector.c')
-rw-r--r--src/redirector.c69
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;
}