4 #define MAXPATHLEN 8192
12 int _NSGetExecutablePath(char *path
, uint32_t *capacity
) {
13 int bufferCapacity
= MAXPATHLEN
;
14 uint16_t buffer
[bufferCapacity
+ 1];
15 DWORD i
, bufferSize
= GetModuleFileNameW(GetModuleHandle(NULL
), buffer
, bufferCapacity
);
17 for(i
= 0; i
< bufferSize
; i
++)
21 int size
= WideCharToMultiByte(CP_UTF8
, 0, buffer
, bufferSize
, NULL
, 0, NULL
, NULL
);
23 if(size
+ 1 > *capacity
) {
28 size
= WideCharToMultiByte(CP_UTF8
, 0, buffer
, bufferSize
, path
, *capacity
, NULL
, NULL
);
37 // FIXME: these implementations do not return the size needed
41 int _NSGetExecutablePath(char *path
, uint32_t *capacity
) {
42 if(*capacity
< MAXPATHLEN
)
45 if((*capacity
= readlink("/proc/self/exe", path
, *capacity
)) < 0) {
53 #elif defined(__APPLE__)
55 extern int _NSGetExecutablePath(char *path
, uint32_t *capacity
);
59 int _NSGetExecutablePath(char *path
, uint32_t *capacity
) {
61 if(*capacity
< MAXPATHLEN
)
68 mib
[2] = KERN_PROC_PATHNAME
;
71 size_t cb
= *capacity
;
73 if(sysctl(mib
, 4, path
, &cb
, NULL
, 0) < 0) {
77 *capacity
= strlen(path
);
81 if(*capacity
< MAXPATHLEN
)
86 if((length
= readlink("/proc/curproc/file", path
, 1024)) < 0) {
96 #elif defined(SOLARIS)
98 int _NSGetExecutablePath(char *path
, uint32_t *capacity
) {
99 if(*capacity
< MAXPATHLEN
)
102 char probe
[MAXPATHLEN
+ 1];
104 sprintf(probe
, "/proc/%ld/path/a.out", (long)getpid());
106 if((*capacity
= readlink(probe
, path
, *capacity
)) < 0) {