#include <unistd.h>
#include <sys/mman.h>
#include <ccan/tap/tap.h>
+#include <ccan/ptrint/ptrint.h>
#include <ccan/altstack/altstack.h>
#include <stdio.h>
rlim_t msz_;
#define e(x) (900+(x))
#define seterr(x) (errno = e(x))
-#define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || out_ ? (x) : 0))
+#define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || state.out ? (x) : 0))
#define getrlimit(...) (fail&getrlimit_ ? (seterr(getrlimit_), -1) : (setcall(getrlimit_), getrlimit(__VA_ARGS__)))
#define mmap(...) (fail&mmap_ ? (seterr(mmap_), (void *)-1) : (setcall(mmap_), mmap(__VA_ARGS__)))
#define munmap(a, b) (fail&munmap_ ? (seterr(munmap_), -1) : (setcall(munmap_), munmap(m_=(a), msz_=(b))))
}
static void *wrap(void *i)
{
- dn((unsigned long) i);
+ dn(ptr2int(i));
return wrap;
}
+#define chkfail(x, y, z, c1, c2) \
+ do { \
+ call1 = 0; \
+ call2 = 0; \
+ errno = 0; \
+ ok1((fail = x) && (y)); \
+ ok1(errno == (z)); \
+ ok1(call1 == (c1)); \
+ ok1(call2 == (c2)); \
+ } while (0);
+
+#define chkok(y, z, c1, c2) \
+ do { \
+ call1 = 0; \
+ call2 = 0; \
+ errno = 0; \
+ fail = 0; \
+ ok1((y)); \
+ ok1(errno == (z)); \
+ ok1(call1 == (c1)); \
+ ok1(call2 == (c2)); \
+ } while (0)
+
int main(void)
{
long pgsz = sysconf(_SC_PAGESIZE);
- plan_tests(17);
-
-#define chkfail(x, y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, ok1((fail = x) && (y) && errno == (z) && call1 == (c1) && call2 == (c2)));
-#define chkok( y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, fail = 0, ok1((y) && errno == (z) && call1 == (c1) && call2 == (c2)));
+ plan_tests(50);
- chkfail(getrlimit_, altstack(8*MiB, wrap, 0, 0) == -1, e(getrlimit_),
+ chkfail(getrlimit_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(getrlimit_),
0,
0);
- chkfail(setrlimit_, altstack(8*MiB, wrap, 0, 0) == -1, e(setrlimit_),
+ chkfail(setrlimit_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(setrlimit_),
getrlimit_,
0);
- chkfail(mmap_, altstack(8*MiB, wrap, 0, 0) == -1, e(mmap_),
+ chkfail(mmap_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(mmap_),
getrlimit_|setrlimit_,
setrlimit_);
- chkfail(sigaltstack_, altstack(8*MiB, wrap, 0, 0) == -1, e(sigaltstack_),
+ chkfail(sigaltstack_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(sigaltstack_),
getrlimit_|setrlimit_|mmap_,
setrlimit_|munmap_);
- chkfail(sigaction_, altstack(8*MiB, wrap, 0, 0) == -1, e(sigaction_),
+ chkfail(sigaction_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(sigaction_),
getrlimit_|setrlimit_|mmap_|sigaltstack_,
setrlimit_|munmap_|sigaltstack_);
- chkfail(munmap_, altstack(8*MiB, wrap, 0, 0) == 1, e(munmap_),
+ chkfail(munmap_, altstack(8*MiB, wrap, int2ptr(0), 0) == 1, e(munmap_),
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
setrlimit_|sigaltstack_|sigaction_);
if (fail = 0, munmap(m_, msz_) == -1)
err(1, "munmap");
- chkok( altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
+ chkok( altstack(1*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW,
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
setrlimit_|munmap_|sigaltstack_|sigaction_);
// be sure segv catch is repeatable (SA_NODEFER)
- chkok( altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
+ chkok( altstack(1*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW,
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
setrlimit_|munmap_|sigaltstack_|sigaction_);
used = 1;
- chkfail(munmap_, altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
+ chkfail(munmap_, altstack(1*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW,
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
setrlimit_|sigaltstack_|sigaction_);
if (fail = 0, munmap(m_, msz_) == -1)
ok1(strcmp(buf, estr "\n") == 0);
used = 1;
- chkok( altstack(8*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
+ chkok( altstack(8*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW,
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
setrlimit_|munmap_|sigaltstack_|sigaction_);
ok1(used >= 8*MiB - pgsz && used <= 8*MiB + pgsz);
used = 0;
- chkok( altstack(8*MiB, wrap, (void *) 100000, 0) == 0, 0,
+ chkok( altstack(8*MiB, wrap, int2ptr(100000), 0) == 0, 0,
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_|munmap_,
setrlimit_|munmap_|sigaltstack_|sigaction_);