11 #include <ccan/rszshm/rszshm.h>
12 #include <ccan/tap/tap.h>
17 int fail_close, fail_flock, fail_ftruncate, fail_msync, fail_munmap, fail_open;
18 #define close(...) (fail_close ? errno = 9000, -1 : close(__VA_ARGS__))
19 #define flock(...) (fail_flock ? errno = 9001, -1 : flock(__VA_ARGS__))
20 #define ftruncate(...) (fail_ftruncate ? errno = 9002, -1 : ftruncate(__VA_ARGS__))
21 #define msync(...) (fail_msync ? errno = 9003, -1 : msync(__VA_ARGS__))
22 #define munmap(...) (fail_munmap ? errno = 9004, -1 : munmap(__VA_ARGS__))
23 #define open(...) (fail_open ? errno = 9005, -1 : open(__VA_ARGS__))
25 int fail_read, short_read;
26 #define read(...) (fail_read ? errno = 9006, -1 : short_read ? 1 : read(__VA_ARGS__))
28 int fail_mmap_anon, fail_mmap_fixed, bad_mmap_addr;
29 #define mmap(adr, len, rw, flags, fd, off) ( \
30 fail_mmap_anon && (flags) & MAP_ANON ? errno = 9010, MAP_FAILED : \
31 fail_mmap_fixed && (flags) & MAP_FIXED ? errno = 9011, MAP_FAILED : \
32 bad_mmap_addr ? NULL : \
33 mmap(adr, len, rw, flags, fd, off) \
35 #include <ccan/rszshm/rszshm.c>
37 #define noerr(x) ({ int n = (x); if (n == -1) err(1, "%s", #x); n; })
40 ".................................................................................................................................."
43 static struct sigaction sa;
44 static void segvjmp(int signum)
53 ok1(rszshm_mk(NULL, 0, NULL) == NULL && errno == EINVAL);
56 ok1(rszshm_mk(&s, 0, NULL) == NULL && errno == EINVAL);
58 ok1(rszshm_mk(&s, 4096, longstr) == NULL && errno == EINVAL);
61 ok1(rszshm_mk(&s, 4096, NULL) == NULL && errno == 9010);
66 ok1(rszshm_mk(&s, 4096, NULL) == NULL && errno == 9005);
71 ok1(rszshm_mk(&s, 4096, NULL) == NULL && errno == 9002);
76 ok1(rszshm_mk(&s, 4096, NULL) == NULL && errno == 9011);
81 ok1(rszshm_mk(&s, 4096, NULL) == NULL && errno == 9003);
85 ok1(rszshm_mk(&s, 4096, NULL) != NULL);
87 struct rszshm_scan scan = RSZSHM_DFLT_SCAN;
89 ok1(rszshm_mk(&t, 4096, NULL, scan) == NULL && errno == ENOSPC);
91 ok1(rszshm_dt(&s) == 0);
92 ok1(rszshm_rm(&s) == 0);
94 long pgsz = sysconf(_SC_PAGE_SIZE);
95 scan.len = UINT64_MAX - pgsz;
96 ok1(rszshm_mk(&t, 4096, NULL, scan) == NULL && errno == ENOMEM);
98 ok1(rszshm_mk(&t, 4096, "foo/bar_XXXXXX/0") == NULL && errno == ENOENT);
101 ok1(rszshm_mkm(r, 4096, NULL) != NULL);
105 char *fname = strdupa(r->fname);
109 ok1(rszshm_free(r) == 0);
112 ok1(rszshm_atm(q, fname) != NULL);
114 *((pid_t *) q->dat) = getpid();
116 ok1(rszshm_up(q) == 0);
117 ok1(rszshm_grow(q) == 1);
118 ok1(rszshm_free(q) == 0);
121 pp = (pid_t *) r->dat;
125 ok1(rszshm_up(r) == -1 && errno == 9011);
128 ok1(rszshm_grow(r) == 1);
130 ok1(rszshm_dt(r) == 0);
132 sa.sa_handler = segvjmp;
133 sa.sa_flags = SA_RESETHAND;
134 sigemptyset(&sa.sa_mask);
135 sigaction(SIGSEGV, &sa, NULL);
137 fail("still mapped after detach: %d", *pp);
139 pass("access after detach gives segv, OK!");
141 ok1(rszshm_at(r, longstr) == NULL && errno == EINVAL);
144 ok1(rszshm_at(r, fname) == NULL && errno == 9005);
148 ok1(rszshm_at(r, fname) == NULL && errno == 9006);
152 ok1(rszshm_at(r, fname) == NULL && errno == ENODATA);
156 ok1(rszshm_at(r, fname) == NULL && errno == 9010);
160 ok1(rszshm_at(r, fname) == NULL && errno == ENOSPC);
164 ok1(rszshm_at(r, fname) == NULL && errno == 9011);
167 ok1(rszshm_at(r, fname) != NULL);
170 struct rszshm_hdr save = *r->hdr;
171 r->hdr->flen = r->flen;
172 r->hdr->max = r->flen;
173 ok1(rszshm_grow(r) == -1 && errno == ENOMEM);
177 ok1(rszshm_grow(r) == -1 && errno == 9001);
181 ok1(rszshm_grow(r) == -1 && errno == 9002);
184 ok1(rszshm_grow(r) == 1);
185 ok1(rszshm_dt(r) == 0);
186 ok1(rszshm_rm(r) == 0);
189 ok1(rszshm_rmdir(r) == -1 && errno == ENOTDIR);
191 ok1(rszshm_free(r) == 0);
193 return exit_status();