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