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