]>
Commit | Line | Data |
---|---|---|
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 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 daemon?: "<<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 | bool parseFile(const char *fname, const string& arg, bool lax); //<! parse one line | |
96 | typedef map<string,string> param_t; //!< use this if you need to know the content of the map | |
97 | bool parmIsset(const string &var); //!< Checks if a parameter is set to *a* value | |
98 | bool mustDo(const string &var); //!< if a switch is given, if we must do something (--help) | |
99 | int asNum(const string &var, int def=0); //!< return a variable value as a number or the default if the variable is empty | |
100 | mode_t asMode(const string &var); //!< return value interpreted as octal number | |
101 | uid_t asUid(const string &var); //!< return user id, resolves if necessary | |
102 | gid_t asGid(const string &var); //!< return group id, resolves if necessary | |
103 | double asDouble(const string &var); //!< return a variable value as a number | |
104 | string &set(const string &); //!< Gives a writable reference and allocates space for it | |
105 | string &set(const string &, const string &); //!< Does the same but also allows one to specify a help message | |
106 | void setCmd(const string &, const string &); //!< Add a command flag | |
107 | string &setSwitch(const string &, const string &); //!< Add a command flag | |
108 | string helpstring(string prefix=""); //!< generates the --help | |
109 | string configstring(bool current=false); //!< generates the --mkconfig | |
110 | bool contains(const string &var, const string &val); | |
111 | bool isEmpty(const string &var); //!< checks if variable has value | |
112 | ||
113 | vector<string>list(); | |
114 | string getHelp(const string &item); | |
115 | ||
116 | const param_t::const_iterator begin(); //!< iterator semantics | |
117 | const param_t::const_iterator end(); //!< iterator semantics | |
118 | const string &operator[](const string &); //!< iterator semantics | |
119 | const vector<string>&getCommands(); | |
120 | void gatherIncludes(std::vector<std::string> &extraConfigs); | |
121 | private: | |
122 | void parseOne(const string &unparsed, const string &parseOnly="", bool lax=false); | |
123 | typedef map<string,string> params_t; | |
124 | params_t params; | |
125 | map<string,string> helpmap; | |
126 | map<string,string> d_typeMap; | |
127 | vector<string> d_cmds; | |
128 | std::set<string> d_cleared; | |
129 | }; | |
130 | ||
131 | extern ArgvMap &arg(); | |
132 | ||
133 | #endif /* ARGUMENTS_HH */ |