diff --git a/configfileparser.cpp b/configfileparser.cpp index 50cad2f..f68f475 100644 --- a/configfileparser.cpp +++ b/configfileparser.cpp @@ -104,6 +104,7 @@ ConfigFileParser::ConfigFileParser(const std::string &path) : validKeys.insert("mosquitto_password_file"); validKeys.insert("mosquitto_acl_file"); validKeys.insert("allow_anonymous"); + validKeys.insert("rlimit_nofile"); validListenKeys.insert("port"); validListenKeys.insert("protocol"); @@ -379,6 +380,16 @@ void ConfigFileParser::loadFile(bool test) bool tmp = stringTruthiness(value); tmpSettings->allowAnonymous = tmp; } + + if (key == "rlimit_nofile") + { + int newVal = std::stoi(value); + if (newVal <= 0) + { + throw ConfigFileException(formatString("Value '%d' is negative.", newVal)); + } + tmpSettings->rlimitNoFile = newVal; + } } } catch (std::invalid_argument &ex) // catch for the stoi() diff --git a/mainapp.cpp b/mainapp.cpp index e9f296b..2b00eae 100644 --- a/mainapp.cpp +++ b/mainapp.cpp @@ -644,13 +644,14 @@ void MainApp::quit() } -void MainApp::setlimits(rlim_t nofile) +void MainApp::setlimits() { - logger->logf(LOG_INFO, "Setting ulimit nofile to %ld. TODO: configurable in config file.", nofile); + rlim_t nofile = settings->rlimitNoFile; + logger->logf(LOG_INFO, "Setting rlimit nofile to %ld.", nofile); struct rlimit v = { nofile, nofile }; if (setrlimit(RLIMIT_NOFILE, &v) < 0) { - logger->logf(LOG_ERR, "Setting ulimit nofile failed: %s. This means the default is used.", strerror(errno)); + logger->logf(LOG_ERR, "Setting ulimit nofile failed: '%s'. This means the default is used.", strerror(errno)); } } @@ -682,7 +683,7 @@ void MainApp::loadConfig() logger->reOpen(); logger->setFlags(settings->logDebug, settings->logSubscriptions); - setlimits(1000000); + setlimits(); for (std::shared_ptr &l : this->listeners) { diff --git a/mainapp.h b/mainapp.h index 24fefce..d290b9c 100644 --- a/mainapp.h +++ b/mainapp.h @@ -67,7 +67,7 @@ class MainApp Logger *logger = Logger::getInstance(); - void setlimits(rlim_t nofile); + void setlimits(); void loadConfig(); void reloadConfig(); static void doHelp(const char *arg); diff --git a/settings.h b/settings.h index 55839d3..006a5d5 100644 --- a/settings.h +++ b/settings.h @@ -45,6 +45,7 @@ public: std::string mosquittoPasswordFile; std::string mosquittoAclFile; bool allowAnonymous = false; + int rlimitNoFile = 1000000; std::list> listeners; // Default one is created later, when none are defined. AuthOptCompatWrap &getAuthOptsCompat();