xref: /freebsd-src/contrib/atf/atf-c/detail/env.c (revision 8f0ea33f2bbf3a6aa80235f0a02fa5f2780c2b17)
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