1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <fcntl.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h"
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "vki/vki-scnums-darwin.h"
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_vkiscnums.h"
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Since we use vki_unistd.h, we can't include <unistd.h>.  So we have to
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// declare this ourselves.
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int syscall (int __sysno, ...);
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Thorough syscall scalar arg checking.  Also serves as thorough checking
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// for (very) basic syscall use.  Generally not trying to do anything
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// meaningful with the syscalls.
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GO(__NR_xxx, N, s) \
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "-----------------------------------------------------\n"  \
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "x%lx(%d):%20s %s\n"                                       \
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "-----------------------------------------------------\n", \
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   (unsigned long)__NR_xxx, N, #__NR_xxx, s);
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GO_UNIMP(n, s) \
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "-----------------------------------------------------\n"  \
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "%-17s%s\n"                                                \
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "-----------------------------------------------------\n", \
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   "("#n"):     ", s);
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SY(__NR_xxx, args...)    res = syscall(__NR_xxx, ##args);
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FAIL  assert(-1 == res);
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SUCC  assert(-1 != res);
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SUCC_OR_FAIL    /* no test */
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FAILx(E) \
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { \
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int myerrno = errno; \
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (-1 == res) { \
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (E == myerrno) { \
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* as expected */ \
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else { \
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         exit(1); \
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } \
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else { \
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Expected error %s (%d), got success\n", #E, E); \
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         exit(1); \
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } \
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0);
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SUCC_OR_FAILx(E) \
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   do { \
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int myerrno = errno; \
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (-1 == res) { \
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (E == myerrno) { \
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            /* as expected */ \
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } else { \
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         exit(1); \
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         } \
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } \
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } while (0);
65