int infd = 0, outfd = 1;
DynListener dlg(g_programname);
- dlg.registerFunc("QUIT", &DLQuitHandler, "quit daemon");
- dlg.registerFunc("CYCLE", &DLCycleHandler, "restart instance");
- dlg.registerFunc("PING", &DLPingHandler, "ping guardian");
- dlg.registerFunc("STATUS", &DLStatusHandler, "get instance status from guardian");
- dlg.registerRestFunc(&DLRestHandler);
+ DynListener::registerExitFunc("QUIT", &DLQuitHandler);
+ DynListener::registerFunc("CYCLE", &DLCycleHandler, "restart instance");
+ DynListener::registerFunc("PING", &DLPingHandler, "ping guardian");
+ DynListener::registerFunc("STATUS", &DLStatusHandler, "get instance status from guardian");
+ DynListener::registerRestFunc(&DLRestHandler);
dlg.go();
string progname = argv[0];
}
DynListener::registerFunc("SHOW", &DLShowHandler, "show a specific statistic or * to get a list", "<statistic>");
DynListener::registerFunc("RPING", &DLPingHandler, "ping instance");
- DynListener::registerFunc("QUIT", &DLRQuitHandler, "quit daemon");
+ DynListener::registerExitFunc("QUIT", &DLRQuitHandler);
DynListener::registerFunc("UPTIME", &DLUptimeHandler, "get instance uptime");
DynListener::registerFunc("NOTIFY-HOST", &DLNotifyHostHandler, "notify host for specific zone", "<zone> <host>");
DynListener::registerFunc("NOTIFY", &DLNotifyHandler, "queue a notification", "<zone>");
#include <netinet/in.h>
#include <iostream>
#include <sstream>
-#include <sys/types.h>
#include <csignal>
#include <sys/stat.h>
#include <fcntl.h>
-#include <unistd.h>
-#include <boost/algorithm/string.hpp>
#include <thread>
#include "misc.hh"
DynListener::g_funkdb_t DynListener::s_funcdb;
DynListener::g_funk_t* DynListener::s_restfunc;
+std::string DynListener::s_exitfuncname;
DynListener::~DynListener()
{
}
if (len == 0) {
- throw PDNSException("Guardian exited - going down as well");
+ // File descriptor has been closed. We translate this into an exit
+ // request, but if it did not succeed and we are back attempting to
+ // read data, there's not much we can do but throw up.
+ static bool firstTime = true;
+ if (!firstTime) {
+ throw PDNSException("Guardian exited - going down as well");
+ }
+ firstTime = false;
}
if (static_cast<size_t>(len) == mesg.size()) {
}
}
+void DynListener::registerExitFunc(const string &name, g_funk_t *gf) // NOLINT(readability-identifier-length)
+{
+ g_funkwithusage_t funk = {gf, "", "quit daemon"};
+ s_exitfuncname = name;
+ s_funcdb[s_exitfuncname] = std::move(funk);
+}
+
void DynListener::registerFunc(const string &name, g_funk_t *gf, const string &usage, const string &args)
{
g_funkwithusage_t e = {gf, args, usage};
for(;;) {
string line=getLine();
+ if (line.empty()) {
+ line = s_exitfuncname;
+ }
boost::trim_right(line);
vector<string>parts;
typedef struct { g_funk_t *func; string args; string usage; } g_funkwithusage_t;
typedef map<string,g_funkwithusage_t> g_funkdb_t;
+ static void registerExitFunc(const string &name, g_funk_t *gf);
static void registerFunc(const string &name, g_funk_t *gf, const string &usage="", const string &args="");
static void registerRestFunc(g_funk_t *gf);
static g_funk_t* getFunc(const string& fname) { return s_funcdb[fname].func; }
ComboAddress d_socketaddress;
static g_funkdb_t s_funcdb;
static g_funk_t* s_restfunc;
+ static string s_exitfuncname;
bool testLive(const string& fname);
};