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