xref: /freebsd/lib/libc/tests/stdlib/getenv_r_test.c (revision 26aec3f3b4fcdd23411cda6797d18117d9f965d6)
1 /*-
2  * Copyright (c) 2025 Klara, Inc.
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 #include <errno.h>
8 #include <stdlib.h>
9 #include <string.h>
10 
11 #include <atf-c.h>
12 
13 ATF_TC_WITHOUT_HEAD(getenv_r_ok);
ATF_TC_BODY(getenv_r_ok,tc)14 ATF_TC_BODY(getenv_r_ok, tc)
15 {
16 	const char *ident = atf_tc_get_ident(tc);
17 	char buf[256];
18 
19 	ATF_REQUIRE_EQ(0, setenv("ATF_TC_IDENT", ident, 1));
20 	ATF_REQUIRE_EQ(0, getenv_r("ATF_TC_IDENT", buf, sizeof(buf)));
21 	ATF_REQUIRE_STREQ(ident, buf);
22 }
23 
24 ATF_TC_WITHOUT_HEAD(getenv_r_einval);
ATF_TC_BODY(getenv_r_einval,tc)25 ATF_TC_BODY(getenv_r_einval, tc)
26 {
27 	char buf[256];
28 
29 	errno = 0;
30 	ATF_REQUIRE_EQ(-1, getenv_r(NULL, buf, sizeof(buf)));
31 	ATF_REQUIRE_EQ(EINVAL, errno);
32 	errno = 0;
33 	ATF_REQUIRE_EQ(-1, getenv_r("", buf, sizeof(buf)));
34 	ATF_REQUIRE_EQ(EINVAL, errno);
35 	errno = 0;
36 	ATF_REQUIRE_EQ(-1, getenv_r("A=B", buf, sizeof(buf)));
37 	ATF_REQUIRE_EQ(EINVAL, errno);
38 }
39 
40 ATF_TC_WITHOUT_HEAD(getenv_r_enoent);
ATF_TC_BODY(getenv_r_enoent,tc)41 ATF_TC_BODY(getenv_r_enoent, tc)
42 {
43 	char buf[256];
44 
45 	errno = 0;
46 	ATF_REQUIRE_EQ(-1, getenv_r("no such variable", buf, sizeof(buf)));
47 	ATF_REQUIRE_EQ(ENOENT, errno);
48 }
49 
50 ATF_TC_WITHOUT_HEAD(getenv_r_erange);
ATF_TC_BODY(getenv_r_erange,tc)51 ATF_TC_BODY(getenv_r_erange, tc)
52 {
53 	const char *ident = atf_tc_get_ident(tc);
54 	char buf[256];
55 
56 	ATF_REQUIRE_EQ(0, setenv("ATF_TC_IDENT", ident, 1));
57 	errno = 0;
58 	ATF_REQUIRE_EQ(-1, getenv_r("ATF_TC_IDENT", buf, strlen(ident)));
59 	ATF_REQUIRE_EQ(ERANGE, errno);
60 }
61 
ATF_TP_ADD_TCS(tp)62 ATF_TP_ADD_TCS(tp)
63 {
64 	ATF_TP_ADD_TC(tp, getenv_r_ok);
65 	ATF_TP_ADD_TC(tp, getenv_r_einval);
66 	ATF_TP_ADD_TC(tp, getenv_r_enoent);
67 	ATF_TP_ADD_TC(tp, getenv_r_erange);
68 	return (atf_no_error());
69 }
70