Merge pull request #10 from gunyarakun/fix-invalid-return
[cocotron.git] / objc / dyld.c
blob66c5508c1eee43bf17dfc2538ad8bccbcb4a09a8
1 #import <objc/dyld.h>
3 #ifndef MAXPATHLEN
4 #define MAXPATHLEN 8192
5 #endif
7 #if defined(WIN32)
9 #import <windows.h>
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++)
18 if(buffer[i] == '\\')
19 buffer[i] = '/';
21 int size = WideCharToMultiByte(CP_UTF8, 0, buffer, bufferSize, NULL, 0, NULL, NULL);
23 if(size + 1 > *capacity) {
24 *capacity = size + 1;
25 return -1;
28 size = WideCharToMultiByte(CP_UTF8, 0, buffer, bufferSize, path, *capacity, NULL, NULL);
29 path[size] = '\0';
30 size++;
32 *capacity = size;
34 return 0;
37 // FIXME: these implementations do not return the size needed
39 #elif defined(LINUX)
41 int _NSGetExecutablePath(char *path, uint32_t *capacity) {
42 if(*capacity < MAXPATHLEN)
43 return MAXPATHLEN;
45 if((*capacity = readlink("/proc/self/exe", path, *capacity)) < 0) {
46 *capacity = 0;
47 return -1;
50 return 0;
53 #elif defined(__APPLE__)
55 extern int _NSGetExecutablePath(char *path, uint32_t *capacity);
57 #elif defined(BSD)
59 int _NSGetExecutablePath(char *path, uint32_t *capacity) {
60 #if defined(FREEBSD)
61 if(*capacity < MAXPATHLEN)
62 return MAXPATHLEN;
64 int mib[4];
66 mib[0] = CTL_KERN;
67 mib[1] = KERN_PROC;
68 mib[2] = KERN_PROC_PATHNAME;
69 mib[3] = -1;
71 size_t cb = *capacity;
73 if(sysctl(mib, 4, path, &cb, NULL, 0) < 0) {
74 *capacity = 0;
75 return -1;
77 *capacity = strlen(path);
79 return 0;
80 #else
81 if(*capacity < MAXPATHLEN)
82 return MAXPATHLEN;
84 int length;
86 if((length = readlink("/proc/curproc/file", path, 1024)) < 0) {
87 *capacity = 0;
88 return -1;
90 *capacity = length;
92 #endif
93 return 0;
96 #elif defined(SOLARIS)
98 int _NSGetExecutablePath(char *path, uint32_t *capacity) {
99 if(*capacity < MAXPATHLEN)
100 return MAXPATHLEN;
102 char probe[MAXPATHLEN + 1];
104 sprintf(probe, "/proc/%ld/path/a.out", (long)getpid());
106 if((*capacity = readlink(probe, path, *capacity)) < 0) {
107 *capacity = 0;
108 return -1;
111 return 0;
113 #endif