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 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); 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); 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); 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 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