#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "pipedata.h" #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(); if (child > 0) // parent { close(p1[0]); // read FILE *logpipe = popen(LOGFILE, "r"); std::array buffer; userManager manager; 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; }