]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/arguments.hh
Merge pull request #1200 from mind04/rfc1995
[thirdparty/pdns.git] / pdns / arguments.hh
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
6 it under the terms of the GNU General Public License version 2
7 as published by the Free Software Foundation
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.
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 St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22 #ifndef ARGUMENTS_HH
23 #define ARGUMENTS_HH
24
25 #include <map>
26 #include <set>
27 #include <string>
28 #include <vector>
29 #include <fstream>
30 #include <iostream>
31 #include "misc.hh"
32 #include "pdnsexception.hh"
33 #include <sys/types.h>
34 #include <pwd.h>
35 #include <grp.h>
36
37 #include "namespaces.hh"
38
39 typedef PDNSException ArgException;
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
77 class ArgvMap
78 {
79 public:
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 }
86 void preParse(int &argc, char **argv, const string &arg); //!< use this to preparse a single var
87 bool preParseFile(const char *fname, const string &arg, const string& theDefault=""); //!< use this to preparse a single var in configuration
88
89 bool file(const char *fname, bool lax=false); //!< Parses a file with parameters
90 bool file(const char *fname, bool lax, bool included);
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
99 mode_t asMode(const string &var); //!< return value interpreted as octal number
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
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
104 string &set(const string &, const string &); //!< Does the same but also allows one to specify a help message
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
108 string configstring(bool current=false); //!< generates the --mkconfig
109 bool contains(const string &var, const string &val);
110 bool isEmpty(const string &var); //!< checks if variable has value
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();
119 private:
120 void parseOne(const string &unparsed, const string &parseOnly="", bool lax=false);
121 typedef map<string,string> params_t;
122 params_t params;
123 map<string,string> helpmap;
124 map<string,string> d_typeMap;
125 vector<string> d_cmds;
126 std::set<string> d_cleared;
127 };
128
129 extern ArgvMap &arg();
130
131 #endif /* ARGUMENTS_HH */