source: vendor/current/lib/tdb/test/run-mutex-openflags2.c

Last change on this file was 988, checked in by Silvan Scherrer, 9 years ago

Samba Server: update vendor to version 4.4.3

File size: 4.2 KB
Line 
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"
14#include <stdlib.h>
15#include <sys/types.h>
16#include <sys/wait.h>
17#include <poll.h>
18#include <stdarg.h>
19
20static TDB_DATA key, data;
21
22static void log_void(struct tdb_context *tdb, enum tdb_debug_level level,
23 const char *fmt, ...)
24{
25}
26
27static void log_fn(struct tdb_context *tdb, enum tdb_debug_level level,
28 const char *fmt, ...)
29{
30 va_list ap;
31 va_start(ap, fmt);
32 vfprintf(stderr, fmt, ap);
33 va_end(ap);
34}
35
36static int do_child(int fd)
37{
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 };
42 char c;
43
44 read(fd, &c, 1);
45
46 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
47 TDB_DEFAULT,
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);
51
52 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
53 TDB_CLEAR_IF_FIRST,
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);
57
58 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
59 TDB_CLEAR_IF_FIRST |
60 TDB_MUTEX_LOCKING |
61 TDB_INTERNAL,
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);
65
66 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
67 TDB_CLEAR_IF_FIRST |
68 TDB_MUTEX_LOCKING |
69 TDB_NOMMAP,
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);
73
74 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
75 TDB_CLEAR_IF_FIRST |
76 TDB_MUTEX_LOCKING,
77 O_RDONLY, 0755, &nolog_ctx, NULL);
78 ok((tdb != NULL), "TDB_MUTEX_LOCKING with "
79 "O_RDONLY should work - %d", errno);
80 tdb_close(tdb);
81
82 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
83 TDB_CLEAR_IF_FIRST |
84 TDB_MUTEX_LOCKING,
85 O_RDWR|O_CREAT, 0755, &log_ctx, NULL);
86 ok((tdb != NULL), "TDB_MUTEX_LOCKING with TDB_CLEAR_IF_FIRST"
87 "TDB_NOMMAP should work - %d", errno);
88
89 return 0;
90}
91
92/* The code should barf on TDBs created with rwlocks. */
93int main(int argc, char *argv[])
94{
95 struct tdb_context *tdb;
96 unsigned int log_count;
97 struct tdb_logging_context log_ctx = { log_fn, &log_count };
98 struct tdb_logging_context nolog_ctx = { log_void, NULL };
99 int ret, status;
100 pid_t child, wait_ret;
101 int pipefd[2];
102 char c = 0;
103 bool runtime_support;
104
105 runtime_support = tdb_runtime_check_for_robust_mutexes();
106
107 ret = pipe(pipefd);
108 ok1(ret == 0);
109
110 key.dsize = strlen("hi");
111 key.dptr = discard_const_p(uint8_t, "hi");
112 data.dsize = strlen("world");
113 data.dptr = discard_const_p(uint8_t, "world");
114
115 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
116 TDB_INCOMPATIBLE_HASH|
117 TDB_MUTEX_LOCKING,
118 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
119 ok((tdb == NULL) && (errno == EINVAL), "TDB_MUTEX_LOCKING without "
120 "TDB_CLEAR_IF_FIRST should fail with EINVAL - %d", errno);
121
122 if (!runtime_support) {
123 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
124 TDB_CLEAR_IF_FIRST|
125 TDB_MUTEX_LOCKING,
126 O_RDWR|O_CREAT, 0755, &nolog_ctx, NULL);
127 ok((tdb == NULL) && (errno == ENOSYS), "TDB_MUTEX_LOCKING without "
128 "runtime support should fail with ENOSYS - %d", errno);
129
130 skip(1, "No robust mutex support");
131 return exit_status();
132 }
133
134 child = fork();
135 if (child == 0) {
136 return do_child(pipefd[0]);
137 }
138
139 tdb = tdb_open_ex("mutex-openflags2.tdb", 0,
140 TDB_CLEAR_IF_FIRST|
141 TDB_MUTEX_LOCKING,
142 O_RDWR|O_CREAT, 0755, &log_ctx, NULL);
143 ok((tdb != NULL), "tdb_open_ex with mutexes should succeed");
144
145 write(pipefd[1], &c, 1);
146
147 wait_ret = wait(&status);
148 ok((wait_ret == child) && (status == 0),
149 "child should have exited correctly");
150
151 diag("done");
152 return exit_status();
153}
Note: See TracBrowser for help on using the repository browser.