#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <unistd.h> #include <sys/syslimits.h> // On Darwin there's this secret fourth argument, 'apple', which is a pointer // to a string that contains the executable path, like argv[0], but unlike // argv[0] it can't be changed using exec(). int main(int argc, char *argv[], char *envp[], char *apple[]) { char *pargv = calloc((PATH_MAX+1), sizeof(char)), *pappl = calloc((PATH_MAX+1), sizeof(char)); int i; for (i = 0; envp[i]; i++) ; // envp[i]==NULL; envp[i+1]==apple[0]==executable_path assert(envp[i+1] == apple[0]); // Make sure realpath(argv[0]) == realpath(apple[0]). (realpath resolves // symlinks.) realpath(argv[0], pargv); realpath(apple[0], pappl); assert(0 == strcmp(pargv, pappl)); return 0; }