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