diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2018-04-14 19:16:28 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2018-04-14 19:16:28 +0200 |
commit | ba88e43fd00b680d26398402913eea75428ce5da (patch) | |
tree | fb4f593600a2bf654634b827248c47cc3f3ceb4f /src | |
parent | ecf35293f80bba8b83a0dbf28f097812aa4353cb (diff) |
POTD skeleton #4.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/main.c | 3 | ||||
-rw-r--r-- | src/server.c | 53 | ||||
-rw-r--r-- | src/thread_mgmt.c | 62 | ||||
-rw-r--r-- | src/thread_mgmt.h | 15 |
5 files changed, 49 insertions, 86 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 04678c3..6545722 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,4 +2,4 @@ AM_CFLAGS = -pedantic -Wall -std=gnu99 -D_GNU_SOURCE=1 $(libssh_CFLAGS) AM_LDFLAGS = $(libssh_LIBS) sbin_PROGRAMS = potd -potd_SOURCES = main.c utils.c log.c log_colored.c thread_mgmt.c socket.c server.c server_ssh.c +potd_SOURCES = main.c utils.c log.c log_colored.c socket.c server.c server_ssh.c @@ -1,6 +1,5 @@ #include "log.h" #include "log_colored.h" -#include "thread_mgmt.h" #include "server.h" #include "server_ssh.h" #ifdef HAVE_CONFIG_H @@ -21,7 +20,6 @@ int main(int argc, char *argv[]) LOG_SET_FUNCS_VA(LOG_COLORED_FUNCS); N("%s (C) 2018 Toni Uhlig (%s)", PACKAGE_STRING, PACKAGE_BUGREPORT); - thread_manager_init(8); memset(&srv[0], 0, sizeof(srv)); ssh_ports[0] = "2222"; @@ -55,5 +53,6 @@ int main(int argc, char *argv[]) N("%s", "Server epoll mainloop"); ABORT_ON_FATAL( server_mainloop_epoll( epoll_fd, &srv[0], srv_siz ), "Server epoll mainloop" ); + return 0; } diff --git a/src/server.c b/src/server.c index 6c32a85..f4e49aa 100644 --- a/src/server.c +++ b/src/server.c @@ -2,6 +2,7 @@ #include <unistd.h> #include <string.h> #include <sys/epoll.h> +#include <pthread.h> #include <assert.h> #include "server.h" @@ -9,8 +10,10 @@ #include "log.h" typedef struct client_thread_args { + pthread_t self; int client_fd; - server_ctx *server_ctx; + struct sockaddr_in clientaddr; + const server_ctx *server_ctx; } client_thread_args; static int server_accept_client(const server_ctx ctx[], @@ -45,8 +48,7 @@ int server_validate_ctx(const server_ctx *ctx) int server_setup_epoll(const server_ctx ctx[], size_t siz) { - int s; - int fd = epoll_create1(0); /* flags == 0 -> obsolete size arg is dropped */ + int s, fd = epoll_create1(0); /* flags == 0 -> obsolete size arg is dropped */ struct epoll_event ev; assert(ctx); @@ -122,9 +124,23 @@ static int server_accept_client(const server_ctx ctx[], client_fd = socket_accept_in(&ctx[i].sock, &clientaddr); if (client_fd < 0) { E_STRERR("Could not accept client connection"); - } else { - return 1; + return 0; + } + + client_thread_args *args = + (client_thread_args *) malloc(sizeof(client_thread_args)); + args->client_fd = client_fd; + args->clientaddr = clientaddr; + args->server_ctx = &ctx[i]; + if (pthread_create(&args->self, NULL, + client_mainloop_epoll, args)) + { + E_STRERR("Thread creation"); + free(args); + return 0; } + + return 1; } } @@ -134,6 +150,31 @@ static int server_accept_client(const server_ctx ctx[], static void * client_mainloop_epoll(void *arg) { - (void) arg; + client_thread_args *args; + int s, epoll_fd; + struct epoll_event event; + struct epoll_event *events; + + assert(arg); + args = (client_thread_args *) arg; + events = (struct epoll_event *) calloc(POTD_MAXEVENTS, sizeof(*events)); + assert(events); + + epoll_fd = epoll_create1(0); + if (epoll_fd < 0) + goto finish; + + event.data.fd = args->client_fd; + event.events = EPOLLIN | EPOLLOUT | EPOLLET; + memset(&event, 0, sizeof(event)); + s = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, args->client_fd, &event); + if (s) + goto finish; + +finish: + close(epoll_fd); + close(args->client_fd); + free(events); + free(args); return NULL; } diff --git a/src/thread_mgmt.c b/src/thread_mgmt.c deleted file mode 100644 index 6a7934e..0000000 --- a/src/thread_mgmt.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <stdlib.h> -#include <pthread.h> -#include <assert.h> - -#include "thread_mgmt.h" - -typedef struct thread_ctx { - int used; - pthread_t thread; - thread_cb fn; - void *user_data; -} thread_ctx; - -static size_t max_threads = 0; -static thread_ctx *threads = NULL; -static pthread_mutex_t list_mtx = PTHREAD_MUTEX_INITIALIZER; - -static void * -thread_fn(void *arg); - - -void thread_manager_init(size_t __max_threads) -{ - max_threads = __max_threads; - assert(max_threads > 0); - assert(!threads); - threads = (thread_ctx *) calloc(max_threads, sizeof(thread_ctx)); - assert(threads); -} - -int thread_add(thread_cb fn, void *user_data) -{ - int rv = -1; - - assert(fn); - pthread_mutex_lock(&list_mtx); - for (size_t i = 0; i < max_threads; ++i) { - if (threads[i].used) - continue; - threads[i].used = 1; - threads[i].fn = fn; - threads[i].user_data = user_data; - rv = pthread_create(&threads[i].thread, NULL, &thread_fn, &threads[i]); - } - pthread_mutex_unlock(&list_mtx); - return rv; -} - -void thread_manager_free(void) -{ - assert(threads); - free(threads); - threads = NULL; - max_threads = 0; -} - -static void * -thread_fn(void *arg) -{ - (void) arg; - return NULL; -} diff --git a/src/thread_mgmt.h b/src/thread_mgmt.h deleted file mode 100644 index c9de258..0000000 --- a/src/thread_mgmt.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef POTD_THREAD_MGMT -#define POTD_THREAD_MGMT 1 - -#include <stdlib.h> - -typedef int (*thread_cb) (void *user_data); - - -void thread_manager_init(size_t max_threads); - -int thread_add(thread_cb fn, void *user_data); - -void thread_manager_free(void); - -#endif |