> How to get the environment at this stage? At least the executeable
> path for a relocated initialisation would be desireable.
> Currently I parse
> from argv[0] in main().
The following bit of C code returns a path to the exe on a range of
platforms - this may be useful to you?
------------------------------------------------
/*
* Mechanism to handle determining *where* the exe actually lives
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#ifdef WIN32
#include <windows.h> /* GetModuleFileName */
#endif /* WIN32 */
#ifdef __APPLE__ /* assume this is OSX */
#include <sys/param.h>
#include <mach-o/dyld.h> /* _NSGetExecutablePath : must add -framework
CoreFoundation to link line */
#include <string.h>
# ifndef PATH_MAX
# define PATH_MAX MAXPATHLEN
# endif
#endif /* APPLE */
#ifndef PATH_MAX
# define PATH_MAX 2048
#endif
#include "get_app_path.h"
/***********************************************************************
*********************/
int get_app_path (char *pname, size_t pathsize)
{
long result;
#ifdef LINUX
/* Oddly, the readlink(2) man page says no NULL is appended. */
/* So you have to do it yourself, based on the return value: */
pathsize --; /* Preserve a space to add the trailing NULL */
result = readlink("/proc/self/exe", pname, pathsize);
if (result > 0)
{
pname[result] = 0; /* add the [EMAIL PROTECTED] NULL */
if ((access(pname, 0) == 0))
return 0; /* file exists, return OK */
/*else name doesn't seem to exist, return FAIL (falls
through) */
}
#endif /* LINUX */
#ifdef WIN32
result = GetModuleFileName(NULL, pname, pathsize);
if (result > 0)
{
/* fix up the dir slashes... */
int len = strlen(pname);
int idx;
for (idx = 0; idx < len; idx++)
{
if (pname[idx] == '\\') pname[idx] = '/';
}
if ((access(pname, 0) == 0))
return 0; /* file exists, return OK */
/*else name doesn't seem to exist, return FAIL (falls
through) */
}
#endif /* WIN32 */
#ifdef SOLARIS
char *p = getexecname();
if (p)
{
/* According to the Sun manpages, getexecname will
"normally" return an */
/* absolute path - BUT might not... AND that IF it is not,
pre-pending */
/* getcwd() will "usually" be the correct thing... Urgh!
*/
/* check pathname is absolute (begins with a / ???) */
if (p[0] == '/') /* assume this means we have an
absolute path */
{
strncpy(pname, p, pathsize);
if ((access(pname, 0) == 0))
return 0; /* file exists, return OK */
}
else /* if not, prepend getcwd() then check if file
exists */
{
getcwd(pname, pathsize);
result = strlen(pname);
strncat(pname, "/", (pathsize - result));
result ++;
strncat(pname, p, (pathsize - result));
if ((access(pname, 0) == 0))
return 0; /* file exists, return OK */
/*else name doesn't seem to exist, return FAIL
(falls through) */
}
}
#endif /* SOLARIS */
#ifdef __APPLE__ /* assume this is OSX */
/*
from http://www.hmug.org/man/3/NSModule.html
extern int _NSGetExecutablePath(char *buf, unsigned long
*bufsize);
_NSGetExecutablePath copies the path of the executable
into the buffer and returns 0 if the path was successfully
copied in the provided buffer. If the buffer is not large
enough, -1 is returned and the expected buffer size is
copied in *bufsize. Note that _NSGetExecutablePath will
return "a path" to the executable not a "real path" to the
executable. That is the path may be a symbolic link and
not the real file. And with deep directories the total
bufsize needed could be more than MAXPATHLEN.
*/
int status = -1;
char *given_path = malloc(MAXPATHLEN * 2);
if (!given_path) return status;
pathsize = MAXPATHLEN * 2;
result = _NSGetExecutablePath(given_path, &pathsize);
if (result == 0)
{ /* OK, we got something - now try and resolve the real path...
*/
if (realpath(given_path, pname) != NULL)
{
if ((access(pname, 0) == 0))
status = 0; /* file exists, return OK */
}
}
free (given_path);
return status;
#endif /* APPLE */
return -1; /* Path Lookup Failed */
} /* where_do_I_live */
/***********************************************************************
*********************/
/* End of File */
SELEX Sensors and Airborne Systems Limited
Registered Office: Sigma House, Christopher Martin Road, Basildon, Essex SS14
3EL
A company registered in England & Wales. Company no. 02426132
********************************************************************
This email and any attachments are confidential to the intended
recipient and may also be privileged. If you are not the intended
recipient please delete it from your system and notify the sender.
You should not copy it or use it for any purpose nor disclose or
distribute its contents to any other person.
********************************************************************
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk