| #include <assert.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include "pub_tool_basics.h" |
| #include "vki/vki-scnums-darwin.h" |
| #include "pub_tool_vkiscnums.h" |
| |
| // Since we use vki_unistd.h, we can't include <unistd.h>. So we have to |
| // declare this ourselves. |
| extern int syscall (int __sysno, ...); |
| |
| // Thorough syscall scalar arg checking. Also serves as thorough checking |
| // for (very) basic syscall use. Generally not trying to do anything |
| // meaningful with the syscalls. |
| |
| #define GO(__NR_xxx, N, s) \ |
| fprintf(stderr, "-----------------------------------------------------\n" \ |
| "x%lx(%d):%20s %s\n" \ |
| "-----------------------------------------------------\n", \ |
| (unsigned long)__NR_xxx, N, #__NR_xxx, s); |
| |
| #define GO_UNIMP(n, s) \ |
| fprintf(stderr, "-----------------------------------------------------\n" \ |
| "%-17s%s\n" \ |
| "-----------------------------------------------------\n", \ |
| "("#n"): ", s); |
| |
| #define SY(__NR_xxx, args...) res = syscall(__NR_xxx, ##args); |
| |
| #define FAIL assert(-1 == res); |
| #define SUCC assert(-1 != res); |
| #define SUCC_OR_FAIL /* no test */ |
| |
| #define FAILx(E) \ |
| do { \ |
| int myerrno = errno; \ |
| if (-1 == res) { \ |
| if (E == myerrno) { \ |
| /* as expected */ \ |
| } else { \ |
| fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \ |
| exit(1); \ |
| } \ |
| } else { \ |
| fprintf(stderr, "Expected error %s (%d), got success\n", #E, E); \ |
| exit(1); \ |
| } \ |
| } while (0); |
| |
| #define SUCC_OR_FAILx(E) \ |
| do { \ |
| int myerrno = errno; \ |
| if (-1 == res) { \ |
| if (E == myerrno) { \ |
| /* as expected */ \ |
| } else { \ |
| fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \ |
| exit(1); \ |
| } \ |
| } \ |
| } while (0); |