13b7f39b501abf4ee81511d5fb027604f801cb37fnjn// This is a test for access_extended(), one of the more ridiculous syscalls
23b7f39b501abf4ee81511d5fb027604f801cb37fnjn// ever devised.  For bug 200760.  See the comments on the wrapper in
33b7f39b501abf4ee81511d5fb027604f801cb37fnjn// syswrap-darwin.c to understand what is going on here.
43b7f39b501abf4ee81511d5fb027604f801cb37fnjn
53b7f39b501abf4ee81511d5fb027604f801cb37fnjn#include <sys/syscall.h>
63b7f39b501abf4ee81511d5fb027604f801cb37fnjn#include <unistd.h>
73b7f39b501abf4ee81511d5fb027604f801cb37fnjn#include <stdio.h>
83b7f39b501abf4ee81511d5fb027604f801cb37fnjn#include <stdlib.h>
93b7f39b501abf4ee81511d5fb027604f801cb37fnjn#include <string.h>
103b7f39b501abf4ee81511d5fb027604f801cb37fnjn
113b7f39b501abf4ee81511d5fb027604f801cb37fnjnint main(void)
123b7f39b501abf4ee81511d5fb027604f801cb37fnjn{
133b7f39b501abf4ee81511d5fb027604f801cb37fnjn   char* name1 = "access_extended.c";
143b7f39b501abf4ee81511d5fb027604f801cb37fnjn   char* name2 = "no_such_file";
153b7f39b501abf4ee81511d5fb027604f801cb37fnjn   // Space for three descriptors and the two strings (and NUL chars for them).
163b7f39b501abf4ee81511d5fb027604f801cb37fnjn   size_t entries_szB =
173b7f39b501abf4ee81511d5fb027604f801cb37fnjn      sizeof(struct accessx_descriptor) * 3 +
183b7f39b501abf4ee81511d5fb027604f801cb37fnjn      strlen(name1) + 1 +
193b7f39b501abf4ee81511d5fb027604f801cb37fnjn      strlen(name2) + 1;
203b7f39b501abf4ee81511d5fb027604f801cb37fnjn   struct accessx_descriptor* entries = malloc(entries_szB);
213b7f39b501abf4ee81511d5fb027604f801cb37fnjn   char* string1 = (char*)&entries[3];
223b7f39b501abf4ee81511d5fb027604f801cb37fnjn   char* string2 = string1 + strlen(name1) + 1;
233b7f39b501abf4ee81511d5fb027604f801cb37fnjn   int results[3];
243b7f39b501abf4ee81511d5fb027604f801cb37fnjn   int retval;
253b7f39b501abf4ee81511d5fb027604f801cb37fnjn
263b7f39b501abf4ee81511d5fb027604f801cb37fnjn   entries[0].ad_name_offset = string1 - (char*)entries;
273b7f39b501abf4ee81511d5fb027604f801cb37fnjn   entries[1].ad_name_offset = 0;   // reuse the previous entry's string
283b7f39b501abf4ee81511d5fb027604f801cb37fnjn   entries[2].ad_name_offset = string2 - (char*)entries;
293b7f39b501abf4ee81511d5fb027604f801cb37fnjn   entries[0].ad_flags       = F_OK;      // succeeds
303b7f39b501abf4ee81511d5fb027604f801cb37fnjn   entries[1].ad_flags       = X_OK;      // fails
313b7f39b501abf4ee81511d5fb027604f801cb37fnjn   entries[2].ad_flags       = F_OK;      // fails
323b7f39b501abf4ee81511d5fb027604f801cb37fnjn   strcpy(string1, name1);
333b7f39b501abf4ee81511d5fb027604f801cb37fnjn   strcpy(string2, name2);
343b7f39b501abf4ee81511d5fb027604f801cb37fnjn
353b7f39b501abf4ee81511d5fb027604f801cb37fnjn   retval = syscall(SYS_access_extended, entries, entries_szB, results,
363b7f39b501abf4ee81511d5fb027604f801cb37fnjn                    /*uid--unused?*/0);
373b7f39b501abf4ee81511d5fb027604f801cb37fnjn
383b7f39b501abf4ee81511d5fb027604f801cb37fnjn   fprintf(stderr, "retval = %d\n", retval);
393b7f39b501abf4ee81511d5fb027604f801cb37fnjn   fprintf(stderr, "%s(F_OK) = %d (%s)\n",
403b7f39b501abf4ee81511d5fb027604f801cb37fnjn      name1, results[0], strerror(results[0]));
413b7f39b501abf4ee81511d5fb027604f801cb37fnjn   fprintf(stderr, "%s(X_OK) = %d (%s)\n",
423b7f39b501abf4ee81511d5fb027604f801cb37fnjn      name1, results[1], strerror(results[1]));
433b7f39b501abf4ee81511d5fb027604f801cb37fnjn   fprintf(stderr, "%s(F_OK) = %d (%s)\n",
443b7f39b501abf4ee81511d5fb027604f801cb37fnjn      name2, results[2], strerror(results[2]));
453b7f39b501abf4ee81511d5fb027604f801cb37fnjn
463b7f39b501abf4ee81511d5fb027604f801cb37fnjn   return 0;
473b7f39b501abf4ee81511d5fb027604f801cb37fnjn}
483b7f39b501abf4ee81511d5fb027604f801cb37fnjn
49