xref: /netbsd-src/external/bsd/atf/dist/tools/env.cpp (revision 8dd45d8c41d94f9b7895d4c805be8744102a513e)
1d780102eSjmmv //
2d780102eSjmmv // Automated Testing Framework (atf)
3d780102eSjmmv //
4d780102eSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
5d780102eSjmmv // All rights reserved.
6d780102eSjmmv //
7d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8d780102eSjmmv // modification, are permitted provided that the following conditions
9d780102eSjmmv // are met:
10d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11d780102eSjmmv //    notice, this list of conditions and the following disclaimer.
12d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13d780102eSjmmv //    notice, this list of conditions and the following disclaimer in the
14d780102eSjmmv //    documentation and/or other materials provided with the distribution.
15d780102eSjmmv //
16d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d780102eSjmmv //
29d780102eSjmmv 
30d780102eSjmmv extern "C" {
31d780102eSjmmv #include <errno.h>
32d780102eSjmmv #include <stdlib.h>
33d780102eSjmmv #include <string.h>
34d780102eSjmmv }
35d780102eSjmmv 
36d780102eSjmmv #include <cassert>
37d780102eSjmmv 
38d780102eSjmmv #include "env.hpp"
39d780102eSjmmv #include "exceptions.hpp"
40d780102eSjmmv 
41d780102eSjmmv namespace impl = tools::env;
42d780102eSjmmv #define IMPL_NAME "tools::env"
43d780102eSjmmv 
44d780102eSjmmv // ------------------------------------------------------------------------
45d780102eSjmmv // Free functions.
46d780102eSjmmv // ------------------------------------------------------------------------
47d780102eSjmmv 
48d780102eSjmmv std::string
get(const std::string & name)49d780102eSjmmv impl::get(const std::string& name)
50d780102eSjmmv {
5167781324Schristos     const char *n =name.c_str();
5267781324Schristos     const char* val = getenv(n);
5367781324Schristos     if (val != NULL)
54d780102eSjmmv 	return val;
5567781324Schristos     if (strcmp(n, "PATH") == 0)
56*8dd45d8cSchristos 	return "/bin:/usr/bin:/sbin:/usr/sbin";
5767781324Schristos 
5867781324Schristos     throw tools::system_error(IMPL_NAME "::set",
5967781324Schristos 			    "Cannot get environment variable '" + name +
6067781324Schristos 			    "'", errno);
61d780102eSjmmv }
62d780102eSjmmv 
63d780102eSjmmv bool
has(const std::string & name)64d780102eSjmmv impl::has(const std::string& name)
65d780102eSjmmv {
66d780102eSjmmv     return getenv(name.c_str()) != NULL;
67d780102eSjmmv }
68d780102eSjmmv 
69d780102eSjmmv void
set(const std::string & name,const std::string & val)70d780102eSjmmv impl::set(const std::string& name, const std::string& val)
71d780102eSjmmv {
72d780102eSjmmv     if (setenv(name.c_str(), val.c_str(), 1) == -1)
73d780102eSjmmv         throw tools::system_error(IMPL_NAME "::set",
74d780102eSjmmv                                 "Cannot set environment variable '" + name +
75d780102eSjmmv                                 "' to '" + val + "'",
76d780102eSjmmv                                 errno);
77d780102eSjmmv }
78d780102eSjmmv 
79d780102eSjmmv void
unset(const std::string & name)80d780102eSjmmv impl::unset(const std::string& name)
81d780102eSjmmv {
82d780102eSjmmv     unsetenv(name.c_str());
83d780102eSjmmv }
84