1 #include "../common/tdb_private.h"
2 #include "../common/io.c"
3 #include "../common/tdb.c"
4 #include "../common/lock.c"
5 #include "../common/freelist.c"
6 #include "../common/traverse.c"
7 #include "../common/transaction.c"
8 #include "../common/error.c"
9 #include "../common/open.c"
10 #include "../common/check.c"
11 #include "../common/hash.c"
12 #include "../common/mutex.c"
13 #include "tap-interface.h"
15 #include <sys/types.h>
20 static TDB_DATA key, data;
22 static void log_void(struct tdb_context *tdb, enum tdb_debug_level level,
27 static void log_fn(struct tdb_context *tdb, enum tdb_debug_level level,
32 vfprintf(stderr, fmt, ap);
36 static int do_child(int fd)
38 struct tdb_context *tdb;
39 unsigned int log_count;
40 struct tdb_logging_context log_ctx = { log_fn, &log_count };
41 struct tdb_logging_context nolog_ctx = { log_void, NULL };
46 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
48 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
49 ok((tdb == NULL) && (errno == EINVAL), "TDB_DEFAULT without "
50 "TDB_MUTEX_LOCKING should fail with EINVAL - %d", errno);
52 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
54 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
55 ok((tdb == NULL) && (errno == EINVAL), "TDB_CLEAR_IF_FIRST without "
56 "TDB_MUTEX_LOCKING should fail with EINVAL - %d", errno);
58 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
62 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
63 ok((tdb == NULL) && (errno == EINVAL), "TDB_MUTEX_LOCKING with "
64 "TDB_INTERNAL should fail with EINVAL - %d", errno);
66 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
70 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
71 ok((tdb == NULL) && (errno == EINVAL), "TDB_MUTEX_LOCKING with "
72 "TDB_NOMMAP should fail with EINVAL - %d", errno);
74 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
77 O_RDONLY, 0755, &nolog_ctx, NULL);
78 ok((tdb == NULL) && (errno == EINVAL), "TDB_MUTEX_LOCKING with "
79 "O_RDONLY should fail with EINVAL - %d", errno);
81 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
84 O_RDWR|O_CREAT, 0755, &log_ctx, NULL);
85 ok((tdb != NULL), "TDB_MUTEX_LOCKING with TDB_CLEAR_IF_FIRST"
86 "TDB_NOMMAP should work - %d", errno);
91 /* The code should barf on TDBs created with rwlocks. */
92 int main(int argc, char *argv[])
94 struct tdb_context *tdb;
95 unsigned int log_count;
96 struct tdb_logging_context log_ctx = { log_fn, &log_count };
97 struct tdb_logging_context nolog_ctx = { log_void, NULL };
99 pid_t child, wait_ret;
102 bool runtime_support;
104 runtime_support = tdb_runtime_check_for_robust_mutexes();
109 key.dsize = strlen("hi");
110 key.dptr = discard_const_p(uint8_t, "hi");
111 data.dsize = strlen("world");
112 data.dptr = discard_const_p(uint8_t, "world");
114 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
115 TDB_INCOMPATIBLE_HASH|
117 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
118 ok((tdb == NULL) && (errno == EINVAL), "TDB_MUTEX_LOCKING without "
119 "TDB_CLEAR_IF_FIRST should fail with EINVAL - %d", errno);
121 if (!runtime_support) {
122 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
125 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
126 ok((tdb == NULL) && (errno == ENOSYS), "TDB_MUTEX_LOCKING without "
127 "runtime support should fail with ENOSYS - %d", errno);
129 skip(1, "No robust mutex support");
130 return exit_status();
135 return do_child(pipefd[0]);
138 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
141 O_RDWR|O_CREAT, 0755, &log_ctx, NULL);
142 ok((tdb != NULL), "tdb_open_ex with mutexes should succeed");
144 write(pipefd[1], &c, 1);
146 wait_ret = wait(&status);
147 ok((wait_ret == child) && (status == 0),
148 "child should have exited correctly");
151 return exit_status();