]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/dynlistener.hh
Merge pull request #5461 from rgacogne/rec-cache-index
[thirdparty/pdns.git] / pdns / dynlistener.hh
CommitLineData
12c86877 1/*
12471842
PL
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 */
12c86877
BH
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>
040712e0
BH
32#include "iputils.hh"
33#include <boost/utility.hpp>
cc3afe25
BH
34#include <unistd.h>
35#include <sys/un.h>
36#include <dlfcn.h>
cc3afe25
BH
37#include <sys/socket.h>
38#include <netinet/in.h>
cc3afe25 39
10f4eea8 40#include "namespaces.hh"
12c86877 41
040712e0 42class DynListener : public boost::noncopyable
12c86877
BH
43{
44public:
040712e0
BH
45 explicit DynListener(const string &pname="");
46 explicit DynListener(const ComboAddress& addr);
e5d684f9 47 ~DynListener();
12c86877
BH
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!
3c90953e
PD
53 typedef struct { g_funk_t *func; string args; string usage; } g_funkwithusage_t;
54 typedef map<string,g_funkwithusage_t> g_funkdb_t;
12c86877 55
3c90953e 56 static void registerFunc(const string &name, g_funk_t *gf, const string &usage="", const string &args="");
040712e0 57 static void registerRestFunc(g_funk_t *gf);
d267d1bf 58 static g_funk_t* getFunc(const string& fname) { return s_funcdb[fname].func; }
12c86877 59private:
e37300dc 60 void sendlines(const string &lines);
3c90953e 61 string getHelp();
cc3afe25
BH
62 string getLine();
63
040712e0
BH
64 void listenOnUnixDomain(const std::string& fname);
65 void listenOnTCP(const ComboAddress&);
66 void createSocketAndBind(int family, struct sockaddr*local, size_t len);
67
040712e0 68 NetmaskGroup d_tcprange;
12c86877 69 int d_s;
cc3afe25 70 int d_client;
12c86877 71 pthread_t d_tid;
040712e0
BH
72 bool d_nonlocal;
73 bool d_tcp;
12c86877
BH
74 pid_t d_ppid;
75
e5d684f9 76 string d_socketname;
040712e0
BH
77 ComboAddress d_socketaddress;
78 static g_funkdb_t s_funcdb;
79 static g_funk_t* s_restfunc;
ce19a815 80 bool testLive(const string& fname);
12c86877
BH
81};
82#endif /* PDNS_DYNLISTENER */