diff options
author | Thomas Tsou <tom@tsou.cc> | 2013-07-30 18:47:30 +0200 |
---|---|---|
committer | Thomas Tsou <tom@tsou.cc> | 2013-10-18 13:04:13 -0400 |
commit | ddd6defb431ddca2d6f1293082fadcd7a044910a (patch) | |
tree | 46f595f93e5b6f2692610399c4ea687bc437f039 | |
parent | 96794cb7464c805ad1ac27810c9b107cf304410b (diff) |
Transceiver52M: Verify global config sanity before using
The configuration table is instantiated as a global variable with
no means to check constructor status. This means various types
of database failure conditions (e.g. file existence, permissions,
etc.) are not reported. This patch performs a small number of
checks to make sure that the configuration is sane.
Signed-off-by: Thomas Tsou <tom@tsou.cc>
-rw-r--r-- | Transceiver52M/runTransceiver.cpp | 73 |
1 files changed, 65 insertions, 8 deletions
diff --git a/Transceiver52M/runTransceiver.cpp b/Transceiver52M/runTransceiver.cpp index 9301d3d..dc2ebc6 100644 --- a/Transceiver52M/runTransceiver.cpp +++ b/Transceiver52M/runTransceiver.cpp @@ -36,22 +36,73 @@ #include <Logger.h> #include <Configuration.h> -using namespace std; +#define CONFIGDB "/etc/OpenBTS/OpenBTS.db" -ConfigurationTable gConfig("/etc/OpenBTS/OpenBTS.db"); +using namespace std; +ConfigurationTable gConfig(CONFIGDB); volatile bool gbShutdown = false; + static void ctrlCHandler(int signo) { cout << "Received shutdown signal" << endl;; gbShutdown = true; } +/* + * Attempt to open and test the database file before + * accessing the configuration table. We do this because + * the global table constructor cannot provide notification + * in the event of failure. + */ +int testConfig(const char *filename) +{ + int rc, val = 9999; + sqlite3 *db; + std::string test = "sadf732zdvj2"; + + const char *keys[3] = { + "Log.Level", + "TRX.Port", + "TRX.IP", + }; + + /* Try to open the database */ + rc = sqlite3_open(filename, &db); + if (rc || !db) { + std::cerr << "Config: Database could not be opened" << std::endl; + return -1; + } else { + sqlite3_close(db); + } + + /* Attempt to set a value in the global config */ + if (!gConfig.set(test, val)) { + std::cerr << "Config: Failed to set test key - " + << "permission to access the database?" << std::endl; + return -1; + } else { + gConfig.remove(test); + } + + /* Attempt to query */ + for (int i = 0; i < 3; i++) { + try { + gConfig.getStr(keys[i]); + } catch (...) { + std::cerr << "Config: Failed query on " << keys[i] << std::endl; + return -1; + } + } + + return 0; +} int main(int argc, char *argv[]) { - std::string deviceArgs; + int trxPort; + std::string deviceArgs, logLevel, trxAddr; if (argc == 3) { @@ -73,12 +124,17 @@ int main(int argc, char *argv[]) cerr << "Couldn't install signal handler for SIGTERM" << endl; exit(1); } - // Configure logger. - gLogInit("transceiver",gConfig.getStr("Log.Level").c_str(),LOG_LOCAL7); - int numARFCN=1; + // Configure logger. + if (testConfig(CONFIGDB) < 0) { + std::cerr << "Config: Database failure" << std::endl; + return EXIT_FAILURE; + } - LOG(NOTICE) << "starting transceiver with " << numARFCN << " ARFCNs (argc=" << argc << ")"; + logLevel = gConfig.getStr("Log.Level"); + trxPort = gConfig.getNum("TRX.Port"); + trxAddr = gConfig.getStr("TRX.IP"); + gLogInit("transceiver", logLevel.c_str(), LOG_LOCAL7); srandom(time(NULL)); @@ -102,7 +158,8 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - Transceiver *trx = new Transceiver(gConfig.getNum("TRX.Port"),gConfig.getStr("TRX.IP").c_str(),SAMPSPERSYM,GSM::Time(3,0),radio); + Transceiver *trx = new Transceiver(trxPort, trxAddr.c_str(), + SAMPSPERSYM, GSM::Time(3,0), radio); trx->receiveFIFO(radio->receiveFIFO()); trx->start(); |