Home » U++ Library support » U++ Core » GetExeFilePath() in Linux
|
|
Re: GetExeFilePath() in Linux [message #6431 is a reply to message #6411] |
Sun, 12 November 2006 18:11   |
masu
Messages: 378 Registered: February 2006
|
Senior Member |
|
|
I tried the latest version and got the right path with mounted proc and also without.
I had to make a tiny change (marked red, therefore the ugly formatting ).
luzr wrote on Sat, 11 November 2006 12:48 | OK, this is my final version:
const char *procexepath_() {
static char h[_MAX_PATH + 1];
ONCELOCK {
char link[100];
sprintf(link, "/proc/%d/exe", getpid());
int ret = readlink(link, h, _MAX_PATH);
if(ret > 0 && ret < _MAX_PATH)
h[ret] = '\0';
else
*h = '\0';
}
return h;
}
String GetExeFilePath()
{
static String exepath;
ONCELOCK {
const char *exe = procexepath_();
if(*exe)
exepath = exe;
else {
String x = Argv0__;
if(IsFullPath(x) && FileExists(x))
exepath = x;
else {
exepath = GetHomeDirFile("upp");
Vector<String> p = Split(FromSystemCharset(Environment().Get("PATH")), ':');
if(x.Find('/') >= 0)
p.Add(GetCurrentDirectory());
for(int i = 0; i < p.GetCount(); i++) {
String ep = NormalizePath(AppendFileName(p[i], x));
if(FileExists(ep))
exepath = ep;
}
}
}
}
return exepath;
}
Please check.
Mirek
P.S.: I need the name of executable in log files, without using the heap and before entering the main - that is why I have separated "procexepath_"...
|
Also, I think we should delete the green line since the result defaults to $HOME/app_name even if it does not exist. The application has to be in the PATH or in the current dir if it was not specified with the complete path on the command line. So this assignment is useless in my opinion since we check all possibilities.
Function SetExeTitle does not exist anymore, commented out in idewin.cpp:
#ifdef _DEBUG
SetExeTitle("debugide");
#else
SetExeTitle("theide");
#endif
Matthias
931b81e7ea53320dccc37375b34b38c3
[Updated on: Sun, 12 November 2006 18:27] Report message to a moderator
|
|
|
|
|
Re: GetExeFilePath() in Linux [message #6683 is a reply to message #6681] |
Wed, 22 November 2006 19:04   |
guido
Messages: 169 Registered: April 2006
|
Experienced Member |
|
|
luzr wrote on Wed, 22 November 2006 16:30 | Well, I was thinking about this last 4 days (of course, not all the time) and I must admit I am completely clueless how is this supposed to work...
|
Well, as a shell script this method works. You can download e.g. OpenOffice or Firefox from their original site, extract into your home dir and run from there. And that's how they do it. Just open the launch wrapper and see.
If, however, this works without going through a shell in all cases, I'm not sure.
I created a sample console app, which prints exepath to stdout, and a gui app, which pops up a dialog with the exepath, and that worked fine, launching from both a terminal or the file-manager.
Guido
|
|
|
|
Re: GetExeFilePath() in Linux [message #6687 is a reply to message #6684] |
Wed, 22 November 2006 22:53   |
guido
Messages: 169 Registered: April 2006
|
Experienced Member |
|
|
luzr wrote on Wed, 22 November 2006 19:10 | OK, what seem wrong to me:
You have your "foo" application somewhere on the PATH. You start it by typing "foo" -> no '\' in the name -> x = x.Left(x.ReverseFind('/')) crashes.
Mirek
|
Oops, sorry 
Well, then, when x.ReverseFind('/') fails, a path search, like your current implementation, must be done.
Or this is how OO.org does it:
guido@Sid:~$ cat /usr/bin/openoffice.org-2.0
#!/bin/sh
exec /etc/openoffice.org-2.0/program/soffice "$@"
I only suggest it, because I'm familiar with this method, and because it's portable across POSIX systems. I know, it is how ISPs deal with it, to make their software relocatable and distribution independent.
Guido
|
|
|
|
Goto Forum:
Current Time: Sat Apr 26 14:21:43 CEST 2025
Total time taken to generate the page: 0.01140 seconds
|