114fc6011Sjmmv //
214fc6011Sjmmv // Automated Testing Framework (atf)
314fc6011Sjmmv //
414fc6011Sjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
514fc6011Sjmmv // All rights reserved.
614fc6011Sjmmv //
714fc6011Sjmmv // Redistribution and use in source and binary forms, with or without
814fc6011Sjmmv // modification, are permitted provided that the following conditions
914fc6011Sjmmv // are met:
1014fc6011Sjmmv // 1. Redistributions of source code must retain the above copyright
1114fc6011Sjmmv //    notice, this list of conditions and the following disclaimer.
1214fc6011Sjmmv // 2. Redistributions in binary form must reproduce the above copyright
1314fc6011Sjmmv //    notice, this list of conditions and the following disclaimer in the
1414fc6011Sjmmv //    documentation and/or other materials provided with the distribution.
1514fc6011Sjmmv //
1614fc6011Sjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
1714fc6011Sjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
1814fc6011Sjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1914fc6011Sjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2014fc6011Sjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
2114fc6011Sjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2214fc6011Sjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
2314fc6011Sjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2414fc6011Sjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2514fc6011Sjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2614fc6011Sjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2714fc6011Sjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2814fc6011Sjmmv //
2914fc6011Sjmmv 
3014fc6011Sjmmv #include <cstdlib>
3114fc6011Sjmmv #include <iostream>
3214fc6011Sjmmv #include <map>
3314fc6011Sjmmv #include <string>
3414fc6011Sjmmv 
3514fc6011Sjmmv #include "application.hpp"
3614fc6011Sjmmv #include "config.hpp"
3714fc6011Sjmmv 
3814fc6011Sjmmv class atf_config : public tools::application::app {
3914fc6011Sjmmv     static const char* m_description;
4014fc6011Sjmmv 
4114fc6011Sjmmv     bool m_tflag;
4214fc6011Sjmmv 
4314fc6011Sjmmv     void process_option(int, const char*);
4414fc6011Sjmmv     std::string specific_args(void) const;
4514fc6011Sjmmv     options_set specific_options(void) const;
4614fc6011Sjmmv 
4714fc6011Sjmmv     std::string format_var(const std::string&, const std::string&);
4814fc6011Sjmmv 
4914fc6011Sjmmv public:
5014fc6011Sjmmv     atf_config(void);
5114fc6011Sjmmv 
5214fc6011Sjmmv     int main(void);
5314fc6011Sjmmv };
5414fc6011Sjmmv 
5514fc6011Sjmmv const char* atf_config::m_description =
5614fc6011Sjmmv     "atf-config is a tool that queries the value of several "
5714fc6011Sjmmv     "installation-specific configuration values of the atf.  "
5814fc6011Sjmmv     "It can be used by external tools to discover where specific "
5914fc6011Sjmmv     "internal atf files are installed.";
6014fc6011Sjmmv 
atf_config(void)6114fc6011Sjmmv atf_config::atf_config(void) :
6214fc6011Sjmmv     app(m_description, "atf-config(1)", "atf(7)"),
6314fc6011Sjmmv     m_tflag(false)
6414fc6011Sjmmv {
6514fc6011Sjmmv }
6614fc6011Sjmmv 
6714fc6011Sjmmv void
process_option(int ch,const char * arg)68*de996de9Sjmmv atf_config::process_option(int ch, const char* arg __attribute__((__unused__)))
6914fc6011Sjmmv {
7014fc6011Sjmmv     switch (ch) {
7114fc6011Sjmmv     case 't':
7214fc6011Sjmmv         m_tflag = true;
7314fc6011Sjmmv         break;
7414fc6011Sjmmv 
7514fc6011Sjmmv     default:
7614fc6011Sjmmv         std::abort();
7714fc6011Sjmmv     }
7814fc6011Sjmmv }
7914fc6011Sjmmv 
8014fc6011Sjmmv std::string
specific_args(void) const8114fc6011Sjmmv atf_config::specific_args(void)
8214fc6011Sjmmv     const
8314fc6011Sjmmv {
8414fc6011Sjmmv     return "[var1 [.. varN]]";
8514fc6011Sjmmv }
8614fc6011Sjmmv 
8714fc6011Sjmmv atf_config::options_set
specific_options(void) const8814fc6011Sjmmv atf_config::specific_options(void)
8914fc6011Sjmmv     const
9014fc6011Sjmmv {
9114fc6011Sjmmv     using tools::application::option;
9214fc6011Sjmmv     options_set opts;
9314fc6011Sjmmv     opts.insert(option('t', "", "Terse output: show values only"));
9414fc6011Sjmmv     return opts;
9514fc6011Sjmmv }
9614fc6011Sjmmv 
9714fc6011Sjmmv std::string
format_var(const std::string & name,const std::string & val)9814fc6011Sjmmv atf_config::format_var(const std::string& name, const std::string& val)
9914fc6011Sjmmv {
10014fc6011Sjmmv     std::string str;
10114fc6011Sjmmv 
10214fc6011Sjmmv     if (m_tflag)
10314fc6011Sjmmv         str = val;
10414fc6011Sjmmv     else
10514fc6011Sjmmv         str = name + " : " + val;
10614fc6011Sjmmv 
10714fc6011Sjmmv     return str;
10814fc6011Sjmmv }
10914fc6011Sjmmv 
11014fc6011Sjmmv int
main(void)11114fc6011Sjmmv atf_config::main(void)
11214fc6011Sjmmv {
11314fc6011Sjmmv     if (m_argc < 1) {
11414fc6011Sjmmv         std::map< std::string, std::string > cv = tools::config::get_all();
11514fc6011Sjmmv 
11614fc6011Sjmmv         for (std::map< std::string, std::string >::const_iterator iter =
11714fc6011Sjmmv              cv.begin(); iter != cv.end(); iter++)
11814fc6011Sjmmv             std::cout << format_var((*iter).first, (*iter).second) << "\n";
11914fc6011Sjmmv     } else {
12014fc6011Sjmmv         for (int i = 0; i < m_argc; i++) {
12114fc6011Sjmmv             if (!tools::config::has(m_argv[i]))
12214fc6011Sjmmv                 throw std::runtime_error(std::string("Unknown variable `") +
12314fc6011Sjmmv                                          m_argv[i] + "'");
12414fc6011Sjmmv         }
12514fc6011Sjmmv 
12614fc6011Sjmmv         for (int i = 0; i < m_argc; i++) {
12714fc6011Sjmmv             std::cout << format_var(m_argv[i], tools::config::get(m_argv[i]))
12814fc6011Sjmmv                       << "\n";
12914fc6011Sjmmv         }
13014fc6011Sjmmv     }
13114fc6011Sjmmv 
13214fc6011Sjmmv     return EXIT_SUCCESS;
13314fc6011Sjmmv }
13414fc6011Sjmmv 
13514fc6011Sjmmv int
main(int argc,char * const * argv)13614fc6011Sjmmv main(int argc, char* const* argv)
13714fc6011Sjmmv {
13814fc6011Sjmmv     return atf_config().run(argc, argv);
13914fc6011Sjmmv }
140