1*0677dfd1SJulio Merino /* Copyright (c) 2007 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar * All rights reserved.
3c243e490SMarcel Moolenaar *
4c243e490SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar * modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar * are met:
7c243e490SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar * documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar *
13c243e490SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24*0677dfd1SJulio Merino * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
25*0677dfd1SJulio Merino
26*0677dfd1SJulio Merino #include "atf-c/detail/env.h"
27c243e490SMarcel Moolenaar
28c243e490SMarcel Moolenaar #if defined(HAVE_CONFIG_H)
29*0677dfd1SJulio Merino #include "config.h"
30c243e490SMarcel Moolenaar #endif
31c243e490SMarcel Moolenaar
32c243e490SMarcel Moolenaar #include <errno.h>
33c243e490SMarcel Moolenaar #include <stdlib.h>
34c243e490SMarcel Moolenaar
35*0677dfd1SJulio Merino #include "atf-c/detail/sanity.h"
36*0677dfd1SJulio Merino #include "atf-c/detail/text.h"
37c243e490SMarcel Moolenaar #include "atf-c/error.h"
38c243e490SMarcel Moolenaar
39c243e490SMarcel Moolenaar const char *
atf_env_get(const char * name)40c243e490SMarcel Moolenaar atf_env_get(const char *name)
41c243e490SMarcel Moolenaar {
42c243e490SMarcel Moolenaar const char* val = getenv(name);
43c243e490SMarcel Moolenaar PRE(val != NULL);
44c243e490SMarcel Moolenaar return val;
45c243e490SMarcel Moolenaar }
46c243e490SMarcel Moolenaar
47*0677dfd1SJulio Merino const char *
atf_env_get_with_default(const char * name,const char * default_value)48*0677dfd1SJulio Merino atf_env_get_with_default(const char *name, const char *default_value)
49*0677dfd1SJulio Merino {
50*0677dfd1SJulio Merino const char* val = getenv(name);
51*0677dfd1SJulio Merino if (val == NULL)
52*0677dfd1SJulio Merino return default_value;
53*0677dfd1SJulio Merino else
54*0677dfd1SJulio Merino return val;
55*0677dfd1SJulio Merino }
56*0677dfd1SJulio Merino
57c243e490SMarcel Moolenaar bool
atf_env_has(const char * name)58c243e490SMarcel Moolenaar atf_env_has(const char *name)
59c243e490SMarcel Moolenaar {
60c243e490SMarcel Moolenaar return getenv(name) != NULL;
61c243e490SMarcel Moolenaar }
62c243e490SMarcel Moolenaar
63c243e490SMarcel Moolenaar atf_error_t
atf_env_set(const char * name,const char * val)64c243e490SMarcel Moolenaar atf_env_set(const char *name, const char *val)
65c243e490SMarcel Moolenaar {
66c243e490SMarcel Moolenaar atf_error_t err;
67c243e490SMarcel Moolenaar
68c243e490SMarcel Moolenaar #if defined(HAVE_SETENV)
69c243e490SMarcel Moolenaar if (setenv(name, val, 1) == -1)
70c243e490SMarcel Moolenaar err = atf_libc_error(errno, "Cannot set environment variable "
71c243e490SMarcel Moolenaar "'%s' to '%s'", name, val);
72c243e490SMarcel Moolenaar else
73c243e490SMarcel Moolenaar err = atf_no_error();
74c243e490SMarcel Moolenaar #elif defined(HAVE_PUTENV)
75c243e490SMarcel Moolenaar char *buf;
76c243e490SMarcel Moolenaar
77c243e490SMarcel Moolenaar err = atf_text_format(&buf, "%s=%s", name, val);
78c243e490SMarcel Moolenaar if (!atf_is_error(err)) {
79c243e490SMarcel Moolenaar if (putenv(buf) == -1)
80c243e490SMarcel Moolenaar err = atf_libc_error(errno, "Cannot set environment variable "
81c243e490SMarcel Moolenaar "'%s' to '%s'", name, val);
82c243e490SMarcel Moolenaar free(buf);
83c243e490SMarcel Moolenaar }
84c243e490SMarcel Moolenaar #else
85c243e490SMarcel Moolenaar # error "Don't know how to set an environment variable."
86c243e490SMarcel Moolenaar #endif
87c243e490SMarcel Moolenaar
88c243e490SMarcel Moolenaar return err;
89c243e490SMarcel Moolenaar }
90c243e490SMarcel Moolenaar
91c243e490SMarcel Moolenaar atf_error_t
atf_env_unset(const char * name)92c243e490SMarcel Moolenaar atf_env_unset(const char *name)
93c243e490SMarcel Moolenaar {
94c243e490SMarcel Moolenaar atf_error_t err;
95c243e490SMarcel Moolenaar
96c243e490SMarcel Moolenaar #if defined(HAVE_UNSETENV)
97c243e490SMarcel Moolenaar unsetenv(name);
98c243e490SMarcel Moolenaar err = atf_no_error();
99c243e490SMarcel Moolenaar #elif defined(HAVE_PUTENV)
100c243e490SMarcel Moolenaar char *buf;
101c243e490SMarcel Moolenaar
102c243e490SMarcel Moolenaar err = atf_text_format(&buf, "%s=", name);
103c243e490SMarcel Moolenaar if (!atf_is_error(err)) {
104c243e490SMarcel Moolenaar if (putenv(buf) == -1)
105c243e490SMarcel Moolenaar err = atf_libc_error(errno, "Cannot unset environment variable"
106c243e490SMarcel Moolenaar " '%s'", name);
107c243e490SMarcel Moolenaar free(buf);
108c243e490SMarcel Moolenaar }
109c243e490SMarcel Moolenaar #else
110c243e490SMarcel Moolenaar # error "Don't know how to unset an environment variable."
111c243e490SMarcel Moolenaar #endif
112c243e490SMarcel Moolenaar
113c243e490SMarcel Moolenaar return err;
114c243e490SMarcel Moolenaar }
115