diff --git a/src/main.cpp b/src/main.cpp index fd4c844..0a16c9a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,10 @@ #include +#include +#include #include #include #include +#include #include #include #include @@ -45,18 +48,45 @@ void readingThreadFunc() void scannerThreadFunc() { std::unique_lock lock(mtx); + std::vector childrens; while (true) { cv.wait(lock, [] - { return manager.isAnybodyInQueue(); }); + { return manager.isAnybodyFlagged(); }); - std::vector scanUsers = manager.getFlaggedUsers(); + std::set scanUsers = manager.getFlaggedUsers(); manager.unflagAllUsers(); - for (std::vector::iterator it = scanUsers.begin(); it != scanUsers.end(); it++) + lock.unlock(); + childrens.clear(); + + for (const std::string& user : scanUsers) { - system((std::string(SCAN_CMD_USR) + *it).c_str()); + pid_t child = fork(); + + if (child < 0) + { + std::cerr << "Fork failed for: " << user << std::endl; + } + else if (child == 0) // child + { + std::string cmd = (std::string(SCAN_CMD_USR) + user); + execl("/bin/sh", "sh", "-c", cmd.c_str(), static_cast(nullptr)); + std::cerr << "Scan failed" << std::endl; + _exit(EXIT_FAILURE); + } + else // parent + { + childrens.push_back(child); + } } + + for (const pid_t& pid : childrens) + { + waitpid(pid, nullptr, 0); + } + + lock.lock(); } } diff --git a/src/usermanager.h b/src/usermanager.h index a313083..5a7ea14 100644 --- a/src/usermanager.h +++ b/src/usermanager.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include "locations.h" @@ -71,23 +72,23 @@ public: } } - std::vector getUsers() + std::set getUsers() { - std::vector ret; + std::set ret; std::lock_guard lock(mtx); for (std::map::iterator it = users.begin(); it != users.end(); ++it) { - ret.push_back(it->first); + ret.insert(it->first); } return ret; } - std::vector getFlaggedUsers() + std::set getFlaggedUsers() { - std::vector ret; + std::set ret; std::lock_guard lock(mtx); @@ -95,14 +96,14 @@ public: { if (it->second) { - ret.push_back(it->first); + ret.insert(it->first); } } return ret; } - bool isAnybodyInQueue() + bool isAnybodyFlagged() { std::lock_guard lock(mtx);