11static const char *persist_base, *persist_token;
12static int persist_write;
14static int block_size(
const char* text) {
17 unsigned long value = strtoul(text, &end, 10);
18 if (errno || !text[0] || *end || value < 1024 || value > 65536 || (value & (value - 1)))
24static int run(
const char* name,
int (*function)(
void)) {
25 printf(
"XATTR-CONTRACT: BEGIN %s\n", name);
34 _exit(result ? 1 : 0);
37 result = xa_reap(child, 45000);
38 printf(
"XATTR-CONTRACT: %s %s status=%d\n", result ?
"FAIL" :
"PASS", name, result);
43static int persistence(
void) {
44 return xa_persistence(persist_base, persist_token, persist_write);
47int main(
int argc,
char** argv) {
48 xa_page = (size_t)sysconf(_SC_PAGESIZE);
49 if (xa_page < 512 || xa_page > 65536 || (xa_page & (xa_page - 1)))
51 signal(SIGPIPE, SIG_IGN);
52 if (argc == 5 && (!strcmp(argv[1],
"persist-write") || !strcmp(argv[1],
"persist-read"))) {
53 if (block_size(argv[4]))
55 persist_base = argv[2];
56 persist_token = argv[3];
57 persist_write = !strcmp(argv[1],
"persist-write");
58 if (run(argv[1], persistence))
60 printf(
"XATTR-PERSIST-CONTRACT: END %s PASS token=%s\n", persist_write ?
"WRITE" :
"READ",
64 const char* selected = NULL;
65 for (
int n = 1; n < argc; ++n) {
66 if (!strcmp(argv[n],
"--block-size") && n + 1 < argc) {
67 if (block_size(argv[++n]))
75 fputs(
"XATTR-CONTRACT: verified Ext2 --block-size is required\n", stderr);
80 int (*function)(void);
82 {
"values", xa_values}, {
"admission", xa_admission}, {
"permissions", xa_permissions},
83 {
"lifetime", xa_lifetime}, {
"concurrency", xa_concurrency}, {
"events", xa_events},
86 for (
size_t n = 0; n <
sizeof(suites) /
sizeof(suites[0]); ++n) {
87 if (selected && strcmp(selected,
"all") && strcmp(selected, suites[n].name))
90 if (run(suites[n].name, suites[n].function))
95 puts(
"XATTR-CONTRACT: END PASS");