diff --git a/logic.cpp b/logic.cpp index ac7f88d..e53c9f5 100644 --- a/logic.cpp +++ b/logic.cpp @@ -1,9 +1,4 @@ -#include -#include -#include #include -#include -#include #include #include @@ -18,7 +13,6 @@ using namespace std; const string Logic::_lockPagePrefix = LOCKPAGE_PREFIX; -const string Logic::_fifoLocation = FIFO_LOCATION; const string Logic::_ldapServer = LDAP_SERVER; const string Logic::_bindDN = BINDDN; @@ -36,54 +30,14 @@ Logic::Logic() : _epaper(Epaper::get()) { srand(time(NULL)); - - _logger(LogLevel::debug, "Creating Fifo file"); - if (access(_fifoLocation.c_str(), F_OK) == 0) - { - _logger(LogLevel::warning, "Fifo file aready existing, trying to delete"); - if (unlink(_fifoLocation.c_str()) != 0) - { - throw("Unable to delete Fifo file"); - } - } - - umask(0); - - if (mkfifo(_fifoLocation.c_str(), 0770) != 0) - { - throw("Unable to create Fifo"); - } - - - _fifoHandle = open(_fifoLocation.c_str(), O_RDWR | O_NONBLOCK); - if (_fifoHandle == -1) - { - throw("Unable to open Fifo"); - } - - if (fchown(_fifoHandle, 0, 1001) != 0) - { - throw("Fifo chown failed"); - } - - _createNewToken(false); + createNewToken(false); } Logic::~Logic() { - if (_fifoHandle != -1) - { - close(_fifoHandle); - } - - _logger(LogLevel::debug, "Removing Fifo file"); - if (unlink(_fifoLocation.c_str()) != 0) - { - throw("Unable to delete Fifo file"); - } } -int Logic::_parseRequest(const string &str) +int Logic::parseRequest(const string &str) { _logger("Parsing request..."); Json::Reader reader; @@ -162,7 +116,7 @@ void Logic::_lock() } _door.lock(); _state = LOCKED; - _createNewToken(false); + createNewToken(false); } void Logic::_unlock() @@ -174,55 +128,7 @@ void Logic::_unlock() } _door.unlock(); _state = UNLOCKED; - _createNewToken(false); -} - -void Logic::run() -{ - struct timeval tv; - fd_set set; - - for (;;) - { - FD_ZERO(&set); - FD_SET(_fifoHandle, &set); - tv.tv_sec = _tokenTimeout; - tv.tv_usec = 0; - - int i = select(_fifoHandle+1, &set, nullptr, nullptr, &tv); - if (i == 0) - { - _createNewToken(true); - continue; - } else if (i == -1) { - throw "Fifo select() failed"; - } - - if (!FD_ISSET(_fifoHandle, &set)) - { - _logger(LogLevel::warning, "select(): Not my fd"); - continue; - } - - string payload; - for (;;) - { - constexpr int BUFSIZE = 2; - char tmp[BUFSIZE]; - i = read(_fifoHandle, tmp, BUFSIZE); - if (i > 0) { - payload += string(tmp, i); - } else { - if (errno == EWOULDBLOCK) - { - break; - } - throw "read() fifo failed"; - } - } - - int rc = _parseRequest(payload); - } + createNewToken(false); } bool Logic::_checkIP(const string &ip) @@ -292,7 +198,7 @@ out2: return retval; } -void Logic::_createNewToken(const bool stillValid) +void Logic::createNewToken(const bool stillValid) { _prevToken = _curToken; _prevValid = stillValid; diff --git a/logic.h b/logic.h index a7432ec..913ddd6 100644 --- a/logic.h +++ b/logic.h @@ -17,12 +17,12 @@ public: static Logic &get(); ~Logic(); - void run(); + int parseRequest(const std::string &str); + void createNewToken(const bool stillValid); private: Logic(); - int _parseRequest(const std::string &str); void _lock(); void _unlock(); @@ -31,7 +31,6 @@ private: bool _checkLDAP(const std::string &user, const std::string &password); bool _checkIP(const std::string &ip); - void _createNewToken(const bool stillValid); const Logger &_logger; Door &_door; @@ -50,8 +49,6 @@ private: const static std::string _ldapServer; const static std::string _allowedIpPrefix; - int _fifoHandle = {-1}; - static constexpr int _tokenTimeout = TOKEN_TIMEOUT; enum {LOCKED, UNLOCKED} _state = { LOCKED }; diff --git a/main.cpp b/main.cpp index 1e23569..765cfe4 100644 --- a/main.cpp +++ b/main.cpp @@ -2,8 +2,12 @@ #include #include +#include +#include +#include #include +#include "config.h" #include "logic.h" using namespace std; @@ -12,19 +16,115 @@ const static Logger &l = Logger::get(); int main(void) { + int retval = -1; + l(LogLevel::notice, "Starting doorlockd"); + int fifoHandle = -1; + + l(LogLevel::debug, "Creating Fifo file"); + if (access(FIFO_LOCATION, F_OK) == 0) + { + l(LogLevel::warning, "Fifo file aready existing, trying to delete"); + if (unlink(FIFO_LOCATION) != 0) + { + fprintf(stderr, "Unable to delete Fifo file"); + goto out; + } + } + + umask(0); + + if (mkfifo(FIFO_LOCATION, 0770) != 0) + { + fprintf(stderr, "Unable to create Fifo"); + goto out; + } + + fifoHandle = open(FIFO_LOCATION, O_RDWR | O_NONBLOCK); + if (fifoHandle == -1) + { + fprintf(stderr, "Unable to open Fifo"); + goto out; + } + + if (fchown(fifoHandle, 0, 1001) != 0) + { + fprintf(stderr, "Fifo chown failed"); + goto out1; + } + + try { Logic &logic = Logic::get(); - logic.run(); + struct timeval tv; + fd_set set; + + for (;;) + { + FD_ZERO(&set); + FD_SET(fifoHandle, &set); + tv.tv_sec = TOKEN_TIMEOUT; + tv.tv_usec = 0; + + int i = select(fifoHandle+1, &set, nullptr, nullptr, &tv); + if (i == 0) + { + logic.createNewToken(true); + continue; + } else if (i == -1) { + throw "Fifo select() failed"; + } + + if (!FD_ISSET(fifoHandle, &set)) + { + l(LogLevel::warning, "select(): Not my fd"); + continue; + } + + string payload; + for (;;) + { + constexpr int BUFSIZE = 2; + char tmp[BUFSIZE]; + i = read(fifoHandle, tmp, BUFSIZE); + if (i > 0) { + payload += string(tmp, i); + } else { + if (errno == EWOULDBLOCK) + { + break; + } + throw "read() fifo failed"; + } + } + + int rc = logic.parseRequest(payload); + } + + retval = 0; } catch (const char* const &ex) { ostringstream str; str << "FATAL ERROR: " << ex; l(str, LogLevel::error); + retval = -1; } +out1: + if (fifoHandle != -1) + { + close(fifoHandle); + } + + l(LogLevel::debug, "Removing Fifo file"); + if (unlink(FIFO_LOCATION) != 0) + { + throw("Unable to delete Fifo file"); + } + +out: Door::get().lock(); l(LogLevel::notice, "Doorlockd stopped"); - return 0; + return retval; }