aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2018-04-14 19:16:28 +0200
committerToni Uhlig <matzeton@googlemail.com>2018-04-14 19:16:28 +0200
commitba88e43fd00b680d26398402913eea75428ce5da (patch)
treefb4f593600a2bf654634b827248c47cc3f3ceb4f /src
parentecf35293f80bba8b83a0dbf28f097812aa4353cb (diff)
POTD skeleton #4.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/main.c3
-rw-r--r--src/server.c53
-rw-r--r--src/thread_mgmt.c62
-rw-r--r--src/thread_mgmt.h15
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
diff --git a/src/main.c b/src/main.c
index 099888b..ff5fcbb 100644
--- a/src/main.c
+++ b/src/main.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