1597b0267SMariusz Zaborski /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3597b0267SMariusz Zaborski * 4597b0267SMariusz Zaborski * Copyright (C) 2021 Mariusz Zaborski <oshogbo@FreeBSD.org> 5597b0267SMariusz Zaborski * 6597b0267SMariusz Zaborski * Redistribution and use in source and binary forms, with or without 7597b0267SMariusz Zaborski * modification, are permitted provided that the following conditions 8597b0267SMariusz Zaborski * are met: 9597b0267SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright 10597b0267SMariusz Zaborski * notice, this list of conditions and the following disclaimer. 11597b0267SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright 12597b0267SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the 13597b0267SMariusz Zaborski * documentation and/or other materials provided with the distribution. 14597b0267SMariusz Zaborski * 15597b0267SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16597b0267SMariusz Zaborski * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17597b0267SMariusz Zaborski * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18597b0267SMariusz Zaborski * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19597b0267SMariusz Zaborski * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20597b0267SMariusz Zaborski * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21597b0267SMariusz Zaborski * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22597b0267SMariusz Zaborski * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23597b0267SMariusz Zaborski * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24597b0267SMariusz Zaborski * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25597b0267SMariusz Zaborski * SUCH DAMAGE. 26597b0267SMariusz Zaborski */ 27597b0267SMariusz Zaborski 28597b0267SMariusz Zaborski /* 29597b0267SMariusz Zaborski * Test for clearenv(3) routine. 30597b0267SMariusz Zaborski */ 31597b0267SMariusz Zaborski 32597b0267SMariusz Zaborski #include <sys/cdefs.h> 33597b0267SMariusz Zaborski __FBSDID("$FreeBSD$"); 34597b0267SMariusz Zaborski 35597b0267SMariusz Zaborski #include <atf-c.h> 36597b0267SMariusz Zaborski 37597b0267SMariusz Zaborski #include <stdio.h> 38597b0267SMariusz Zaborski #include <stdlib.h> 39597b0267SMariusz Zaborski 40597b0267SMariusz Zaborski #define TEST_VARIABLE "TEST_VAR" 41597b0267SMariusz Zaborski #define TEST_SYSTEM_VARIABLE "PWD" 42597b0267SMariusz Zaborski 43597b0267SMariusz Zaborski extern char **environ; 44597b0267SMariusz Zaborski 45597b0267SMariusz Zaborski void 46597b0267SMariusz Zaborski create_multiple_variables(int num) 47597b0267SMariusz Zaborski { 48597b0267SMariusz Zaborski char name[64]; 49597b0267SMariusz Zaborski char value[64]; 50597b0267SMariusz Zaborski int i; 51597b0267SMariusz Zaborski 52597b0267SMariusz Zaborski for (i = 0; i < num; i++) { 53597b0267SMariusz Zaborski snprintf(name, sizeof(name), "%s_%d", TEST_VARIABLE, i); 54597b0267SMariusz Zaborski snprintf(value, sizeof(value), "%d", i); 55597b0267SMariusz Zaborski ATF_CHECK(getenv(name) == NULL); 56597b0267SMariusz Zaborski ATF_CHECK(setenv(name, value, 0) != -1); 57597b0267SMariusz Zaborski ATF_CHECK_STREQ(getenv(name), value); 58597b0267SMariusz Zaborski } 59597b0267SMariusz Zaborski } 60597b0267SMariusz Zaborski 61597b0267SMariusz Zaborski void 62597b0267SMariusz Zaborski check_if_nulled_variables(int num) 63597b0267SMariusz Zaborski { 64597b0267SMariusz Zaborski char name[64]; 65597b0267SMariusz Zaborski int i; 66597b0267SMariusz Zaborski 67597b0267SMariusz Zaborski for (i = 0; i < num; i++) { 68597b0267SMariusz Zaborski snprintf(name, sizeof(name), "%s_%d", TEST_VARIABLE, i); 69597b0267SMariusz Zaborski ATF_CHECK(getenv(name) == NULL); 70597b0267SMariusz Zaborski } 71597b0267SMariusz Zaborski } 72597b0267SMariusz Zaborski 73597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__single_var_test); 74597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__single_var_test, tc) 75597b0267SMariusz Zaborski { 76597b0267SMariusz Zaborski 77597b0267SMariusz Zaborski ATF_CHECK(setenv(TEST_VARIABLE, "true", 0) != -1); 78597b0267SMariusz Zaborski ATF_CHECK_STREQ(getenv(TEST_VARIABLE), "true"); 79597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 80597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_VARIABLE) == NULL); 81597b0267SMariusz Zaborski } 82597b0267SMariusz Zaborski 83597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__multiple_vars_test); 84597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__multiple_vars_test, tc) 85597b0267SMariusz Zaborski { 86597b0267SMariusz Zaborski 87597b0267SMariusz Zaborski create_multiple_variables(10); 88597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 89597b0267SMariusz Zaborski check_if_nulled_variables(10); 90597b0267SMariusz Zaborski } 91597b0267SMariusz Zaborski 92597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__recreated_vars_test); 93597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__recreated_vars_test, tc) 94597b0267SMariusz Zaborski { 95597b0267SMariusz Zaborski 96597b0267SMariusz Zaborski create_multiple_variables(10); 97597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 98597b0267SMariusz Zaborski check_if_nulled_variables(10); 99597b0267SMariusz Zaborski create_multiple_variables(10); 100597b0267SMariusz Zaborski } 101597b0267SMariusz Zaborski 102597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__system_var_test); 103597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__system_var_test, tc) 104597b0267SMariusz Zaborski { 105597b0267SMariusz Zaborski 106597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) != NULL); 107597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 108597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) == NULL); 109597b0267SMariusz Zaborski } 110597b0267SMariusz Zaborski 111597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__recreated_system_var_test); 112597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__recreated_system_var_test, tc) 113597b0267SMariusz Zaborski { 114597b0267SMariusz Zaborski 115597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) != NULL); 116597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 117597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_SYSTEM_VARIABLE) == NULL); 118597b0267SMariusz Zaborski ATF_CHECK(setenv(TEST_SYSTEM_VARIABLE, "test", 0) != -1); 119597b0267SMariusz Zaborski ATF_CHECK_STREQ(getenv(TEST_SYSTEM_VARIABLE), "test"); 120597b0267SMariusz Zaborski } 121597b0267SMariusz Zaborski 122597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__double_clear_vars); 123597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__double_clear_vars, tc) 124597b0267SMariusz Zaborski { 125597b0267SMariusz Zaborski 126597b0267SMariusz Zaborski create_multiple_variables(10); 127597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 128597b0267SMariusz Zaborski check_if_nulled_variables(10); 129597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 130597b0267SMariusz Zaborski check_if_nulled_variables(10); 131597b0267SMariusz Zaborski create_multiple_variables(10); 132597b0267SMariusz Zaborski } 133597b0267SMariusz Zaborski 134597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__environ_null); 135597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__environ_null, tc) 136597b0267SMariusz Zaborski { 137597b0267SMariusz Zaborski 138597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 139748a707fSMariusz Zaborski ATF_CHECK(environ != NULL); 140597b0267SMariusz Zaborski } 141597b0267SMariusz Zaborski 142597b0267SMariusz Zaborski ATF_TC_WITHOUT_HEAD(clearenv__putenv_vars); 143597b0267SMariusz Zaborski ATF_TC_BODY(clearenv__putenv_vars, tc) 144597b0267SMariusz Zaborski { 145597b0267SMariusz Zaborski char buf[64], ref[64]; 146597b0267SMariusz Zaborski 147597b0267SMariusz Zaborski snprintf(buf, sizeof(buf), "%s=1", TEST_VARIABLE); 148597b0267SMariusz Zaborski strcpy(ref, buf); 149597b0267SMariusz Zaborski 150597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_VARIABLE) == NULL); 151597b0267SMariusz Zaborski ATF_CHECK(putenv(buf) != -1); 152597b0267SMariusz Zaborski ATF_CHECK(strcmp(getenv(TEST_VARIABLE), "1") == 0); 153597b0267SMariusz Zaborski 154597b0267SMariusz Zaborski ATF_CHECK(clearenv() == 0); 155597b0267SMariusz Zaborski 156597b0267SMariusz Zaborski ATF_CHECK(getenv(TEST_VARIABLE) == NULL); 157597b0267SMariusz Zaborski ATF_CHECK(strcmp(buf, ref) == 0); 158597b0267SMariusz Zaborski } 159597b0267SMariusz Zaborski 160597b0267SMariusz Zaborski ATF_TP_ADD_TCS(tp) 161597b0267SMariusz Zaborski { 162597b0267SMariusz Zaborski 163597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__single_var_test); 164597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__multiple_vars_test); 165597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__recreated_vars_test); 166597b0267SMariusz Zaborski 167597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__system_var_test); 168597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__recreated_system_var_test); 169597b0267SMariusz Zaborski 170597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__double_clear_vars); 171597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__environ_null); 172597b0267SMariusz Zaborski 173597b0267SMariusz Zaborski ATF_TP_ADD_TC(tp, clearenv__putenv_vars); 174597b0267SMariusz Zaborski 175597b0267SMariusz Zaborski return (atf_no_error()); 176597b0267SMariusz Zaborski } 177