diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/forward.c | 61 | ||||
-rw-r--r-- | src/forward.h | 13 | ||||
-rw-r--r-- | src/jail.c | 68 | ||||
-rw-r--r-- | src/jail.h | 4 | ||||
-rw-r--r-- | src/main.c | 5 | ||||
-rw-r--r-- | src/server.c | 2 |
6 files changed, 117 insertions, 36 deletions
diff --git a/src/forward.c b/src/forward.c index 86f4fb6..d81f24c 100644 --- a/src/forward.c +++ b/src/forward.c @@ -20,16 +20,17 @@ int fwd_init_ctx(forward_ctx **ctx, init_cb init_fn) return 0; } -int fwd_setup(forward_ctx *ctx, const char *host, const char *port) +int fwd_setup_client(forward_ctx *ctx, const char *host, const char *port) { int s; struct addrinfo *fwd_addr = NULL; assert(ctx); + ctx->fwd_type = FT_CLIENT; s = socket_init_in(host, port, &fwd_addr); if (s) { - E_GAIERR(s, "Could not initialise forward socket"); + E_GAIERR(s, "Could not initialise client forward socket"); return 1; } @@ -56,9 +57,34 @@ int fwd_setup(forward_ctx *ctx, const char *host, const char *port) return 0; } +int fwd_setup_server(forward_ctx *ctx, const char *listen_addr, + const char *listen_port) +{ + int s; + struct addrinfo *fwd_addr = NULL; + + assert(ctx); + ctx->fwd_type = FT_SERVER; + + s = socket_init_in(listen_addr, listen_port, &fwd_addr); + if (s) { + E_GAIERR(s, "Could not initialise server forward socket"); + return 1; + } + if (socket_bind_in(&ctx->sock, &fwd_addr)) { + E_STRERR("Could not bind forward server socket to %s:%s", + listen_addr, listen_port); + return 1; + } + + return 0; +} + int fwd_validate_ctx(const forward_ctx *ctx) { assert(ctx); + assert(ctx->fwd_type == FT_CLIENT || + ctx->fwd_type == FT_SERVER); assert(ctx->fwd_cbs.on_listen && ctx->fwd_cbs.on_shutdown); assert(ctx->sock.addr_len > 0); assert(strnlen(ctx->host_buf, NI_MAXHOST) > 0); @@ -69,13 +95,38 @@ int fwd_validate_ctx(const forward_ctx *ctx) int fwd_connect_sock(forward_ctx *ctx, psocket *fwd_client) { + psocket *dst; + assert(ctx); - socket_clone(&ctx->sock, fwd_client); + assert(ctx->fwd_type == FT_CLIENT); + if (fwd_client) { + dst = fwd_client; + socket_clone(&ctx->sock, fwd_client); + } else { + dst = &ctx->sock; + } - return socket_reconnect_in(fwd_client); + return socket_reconnect_in(dst); } -int fwd_listen_fd(forward_ctx *ctx, int fwd_fd) +int fwd_listen_sock(forward_ctx *ctx, psocket *fwd_server) { + psocket *dst; + + assert(ctx); + assert(ctx->fwd_type == FT_SERVER); + if (fwd_server) { + dst = fwd_server; + socket_clone(&ctx->sock, fwd_server); + } else { + dst = &ctx->sock; + } + + if (socket_listen_in(dst)) { + E_STRERR("Could not listen on forward server socket on %s:%s", + ctx->host_buf, ctx->service_buf); + return 1; + } + return 0; } diff --git a/src/forward.h b/src/forward.h index 60c7500..1676c1b 100644 --- a/src/forward.h +++ b/src/forward.h @@ -15,8 +15,12 @@ typedef struct fwd_callbacks { on_shutdown_cb on_shutdown; } fwd_callbacks; +typedef enum forward_type { + FT_NONE = 0, FT_CLIENT, FT_SERVER +} forward_type; + typedef struct forward_ctx { - pthread_t self; + forward_type fwd_type; fwd_callbacks fwd_cbs; psocket sock; char host_buf[NI_MAXHOST], service_buf[NI_MAXSERV]; @@ -26,12 +30,15 @@ typedef struct forward_ctx { int fwd_init_ctx(forward_ctx **ctx, init_cb init_fn); -int fwd_setup(forward_ctx *ctx, const char *host, const char *port); +int fwd_setup_client(forward_ctx *ctx, const char *host, const char *port); + +int fwd_setup_server(forward_ctx *ctx, const char *listen_addr, + const char *listen_port); int fwd_validate_ctx(const forward_ctx *ctx); int fwd_connect_sock(forward_ctx *ctx, psocket *fwd_client); -int fwd_listen_fd(forward_ctx *ctx, int fwd_fd); +int fwd_listen_sock(forward_ctx *ctx, psocket *fwd_server); #endif @@ -21,6 +21,11 @@ typedef struct jail_prisoner_process { char *newroot; } jail_prisoner_process; +typedef enum connection_state { + CON_OK, CON_IN_TERMINATED, CON_OUT_TERMINATED, + CON_IN_ERROR, CON_OUT_ERROR +} connection_state; + static int jail_mainloop_epoll(int epoll_fd, jail_ctx *ctx[], size_t siz) __attribute__((noreturn)); static int jail_accept_client(jail_ctx *ctx[], @@ -28,6 +33,8 @@ static int jail_accept_client(jail_ctx *ctx[], static int jail_childfn(jail_prisoner_process *ctx) __attribute__((noreturn)); static int jail_socket_tty_epoll(jail_prisoner_process *ctx, int tty_fd); +static connection_state +jail_socket_tty_io_epoll(struct epoll_event *ev, int dest_fd); void jail_init_ctx(jail_ctx **ctx, size_t stacksize) @@ -48,33 +55,20 @@ void jail_init_ctx(jail_ctx **ctx, size_t stacksize) (*ctx)->stack_beg = (unsigned char *) (*ctx)->stack_ptr + (*ctx)->stacksize; - assert( (*ctx)->stack_ptr ); } int jail_setup(jail_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_addr : "*"), listen_port); - s = socket_init_in(listen_addr, listen_port, &srv_addr); - if (s) { - E_GAIERR(s, "Could not initialise server socket"); + if (fwd_setup_server(&ctx->fwd_ctx, listen_addr, listen_port)) return 1; - } - if (socket_bind_in(&ctx->sock, &srv_addr)) { - E_STRERR("Could not bind server socket to %s:%s", listen_addr, listen_port); + if (fwd_listen_sock(&ctx->fwd_ctx, NULL)) return 1; - } - if (socket_listen_in(&ctx->sock)) { - E_STRERR("Could not listen on server socket on %s:%s", listen_addr, listen_port); - return 1; - } return 0; } @@ -82,7 +76,8 @@ int jail_setup(jail_ctx *ctx, int jail_validate_ctx(const jail_ctx *ctx) { assert(ctx); - assert(ctx->sock.addr_len > 0); + assert(ctx->fwd_ctx.sock.addr_len > 0); + assert(ctx->stack_ptr); return 0; } @@ -99,10 +94,10 @@ int jail_setup_epoll(jail_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]->fwd_ctx.sock.fd; ev.events = EPOLLIN | EPOLLET; - s = socket_addrtostr_in(&ctx[i]->sock, + s = socket_addrtostr_in(&ctx[i]->fwd_ctx.sock, ctx[i]->host_buf, ctx[i]->service_buf); if (s) { E_GAIERR(s, "Convert socket address to string"); @@ -111,7 +106,7 @@ int jail_setup_epoll(jail_ctx *ctx[], size_t siz) N("Jail service listening on %s:%s: %d", ctx[i]->host_buf, ctx[i]->service_buf, ev.data.fd); - s = epoll_ctl(fd, EPOLL_CTL_ADD, ctx[i]->sock.fd, &ev); + s = epoll_ctl(fd, EPOLL_CTL_ADD, ctx[i]->fwd_ctx.sock.fd, &ev); if (s) { close(fd); return -3; @@ -132,7 +127,7 @@ pid_t jail_daemonize(int epoll_fd, jail_ctx *ctx[], size_t siz) for (i = 0; i < siz; ++i) { assert(ctx[i]); - s = socket_addrtostr_in(&ctx[i]->sock, + s = socket_addrtostr_in(&ctx[i]->fwd_ctx.sock, ctx[i]->host_buf, ctx[i]->service_buf); if (s) { E_GAIERR(s, "Could not initialise jail daemon socket"); @@ -153,7 +148,7 @@ pid_t jail_daemonize(int epoll_fd, jail_ctx *ctx[], size_t siz) close(epoll_fd); for (i = 0; i < siz; ++i) - socket_close(&ctx[i]->sock); + socket_close(&ctx[i]->fwd_ctx.sock); return p; } @@ -215,12 +210,12 @@ static int jail_accept_client(jail_ctx *ctx[], static jail_prisoner_process *args; for (i = 0; i < siz; ++i) { - if (ctx[i]->sock.fd == event->data.fd) { + if (ctx[i]->fwd_ctx.sock.fd == event->data.fd) { args = (jail_prisoner_process *) calloc(1, sizeof(*args)); assert(args); args->newroot = ctx[i]->newroot; - if (socket_accept_in(&ctx[i]->sock, &args->client_psock)) { + if (socket_accept_in(&ctx[i]->fwd_ctx.sock, &args->client_psock)) { E_STRERR("Could not accept client connection for fd %d", args->client_psock.fd); goto error; @@ -354,10 +349,16 @@ static int jail_childfn(jail_prisoner_process *ctx) static int jail_socket_tty_epoll(jail_prisoner_process *ctx, int tty_fd) { - int s, fd = epoll_create1(0); + int s, fd; struct epoll_event event = {0,{0}}; + struct epoll_event *events; + sigset_t eset; assert(ctx); + events = (struct epoll_event *) calloc(POTD_MAXEVENTS, sizeof(*events)); + assert(events); + + fd = epoll_create1(0); if (fd < 0) return -1; @@ -373,5 +374,24 @@ static int jail_socket_tty_epoll(jail_prisoner_process *ctx, int tty_fd) FATAL("Jail TTY Epoll for client %s:%s", ctx->host_buf, ctx->service_buf); + sigemptyset(&eset); + + while (1) { + int n, i; + + n = epoll_pwait(fd, events, POTD_MAXEVENTS, -1, &eset); + if (n < 0) + break; + + for (i = 0; i < n; ++i) { + } + } + return 0; } + +static connection_state +jail_socket_tty_io_epoll(struct epoll_event *ev, int dest_fd) +{ + return CON_OK; +} @@ -4,13 +4,13 @@ #include <sys/types.h> #include <unistd.h> -#include "socket.h" +#include "forward.h" #define MIN_STACKSIZE 2048 #define MAX_STACKSIZE BUFSIZ typedef struct jail_ctx { - psocket sock; + forward_ctx fwd_ctx; char host_buf[NI_MAXHOST], service_buf[NI_MAXSERV]; size_t stacksize; void *stack_ptr; @@ -51,7 +51,8 @@ int main(int argc, char *argv[]) D("Initialising jail service on port %s", jail_ports[i]); jail_init_ctx(&jail[i], MAX_STACKSIZE); - jail[i]->newroot = strdup("/home/lns/git/busybox/sysroot"); + //jail[i]->newroot = strdup("/home/lns/git/busybox/sysroot"); + jail[i]->newroot = strdup("/home/toni/git/busybox/_install"); ABORT_ON_FATAL( jail_setup(jail[i], "127.0.0.1", jail_ports[i]), "Jail daemon setup" ); ABORT_ON_FATAL( jail_validate_ctx(jail[i]), @@ -67,7 +68,7 @@ int main(int argc, char *argv[]) { ABORT_ON_FATAL( fwd_init_ctx(&ssh_fwd, ssh_init_cb), "Forwarder initialisation" ); - ABORT_ON_FATAL( fwd_setup(ssh_fwd, "127.0.0.1", "22222"), + ABORT_ON_FATAL( fwd_setup_client(ssh_fwd, "127.0.0.1", "22222"), "Forwarder setup" ); ABORT_ON_FATAL( fwd_validate_ctx( ssh_fwd ), "Forwarder validation" ); diff --git a/src/server.c b/src/server.c index 0edfe70..a4f816b 100644 --- a/src/server.c +++ b/src/server.c @@ -305,6 +305,7 @@ client_mainloop_epoll(void *arg) } event.data.fd = args->client_psock.fd; event.events = EPOLLIN | EPOLLET; + s = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, args->client_psock.fd, &event); if (s) { E_STRERR("Forward Epoll descriptor add to %s:%s forward fd %d", @@ -314,6 +315,7 @@ client_mainloop_epoll(void *arg) } sigemptyset(&eset); + while (active) { int n, i; |