]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dynlistener.hh
Merge pull request #4319 from pieterlexis/pipe-SERVFAIL-on-FAIL
[thirdparty/pdns.git] / pdns / dynlistener.hh
1 /*
2 * This file is part of PowerDNS or dnsdist.
3 * Copyright -- PowerDNS.COM B.V. and its contributors
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * In addition, for the avoidance of any doubt, permission is granted to
10 * link this program with OpenSSL and to (re)distribute the binaries
11 * produced as the result of such linking.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22 #ifndef PDNS_DYNLISTENER
23 #define PDNS_DYNLISTENER
24
25 #include <string>
26 #include <vector>
27 #include <pthread.h>
28 #include <sys/types.h>
29 #include <errno.h>
30 #include <iostream>
31 #include <sstream>
32 #include "iputils.hh"
33 #include <boost/utility.hpp>
34 #include <unistd.h>
35 #include <sys/un.h>
36 #include <dlfcn.h>
37 #include <sys/socket.h>
38 #include <netinet/in.h>
39
40 #include "namespaces.hh"
41
42 class DynListener : public boost::noncopyable
43 {
44 public:
45 explicit DynListener(const string &pname="");
46 explicit DynListener(const ComboAddress& addr);
47 ~DynListener();
48 void go();
49 void theListener();
50 static void *theListenerHelper(void *p);
51
52 typedef string g_funk_t(const vector<string> &parts, Utility::pid_t ppid); // guido!
53 typedef struct { g_funk_t *func; string args; string usage; } g_funkwithusage_t;
54 typedef map<string,g_funkwithusage_t> g_funkdb_t;
55
56 static void registerFunc(const string &name, g_funk_t *gf, const string &usage="", const string &args="");
57 static void registerRestFunc(g_funk_t *gf);
58 static g_funk_t* getFunc(const string& fname) { return s_funcdb[fname].func; }
59 private:
60 void sendlines(const string &lines);
61 string getHelp();
62 string getLine();
63
64 void listenOnUnixDomain(const std::string& fname);
65 void listenOnTCP(const ComboAddress&);
66 void createSocketAndBind(int family, struct sockaddr*local, size_t len);
67
68 NetmaskGroup d_tcprange;
69 int d_s;
70 int d_client;
71 pthread_t d_tid;
72 bool d_nonlocal;
73 bool d_tcp;
74 pid_t d_ppid;
75
76 string d_socketname;
77 ComboAddress d_socketaddress;
78 static g_funkdb_t s_funcdb;
79 static g_funk_t* s_restfunc;
80 bool testLive(const string& fname);
81 };
82 #endif /* PDNS_DYNLISTENER */