From ad9b5eb1ffff32f26189fb5a132b11983ca1ae30 Mon Sep 17 00:00:00 2001 From: bartfaik04 Date: Sat, 24 May 2025 18:57:13 +0200 Subject: [PATCH] Send and receive usernames --- Makefile | 2 +- src/main.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 18f8ee9..fc542f6 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ all: - g++ -std=c++17 src/main.cpp src/usermanager.cpp -o ncsambawatcher \ No newline at end of file + g++ -lrt -std=c++17 src/main.cpp src/usermanager.cpp -o ncsambawatcher \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3eaa220..78e1563 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,8 +2,11 @@ #include #include #include +#include #include #include +#include +#include #include #include #include @@ -13,13 +16,46 @@ #include "locations.h" #include "usermanager.h" +#define MAXNAMESIZE 255 +#define SCAN_DONE_SIG SIGRTMIN + +void initRunningFlag(int shmid) +{ + bool *init = static_cast(shmat(shmid, nullptr, 0)); + *init = false; + shmdt(init); +} + +bool readRunningFlag(int shmid) +{ + bool *init = static_cast(shmat(shmid, nullptr, 0)); + *init = false; + shmdt(init); + return *init; +} + +void setRunningFlag(int shmid, bool data) +{ + bool *init = static_cast(shmat(shmid, nullptr, 0)); + *init = data; + shmdt(init); +} + +void handler(int sig) {} + int main() { openlog("ncsambawatcher", LOG_PID | LOG_CONS, LOG_USER); - + int p1[2]; pipe(p1); - + sigset_t ss; + sigfillset(&ss); + sigdelset(&ss, SCAN_DONE_SIG); + + int shmid = shmget(IPC_PRIVATE, sizeof(bool), 0666 | IPC_CREAT); + initRunningFlag(shmid); + pid_t parent = getpid(); pid_t child = fork(); @@ -27,26 +63,51 @@ int main() { close(p1[0]); // read - FILE* logpipe = popen(LOGFILE, "r"); + FILE *logpipe = popen(LOGFILE, "r"); std::array buffer; + userManager manager; - while(fgets(buffer.data(), buffer.size(), logpipe) != nullptr) + while (fgets(buffer.data(), buffer.size(), logpipe) != nullptr) { std::string line(buffer.data()); + + if (line.find('|') == std::string::npos) + { + continue; + } + + std::vector x = splitLogFile(line, '|'); + std::string user(x.at(USER_LOG_LOCATION)); + manager.addUser(user); + manager.setUserFlagged(user); + + std::vector users = manager.getFlaggedUsers(); + + for (auto it = users.begin(); it != users.end(); ++it) + { + write(p1[1], it->data(), it->size()); + } } + fclose(logpipe); close(p1[1]); // write } else // child { close(p1[1]); // write + std::array received; + while (read(p1[0], received.data(), sizeof(char) * MAXNAMESIZE)) + { + + } close(p1[0]); // read } + shmctl(shmid, IPC_RMID, nullptr); closelog(); - + return EXIT_SUCCESS; } \ No newline at end of file