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