1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This is a test for access_extended(), one of the more ridiculous syscalls
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// ever devised.  For bug 200760.  See the comments on the wrapper in
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// syswrap-darwin.c to understand what is going on here.
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/syscall.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h>
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h>
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void)
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char* name1 = "access_extended.c";
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char* name2 = "no_such_file";
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Space for three descriptors and the two strings (and NUL chars for them).
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   size_t entries_szB =
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      sizeof(struct accessx_descriptor) * 3 +
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      strlen(name1) + 1 +
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      strlen(name2) + 1;
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct accessx_descriptor* entries = malloc(entries_szB);
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char* string1 = (char*)&entries[3];
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   char* string2 = string1 + strlen(name1) + 1;
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int results[3];
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int retval;
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entries[0].ad_name_offset = string1 - (char*)entries;
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entries[1].ad_name_offset = 0;   // reuse the previous entry's string
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entries[2].ad_name_offset = string2 - (char*)entries;
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entries[0].ad_flags       = F_OK;      // succeeds
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entries[1].ad_flags       = X_OK;      // fails
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entries[2].ad_flags       = F_OK;      // fails
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   strcpy(string1, name1);
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   strcpy(string2, name2);
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   retval = syscall(SYS_access_extended, entries, entries_szB, results,
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    /*uid--unused?*/0);
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "retval = %d\n", retval);
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "%s(F_OK) = %d (%s)\n",
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      name1, results[0], strerror(results[0]));
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "%s(X_OK) = %d (%s)\n",
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      name1, results[1], strerror(results[1]));
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   fprintf(stderr, "%s(F_OK) = %d (%s)\n",
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      name2, results[2], strerror(results[2]));
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49