]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/arguments.hh
Merge branch 'master' of https://github.com/i-maravic/pdns into i-maravic-master
[thirdparty/pdns.git] / pdns / arguments.hh
CommitLineData
12c86877
BH
1/*
2 PowerDNS Versatile Database Driven Nameserver
3 Copyright (C) 2002 PowerDNS.COM BV
4
5 This program is free software; you can redistribute it and/or modify
22dc646a
BH
6 it under the terms of the GNU General Public License version 2
7 as published by the Free Software Foundation
f782fe38
MH
8
9 Additionally, the license of this program contains a special
10 exception which allows to distribute the program in binary form when
11 it is linked against OpenSSL.
12c86877
BH
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
06bd9ccf 20 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
12c86877
BH
21*/
22#ifndef ARGUMENTS_HH
23#define ARGUMENTS_HH
24
25#include <map>
58a57699 26#include <set>
12c86877
BH
27#include <string>
28#include <vector>
eefd15f9
BH
29#include <fstream>
30#include <iostream>
31#include "misc.hh"
5c409fa2 32#include "pdnsexception.hh"
76473b92
KM
33#include <sys/types.h>
34#include <pwd.h>
35#include <grp.h>
12c86877 36
10f4eea8 37#include "namespaces.hh"
12c86877 38
3f81d239 39typedef PDNSException ArgException;
12c86877
BH
40
41/** This class helps parsing argc and argv into a map of parameters. We have 3 kinds of formats:
42
43
44 -w this leads to a key/value pair of "w"/void
45
46 --port=25 "port"/"25"
47
48 --daemon "daemon"/void
49
50 We do not support "--port 25" syntax.
51
52 It can also read from a file. This file can contain '#' to delimit comments.
53
54 Some sample code:
55
56 \code
57
58 ArgvMap R;
59
60 R.set("port")="25"; // use this to specify default parameters
61 R.file("./default.conf"); // parse configuration file
62
63 R.parse(argc, argv); // read the arguments from main()
64
65 cout<<"Will we be a deamon?: "<<R.isset("daemon")<<endl;
66 cout<<"Our port will be "<<R["port"]<<endl;
67
68 map<string,string>::const_iterator i;
69 cout<<"via iterator"<<endl;
70 for(i=R.begin();i!=R.end();i++)
71 cout<<i->first<<"="<<i->second<<endl;
72 \endcode
73*/
74
75
76
77class ArgvMap
78{
79public:
80 ArgvMap();
81 void parse(int &argc, char **argv, bool lax=false); //!< use this to parse from argc and argv
82 void laxParse(int &argc, char **argv) //!< use this to parse from argc and argv
83 {
84 parse(argc,argv,true);
85 }
fd4b10f7 86 void preParse(int &argc, char **argv, const string &arg); //!< use this to preparse a single var
f64de501 87 bool preParseFile(const char *fname, const string &arg, const string& theDefault=""); //!< use this to preparse a single var in configuration
12c86877
BH
88
89 bool file(const char *fname, bool lax=false); //!< Parses a file with parameters
4f6ef75f 90 bool file(const char *fname, bool lax, bool included);
12c86877
BH
91 bool laxFile(const char *fname)
92 {
93 return file(fname,true);
94 }
95 typedef map<string,string> param_t; //!< use this if you need to know the content of the map
96 bool parmIsset(const string &var); //!< Checks if a parameter is set to *a* value
97 bool mustDo(const string &var); //!< if a switch is given, if we must do something (--help)
98 int asNum(const string &var); //!< return a variable value as a number
abc1d928 99 mode_t asMode(const string &var); //<!< return value interpreted as octal number
cc2978dc
BH
100 uid_t asUid(const string &var); //!< return user id, resolves if necessary
101 gid_t asGid(const string &var); //!< return group id, resolves if necessary
12c86877
BH
102 double asDouble(const string &var); //!< return a variable value as a number
103 string &set(const string &); //!< Gives a writable reference and allocates space for it
7bb72d73 104 string &set(const string &, const string &); //!< Does the same but also allows one to specify a help message
12c86877
BH
105 void setCmd(const string &, const string &); //!< Add a command flag
106 string &setSwitch(const string &, const string &); //!< Add a command flag
107 string helpstring(string prefix=""); //!< generates the --help
6bef3d91 108 string configstring(bool current=false); //!< generates the --mkconfig
12c86877 109 bool contains(const string &var, const string &val);
cc2978dc 110 bool isEmpty(const string &var); //<! checks if variable has value
12c86877
BH
111
112 vector<string>list();
113 string getHelp(const string &item);
114
115 const param_t::const_iterator begin(); //!< iterator semantics
116 const param_t::const_iterator end(); //!< iterator semantics
117 const string &operator[](const string &); //!< iterator semantics
118 const vector<string>&getCommands();
119private:
120 void parseOne(const string &unparsed, const string &parseOnly="", bool lax=false);
102eb646
BH
121 typedef map<string,string> params_t;
122 params_t params;
12c86877
BH
123 map<string,string> helpmap;
124 map<string,string> d_typeMap;
125 vector<string> d_cmds;
58a57699 126 std::set<string> d_cleared;
12c86877
BH
127};
128
129extern ArgvMap &arg();
130
131#endif /* ARGUMENTS_HH */