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