aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlns <matzeton@googlemail.com>2018-04-11 16:29:08 +0200
committerlns <matzeton@googlemail.com>2018-04-11 16:29:08 +0200
commit0e9015400269e004d8dbe006d47fa9e4556603ec (patch)
treea17c8cd1c2e75558901c57acee9926a06b9d1ecb
parentb1fd0299f0dfb69ab11e50a2d1b3c7714c2bb1fa (diff)
POTD skeleton #2.
-rw-r--r--src/main.c45
-rw-r--r--src/server.c44
-rw-r--r--src/server.h11
-rw-r--r--src/utils.h5
4 files changed, 84 insertions, 21 deletions
diff --git a/src/main.c b/src/main.c
index 7ae3cd7..b0c23b3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -9,8 +9,11 @@
int main(int argc, char *argv[])
{
- static server_ctx srv = {0};
+ const size_t srv_siz = 3;
+ const char *ssh_ports[srv_siz];
+ server_ctx srv[srv_siz];
struct addrinfo *netifs = NULL;
+ int epoll_fd;
(void)argc;
(void)argv;
@@ -18,24 +21,36 @@ int main(int argc, char *argv[])
LOG_SET_FUNCS_VA(LOG_COLORED_FUNCS);
N("%s (C) 2018 Toni Uhlig (%s)", PACKAGE_STRING, PACKAGE_BUGREPORT);
- ABORT_ON_FATAL( server_init_ctx(&srv, ssh_init_cb),
- "Server initialisation" );
- server_validate_ctx(&srv);
+ memset(&srv[0], 0, sizeof(srv));
+ ssh_ports[0] = "2222";
+ ssh_ports[1] = "2223";
+ ssh_ports[2] = "22050";
+ for (int i = 0; i < srv_siz; ++i) {
+ N("Initialising SSH server on port %s", ssh_ports[i]);
- GAI_ABORT_ON_FATAL( socket_init_in(&srv.sock, NULL, "2222", &netifs),
- "Socket initialisation" );
+ ABORT_ON_FATAL( server_init_ctx(&srv[i], ssh_init_cb),
+ "Server initialisation" );
+ server_validate_ctx(&srv[i]);
- ABORT_ON_FATAL( socket_bind_in(&srv.sock, netifs),
- "Socket bind" );
+ GAI_ABORT_ON_FATAL( socket_init_in(&srv[i].sock, NULL, ssh_ports[i], &netifs),
+ "Socket initialisation" );
- ABORT_ON_FATAL( socket_listen_in(&srv.sock),
- "Socket listen" );
+ ABORT_ON_FATAL( socket_bind_in(&srv[i].sock, netifs),
+ "Socket bind" );
- ABORT_ON_FATAL( srv.server_cbs.on_listen(&srv.server_dat),
- "Socket on listen callback" );
+ ABORT_ON_FATAL( socket_listen_in(&srv[i].sock),
+ "Socket listen" );
- D2("%s", "Server mainloop");
- ABORT_ON_FATAL( server_mainloop(&srv),
- "Server mainloop" );
+ ABORT_ON_FATAL( srv[i].server_cbs.on_listen(&srv[i].server_dat),
+ "Socket on listen callback" );
+ }
+
+ D2("%s", "Server epoll setup");
+ epoll_fd = server_setup_epoll( (const server_ctx **) &srv, srv_siz );
+ ABORT_ON_FATAL( epoll_fd >= 0, "Server epoll setup" );
+
+ D2("%s", "Server epoll mainloop");
+ ABORT_ON_FATAL( server_mainloop_epoll( epoll_fd, (const server_ctx **) &srv, srv_siz ),
+ "Server epoll mainloop" );
return 0;
}
diff --git a/src/server.c b/src/server.c
index 61664c5..6c0a7a2 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1,5 +1,7 @@
#include <stdlib.h>
+#include <unistd.h>
#include <string.h>
+#include <sys/epoll.h>
#include <assert.h>
#include "server.h"
@@ -19,7 +21,7 @@ server_init_ctx(server_ctx *ctx, init_cb init_fn)
return ctx;
}
-int server_validate_ctx(server_ctx *ctx)
+int server_validate_ctx(const server_ctx *ctx)
{
assert(ctx);
assert(ctx->server_cbs.on_connect && ctx->server_cbs.on_disconnect
@@ -29,10 +31,46 @@ int server_validate_ctx(server_ctx *ctx)
return 0;
}
-int server_mainloop(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 */
+ struct epoll_event ev;
+
+ assert(ctx);
+ assert(siz > 0 && siz < POTD_MAXFD);
+ if (fd < 0)
+ return -1;
+
+ for (int i = 0; i < siz; ++i) {
+ memset(&ev, 0, sizeof(ev));
+ ev.data.fd = ctx[i]->sock.fd;
+ ev.events = EPOLLIN | EPOLLET;
+
+ s = epoll_ctl(fd, EPOLL_CTL_ADD, ctx[i]->sock.fd, &ev);
+ if (s) {
+ close(fd);
+ return -1;
+ }
+ }
+
+ return fd;
+}
+
+int server_mainloop_epoll(int epoll_fd, const server_ctx *ctx[], size_t siz)
+{
+ struct epoll_event *events = calloc(POTD_MAXEVENTS, sizeof(*events));
+
+ assert(events);
+ assert(ctx);
+ assert(siz > 0 && siz < POTD_MAXFD);
+
while (1) {
- sleep(1);
+ int n;
+
+ n = epoll_wait(epoll_fd, events, POTD_MAXEVENTS, -1);
}
+
+ free(events);
return 0;
}
diff --git a/src/server.h b/src/server.h
index 69c3ad7..9cf2af9 100644
--- a/src/server.h
+++ b/src/server.h
@@ -3,6 +3,9 @@
#include "socket.h"
+#define POTD_MAXFD 32
+#define POTD_MAXEVENTS 64
+
typedef struct server_data {
void *data;
} server_data;
@@ -34,13 +37,15 @@ typedef struct server_ctx {
} server_ctx;
typedef int (*init_cb) (struct server_ctx *ctx);
-
+
server_ctx *
server_init_ctx(server_ctx *ctx, init_cb init_fn);
-int server_validate_ctx(server_ctx *ctx);
+int server_validate_ctx(const server_ctx *ctx);
+
+int server_setup_epoll(const server_ctx *ctx[], size_t siz);
-int server_mainloop(server_ctx *ctx);
+int server_mainloop_epoll(int epoll_fd, const server_ctx *ctx[], size_t siz);
#endif
diff --git a/src/utils.h b/src/utils.h
index 587bf25..f391943 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -1,6 +1,11 @@
#ifndef POTD_UTILS_H
#define POTD_UTILS_H 1
+#ifndef SIZEOF
+#define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))
+#endif
+
+
void set_procname(char *arg0, const char *newname);
int daemonize(void);