Home | History | Annotate | Download | only in darwin
      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 
     12 int 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