xref: /netbsd-src/external/bsd/atf/dist/tools/atf-config.cpp (revision ad23a81712ef29f8911becbb5b5ca2aee6441b2a)
197bff204Sjmmv //
297bff204Sjmmv // Automated Testing Framework (atf)
397bff204Sjmmv //
497bff204Sjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
597bff204Sjmmv // All rights reserved.
697bff204Sjmmv //
797bff204Sjmmv // Redistribution and use in source and binary forms, with or without
897bff204Sjmmv // modification, are permitted provided that the following conditions
997bff204Sjmmv // are met:
1097bff204Sjmmv // 1. Redistributions of source code must retain the above copyright
1197bff204Sjmmv //    notice, this list of conditions and the following disclaimer.
1297bff204Sjmmv // 2. Redistributions in binary form must reproduce the above copyright
1397bff204Sjmmv //    notice, this list of conditions and the following disclaimer in the
1497bff204Sjmmv //    documentation and/or other materials provided with the distribution.
1597bff204Sjmmv //
1697bff204Sjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
1797bff204Sjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
1897bff204Sjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1997bff204Sjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2097bff204Sjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
2197bff204Sjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2297bff204Sjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
2397bff204Sjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2497bff204Sjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2597bff204Sjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2697bff204Sjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2797bff204Sjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2897bff204Sjmmv //
2997bff204Sjmmv 
3097bff204Sjmmv #include <cstdlib>
3197bff204Sjmmv #include <iostream>
3297bff204Sjmmv #include <map>
3397bff204Sjmmv #include <string>
3497bff204Sjmmv 
3597bff204Sjmmv #include "application.hpp"
3697bff204Sjmmv #include "config.hpp"
3797bff204Sjmmv 
3897bff204Sjmmv class atf_config : public tools::application::app {
3997bff204Sjmmv     static const char* m_description;
4097bff204Sjmmv 
4197bff204Sjmmv     bool m_tflag;
4297bff204Sjmmv 
4397bff204Sjmmv     void process_option(int, const char*);
4497bff204Sjmmv     std::string specific_args(void) const;
4597bff204Sjmmv     options_set specific_options(void) const;
4697bff204Sjmmv 
4797bff204Sjmmv     std::string format_var(const std::string&, const std::string&);
4897bff204Sjmmv 
4997bff204Sjmmv public:
5097bff204Sjmmv     atf_config(void);
5197bff204Sjmmv 
5297bff204Sjmmv     int main(void);
5397bff204Sjmmv };
5497bff204Sjmmv 
5597bff204Sjmmv const char* atf_config::m_description =
5697bff204Sjmmv     "atf-config is a tool that queries the value of several "
5797bff204Sjmmv     "installation-specific configuration values of the atf.  "
5897bff204Sjmmv     "It can be used by external tools to discover where specific "
5997bff204Sjmmv     "internal atf files are installed.";
6097bff204Sjmmv 
atf_config(void)6197bff204Sjmmv atf_config::atf_config(void) :
6297bff204Sjmmv     app(m_description, "atf-config(1)", "atf(7)"),
6397bff204Sjmmv     m_tflag(false)
6497bff204Sjmmv {
6597bff204Sjmmv }
6697bff204Sjmmv 
6797bff204Sjmmv void
process_option(int ch,const char * arg)68*ad23a817Sjmmv atf_config::process_option(int ch, const char* arg __attribute__((__unused__)))
6997bff204Sjmmv {
7097bff204Sjmmv     switch (ch) {
7197bff204Sjmmv     case 't':
7297bff204Sjmmv         m_tflag = true;
7397bff204Sjmmv         break;
7497bff204Sjmmv 
7597bff204Sjmmv     default:
7697bff204Sjmmv         std::abort();
7797bff204Sjmmv     }
7897bff204Sjmmv }
7997bff204Sjmmv 
8097bff204Sjmmv std::string
specific_args(void) const8197bff204Sjmmv atf_config::specific_args(void)
8297bff204Sjmmv     const
8397bff204Sjmmv {
8497bff204Sjmmv     return "[var1 [.. varN]]";
8597bff204Sjmmv }
8697bff204Sjmmv 
8797bff204Sjmmv atf_config::options_set
specific_options(void) const8897bff204Sjmmv atf_config::specific_options(void)
8997bff204Sjmmv     const
9097bff204Sjmmv {
9197bff204Sjmmv     using tools::application::option;
9297bff204Sjmmv     options_set opts;
9397bff204Sjmmv     opts.insert(option('t', "", "Terse output: show values only"));
9497bff204Sjmmv     return opts;
9597bff204Sjmmv }
9697bff204Sjmmv 
9797bff204Sjmmv std::string
format_var(const std::string & name,const std::string & val)9897bff204Sjmmv atf_config::format_var(const std::string& name, const std::string& val)
9997bff204Sjmmv {
10097bff204Sjmmv     std::string str;
10197bff204Sjmmv 
10297bff204Sjmmv     if (m_tflag)
10397bff204Sjmmv         str = val;
10497bff204Sjmmv     else
10597bff204Sjmmv         str = name + " : " + val;
10697bff204Sjmmv 
10797bff204Sjmmv     return str;
10897bff204Sjmmv }
10997bff204Sjmmv 
11097bff204Sjmmv int
main(void)11197bff204Sjmmv atf_config::main(void)
11297bff204Sjmmv {
11397bff204Sjmmv     if (m_argc < 1) {
11497bff204Sjmmv         std::map< std::string, std::string > cv = tools::config::get_all();
11597bff204Sjmmv 
11697bff204Sjmmv         for (std::map< std::string, std::string >::const_iterator iter =
11797bff204Sjmmv              cv.begin(); iter != cv.end(); iter++)
11897bff204Sjmmv             std::cout << format_var((*iter).first, (*iter).second) << "\n";
11997bff204Sjmmv     } else {
12097bff204Sjmmv         for (int i = 0; i < m_argc; i++) {
12197bff204Sjmmv             if (!tools::config::has(m_argv[i]))
12297bff204Sjmmv                 throw std::runtime_error(std::string("Unknown variable `") +
12397bff204Sjmmv                                          m_argv[i] + "'");
12497bff204Sjmmv         }
12597bff204Sjmmv 
12697bff204Sjmmv         for (int i = 0; i < m_argc; i++) {
12797bff204Sjmmv             std::cout << format_var(m_argv[i], tools::config::get(m_argv[i]))
12897bff204Sjmmv                       << "\n";
12997bff204Sjmmv         }
13097bff204Sjmmv     }
13197bff204Sjmmv 
13297bff204Sjmmv     return EXIT_SUCCESS;
13397bff204Sjmmv }
13497bff204Sjmmv 
13597bff204Sjmmv int
main(int argc,char * const * argv)13697bff204Sjmmv main(int argc, char* const* argv)
13797bff204Sjmmv {
13897bff204Sjmmv     return atf_config().run(argc, argv);
13997bff204Sjmmv }
140