xref: /freebsd/lib/libc/tests/db/dbm_perm_test.c (revision 14598537acecb512432e33e001762c912cc25799)
1 /*-
2  * Copyright (c) 2025 Klara, Inc.
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <ndbm.h>
10 #include <stdio.h>
11 
12 #include <atf-c.h>
13 
14 static const char *path = "tmp";
15 static const char *dbname = "tmp.db";
16 
17 static void
create_db(void)18 create_db(void)
19 {
20 	DB *db;
21 	datum data, key;
22 
23 	data.dptr = "bar";
24 	data.dsize = strlen("bar");
25 	key.dptr = "foo";
26 	key.dsize = strlen("foo");
27 
28 	db = dbm_open(path, O_RDWR | O_CREAT, 0755);
29 	ATF_CHECK(db != NULL);
30 	ATF_REQUIRE(atf_utils_file_exists(dbname));
31 	ATF_REQUIRE(dbm_store(db, key, data, DBM_INSERT) != -1);
32 	dbm_close(db);
33 }
34 
35 ATF_TC_WITHOUT_HEAD(dbm_rdonly_test);
ATF_TC_BODY(dbm_rdonly_test,tc)36 ATF_TC_BODY(dbm_rdonly_test, tc)
37 {
38 	DB *db;
39 	datum data, key;
40 
41 	bzero(&data, sizeof(data));
42 	key.dptr = "foo";
43 	key.dsize = strlen("foo");
44 	create_db();
45 
46 	db = dbm_open(path, O_RDONLY, 0755);
47 	data = dbm_fetch(db, key);
48 	ATF_REQUIRE(data.dptr != NULL);
49 	ATF_REQUIRE(strncmp((const char*)data.dptr, "bar", data.dsize) == 0);
50 	ATF_REQUIRE(dbm_store(db, key, data, DBM_REPLACE) == -1);
51 	ATF_REQUIRE(errno == EPERM);
52 }
53 
54 ATF_TC_WITHOUT_HEAD(dbm_wronly_test);
ATF_TC_BODY(dbm_wronly_test,tc)55 ATF_TC_BODY(dbm_wronly_test, tc)
56 {
57 	DB *db;
58 	datum data, key;
59 
60 	key.dptr = "foo";
61 	key.dsize = strlen("foo");
62 	data.dptr = "baz";
63 	data.dsize = strlen("baz");
64 	create_db();
65 
66 	db = dbm_open(path, O_WRONLY, 0755);
67 	data = dbm_fetch(db, key);
68 	ATF_REQUIRE(data.dptr == NULL);
69 	ATF_REQUIRE(errno == EPERM);
70 	ATF_REQUIRE(dbm_store(db, key, data, DBM_REPLACE) != -1);
71 }
72 
73 ATF_TC_WITHOUT_HEAD(dbm_rdwr_test);
ATF_TC_BODY(dbm_rdwr_test,tc)74 ATF_TC_BODY(dbm_rdwr_test, tc)
75 {
76 	DB *db;
77 	datum data, key;
78 
79 	key.dptr = "foo";
80 	key.dsize = strlen("foo");
81 	create_db();
82 
83 	db = dbm_open(path, O_RDWR, 0755);
84 	data = dbm_fetch(db, key);
85 	ATF_REQUIRE(data.dptr != NULL);
86 	data.dptr = "baz";
87 	data.dsize = strlen("baz");
88 	ATF_REQUIRE(dbm_store(db, key, data, DBM_REPLACE) != -1);
89 }
90 
ATF_TP_ADD_TCS(tp)91 ATF_TP_ADD_TCS(tp)
92 {
93 	ATF_TP_ADD_TC(tp, dbm_rdonly_test);
94 	ATF_TP_ADD_TC(tp, dbm_wronly_test);
95 	ATF_TP_ADD_TC(tp, dbm_rdwr_test);
96 
97 	return (atf_no_error());
98 }
99