1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/syslimits.h> 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// On Darwin there's this secret fourth argument, 'apple', which is a pointer 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// to a string that contains the executable path, like argv[0], but unlike 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// argv[0] it can't be changed using exec(). 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char *argv[], char *envp[], char *apple[]) 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char *pargv = calloc((PATH_MAX+1), sizeof(char)), 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *pappl = calloc((PATH_MAX+1), sizeof(char)); 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; envp[i]; i++) 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // envp[i]==NULL; envp[i+1]==apple[0]==executable_path 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(envp[i+1] == apple[0]); 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // Make sure realpath(argv[0]) == realpath(apple[0]). (realpath resolves 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // symlinks.) 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown realpath(argv[0], pargv); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown realpath(apple[0], pappl); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(0 == strcmp(pargv, pappl)); 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33