contrib/ksmtpproxy: SMTP proxy to ask account password in between sending mail
[navymail.git] / compat / progexe.c
blob708c1a20a947295f86841940f0381f62e6cb1cee
1 #include "navymail/compat/progexe.h"
2 #include "git-compat-util.h"
4 /*
5 * Determine path to program executable
6 * (based on example from http://stackoverflow.com/questions/2050961)
7 */
8 const char *xprogexe()
10 static char progexe_path[PATH_MAX+1];
12 #if defined(__linux__)
13 ssize_t len = readlink("/proc/self/exe", progexe_path, PATH_MAX);
14 if (len==-1)
15 die_errno("progexe: Cannot readlink /proc/self/exe");
17 progexe_path[len] = '\0';
19 #elif defined(_WIN32)
20 /* XXX not tested */
21 DWORD len = GetModuleFileNameA(NULL, progexe_path, PATH_MAX);
22 if (!len)
23 /* TODO use GetLastError here */
24 die("progexe: GetModuleFileNameA(NULL) failed");
26 #elif defined(__APPLE__) /* elif of: #elif defined(__linux__) */
27 /* XXX not tested, TODO cleanup */
28 #include <mach-o/dyld.h>
29 uint32_t pathNameSize = 0;
31 _NSGetExecutablePath(NULL, &pathNameSize);
33 if (pathNameSize > pathNameCapacity)
34 pathNameSize = pathNameCapacity;
36 if (!_NSGetExecutablePath(pathName, &pathNameSize))
38 char real[PATH_MAX];
40 if (realpath(pathName, real) != NULL)
42 pathNameSize = strlen(real);
43 strncpy(pathName, real, pathNameSize);
45 return pathNameSize;
48 die("progexe: fail on apple"); /* XXX error code ? */
50 #else
51 #error xprogexe: provide your own implementation
52 #endif
54 return progexe_path;