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