Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 19, 2004 undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Hi all. I'm trying to use the execv function in std.process, but when the program links, it gives me an undefined reference to `execvpe' message. This is using the latest dmd on a linux system. |
August 19, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ameer Armaly | In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > >Hi all. >I'm trying to use the execv function in std.process, but when the program >links, it gives me an undefined reference to `execvpe' message. >This is using the latest dmd on a linux system. > > I get that too. I don't know why: the prototype for execvpe is in std.c.process (which std.process imports)... I even tried re-compiling the library, but it still failed. |
August 20, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to kinghajj | kinghajj wrote: > In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > >>Hi all. >>I'm trying to use the execv function in std.process, but when the program links, it gives me an undefined reference to `execvpe' message. >>This is using the latest dmd on a linux system. >> >> > > I get that too. I don't know why: the prototype for execvpe is in std.c.process > (which std.process imports)... I even tried re-compiling the library, but it > still failed. Phobos uses execvpe(), but it isn't implemented by glibc, at least on my system. execvpe() is just like execve(), except that it searches through your $PATH to find the executable. So I added this function to my program, which seemed to make it work. Feel free to fix the code if you find any bugs: // HACK HACK HACK // phobos uses execvpe(), which is not implemented in glibc. This // implementation provides what is missing. /* execvpe() - execve() with PATH search */ import std.c.process; import std.c.stdlib; import std.string; extern (C) int execvpe(char *file_arg, char **argv, char **envp) { int ret; char[] file = file_arg[0..strlen(file_arg)]; char[] path; char[] next; char *temp = getenv("PATH"); path = temp[0..strlen(temp)]; while(path.length > 0) { temp = strchr(path, ':'); if(temp == null) next.length = 0; else { next = path[temp-cast(char*)path+1..length]; path = path[0..temp-cast(char*)path]; } // If the exectuable is found, then this never returns. // But if the executable is not found, then this returns // some nonzero value. ret = execve(path~"/"~file, argv, envp); path = next; } return ret; } |
August 20, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to kinghajj | It's my fault. I didn't do the due diligence for ensuring that the APIs were available on Linux. It's been noted, and is on the list for a fix. (Which might be to remove it!) Alternatively, we might do a custom search, as has been suggested by Russ. (I'm just looking at that now.) "kinghajj" <kinghajj_member@pathlink.com> wrote in message news:cg358e$2hh6$1@digitaldaemon.com... > In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > > > >Hi all. > >I'm trying to use the execv function in std.process, but when the program > >links, it gives me an undefined reference to `execvpe' message. > >This is using the latest dmd on a linux system. > > > > > I get that too. I don't know why: the prototype for execvpe is in std.c.process (which std.process imports)... I even tried re-compiling the library, but it still failed. > > |
August 20, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russ Lewis | Russ, I'll take this as a basis for a permanent fix, if that's ok with you? (I've some ideas for making it a bit neater, and we would only implement the D version, but essentially it's a sound idea.) "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg4udj$b0j$1@digitaldaemon.com... > kinghajj wrote: > > In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > > > >>Hi all. > >>I'm trying to use the execv function in std.process, but when the program > >>links, it gives me an undefined reference to `execvpe' message. > >>This is using the latest dmd on a linux system. > >> > >> > > > > I get that too. I don't know why: the prototype for execvpe is in std.c.process (which std.process imports)... I even tried re-compiling the library, but it still failed. > > Phobos uses execvpe(), but it isn't implemented by glibc, at least on my > system. execvpe() is just like execve(), except that it searches > through your $PATH to find the executable. So I added this function to > my program, which seemed to make it work. Feel free to fix the code if > you find any bugs: > > > > // HACK HACK HACK > // phobos uses execvpe(), which is not implemented in glibc. This > // implementation provides what is missing. > > > > /* execvpe() - execve() with PATH search */ > import std.c.process; > import std.c.stdlib; > import std.string; > extern (C) int execvpe(char *file_arg, char **argv, char **envp) { > int ret; > > > > char[] file = file_arg[0..strlen(file_arg)]; > char[] path; > char[] next; > > > > char *temp = getenv("PATH"); > > > > path = temp[0..strlen(temp)]; > > > > while(path.length > 0) { > temp = strchr(path, ':'); > > > > if(temp == null) > next.length = 0; > else { > next = path[temp-cast(char*)path+1..length]; > path = path[0..temp-cast(char*)path]; > } > > > > // If the exectuable is found, then this never returns. > // But if the executable is not found, then this returns > // some nonzero value. > ret = execve(path~"/"~file, argv, envp); > > > > path = next; > } > > > > return ret; > } > |
August 20, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matthew | I don't mind, but I can't guarantee it isn't buggy. In particular, I think that I should have added ~\0 on the execve() call. Right?
Matthew wrote:
> Russ, I'll take this as a basis for a permanent fix, if that's ok with you? (I've some ideas for making it a bit neater,
> and we would only implement the D version, but essentially it's a sound idea.)
>
> "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg4udj$b0j$1@digitaldaemon.com...
>
>>kinghajj wrote:
>>
>>>In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says...
>>>
>>>
>>>>Hi all.
>>>>I'm trying to use the execv function in std.process, but when the program
>>>>links, it gives me an undefined reference to `execvpe' message.
>>>>This is using the latest dmd on a linux system.
>>>>
>>>>
>>>
>>>I get that too. I don't know why: the prototype for execvpe is in std.c.process
>>>(which std.process imports)... I even tried re-compiling the library, but it
>>>still failed.
>>
>>Phobos uses execvpe(), but it isn't implemented by glibc, at least on my
>>system. execvpe() is just like execve(), except that it searches
>>through your $PATH to find the executable. So I added this function to
>>my program, which seemed to make it work. Feel free to fix the code if
>>you find any bugs:
>>
>>
>>
>>// HACK HACK HACK
>>// phobos uses execvpe(), which is not implemented in glibc. This
>>// implementation provides what is missing.
>>
>>
>>
>>/* execvpe() - execve() with PATH search */
>>import std.c.process;
>>import std.c.stdlib;
>>import std.string;
>>extern (C) int execvpe(char *file_arg, char **argv, char **envp) {
>> int ret;
>>
>>
>>
>> char[] file = file_arg[0..strlen(file_arg)];
>> char[] path;
>> char[] next;
>>
>>
>>
>> char *temp = getenv("PATH");
>>
>>
>>
>> path = temp[0..strlen(temp)];
>>
>>
>>
>> while(path.length > 0) {
>> temp = strchr(path, ':');
>>
>>
>>
>> if(temp == null)
>> next.length = 0;
>> else {
>> next = path[temp-cast(char*)path+1..length];
>> path = path[0..temp-cast(char*)path];
>> }
>>
>>
>>
>> // If the exectuable is found, then this never returns.
>> // But if the executable is not found, then this returns
>> // some nonzero value.
>> ret = execve(path~"/"~file, argv, envp);
>>
>>
>>
>> path = next;
>> }
>>
>>
>>
>> return ret;
>>}
|
August 21, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russ Lewis | No worries, mate. I just meant I'd steal the idea. I'm a pathological rewriter. ;) Are you, or is anyone else, up for testing this on Linux? (I'm yet to set up D on my linux box, and I am woefully short on time. Of course, this probably means I shouldn't write any more multi-platform code before I do ...<G>) "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg62sj$uof$1@digitaldaemon.com... > I don't mind, but I can't guarantee it isn't buggy. In particular, I think that I should have added ~\0 on the execve() call. Right? > > Matthew wrote: > > Russ, I'll take this as a basis for a permanent fix, if that's ok with you? (I've some ideas for making it a bit neater, > > and we would only implement the D version, but essentially it's a sound idea.) > > > > "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg4udj$b0j$1@digitaldaemon.com... > > > >>kinghajj wrote: > >> > >>>In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > >>> > >>> > >>>>Hi all. > >>>>I'm trying to use the execv function in std.process, but when the program > >>>>links, it gives me an undefined reference to `execvpe' message. > >>>>This is using the latest dmd on a linux system. > >>>> > >>>> > >>> > >>>I get that too. I don't know why: the prototype for execvpe is in std.c.process (which std.process imports)... I even tried re-compiling the library, but it still failed. > >> > >>Phobos uses execvpe(), but it isn't implemented by glibc, at least on my > >>system. execvpe() is just like execve(), except that it searches > >>through your $PATH to find the executable. So I added this function to > >>my program, which seemed to make it work. Feel free to fix the code if > >>you find any bugs: > >> > >> > >> > >>// HACK HACK HACK > >>// phobos uses execvpe(), which is not implemented in glibc. This > >>// implementation provides what is missing. > >> > >> > >> > >>/* execvpe() - execve() with PATH search */ > >>import std.c.process; > >>import std.c.stdlib; > >>import std.string; > >>extern (C) int execvpe(char *file_arg, char **argv, char **envp) { > >> int ret; > >> > >> > >> > >> char[] file = file_arg[0..strlen(file_arg)]; > >> char[] path; > >> char[] next; > >> > >> > >> > >> char *temp = getenv("PATH"); > >> > >> > >> > >> path = temp[0..strlen(temp)]; > >> > >> > >> > >> while(path.length > 0) { > >> temp = strchr(path, ':'); > >> > >> > >> > >> if(temp == null) > >> next.length = 0; > >> else { > >> next = path[temp-cast(char*)path+1..length]; > >> path = path[0..temp-cast(char*)path]; > >> } > >> > >> > >> > >> // If the exectuable is found, then this never returns. > >> // But if the executable is not found, then this returns > >> // some nonzero value. > >> ret = execve(path~"/"~file, argv, envp); > >> > >> > >> > >> path = next; > >> } > >> > >> > >> > >> return ret; > >>} > |
August 21, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russ Lewis | I'm posting the link to an alpha on the bugs ng shortly. If you can do a test, and report back to the bugs ng, that'd be great! "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg62sj$uof$1@digitaldaemon.com... > I don't mind, but I can't guarantee it isn't buggy. In particular, I think that I should have added ~\0 on the execve() call. Right? > > Matthew wrote: > > Russ, I'll take this as a basis for a permanent fix, if that's ok with you? (I've some ideas for making it a bit neater, > > and we would only implement the D version, but essentially it's a sound idea.) > > > > "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg4udj$b0j$1@digitaldaemon.com... > > > >>kinghajj wrote: > >> > >>>In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > >>> > >>> > >>>>Hi all. > >>>>I'm trying to use the execv function in std.process, but when the program > >>>>links, it gives me an undefined reference to `execvpe' message. > >>>>This is using the latest dmd on a linux system. > >>>> > >>>> > >>> > >>>I get that too. I don't know why: the prototype for execvpe is in std.c.process (which std.process imports)... I even tried re-compiling the library, but it still failed. > >> > >>Phobos uses execvpe(), but it isn't implemented by glibc, at least on my > >>system. execvpe() is just like execve(), except that it searches > >>through your $PATH to find the executable. So I added this function to > >>my program, which seemed to make it work. Feel free to fix the code if > >>you find any bugs: > >> > >> > >> > >>// HACK HACK HACK > >>// phobos uses execvpe(), which is not implemented in glibc. This > >>// implementation provides what is missing. > >> > >> > >> > >>/* execvpe() - execve() with PATH search */ > >>import std.c.process; > >>import std.c.stdlib; > >>import std.string; > >>extern (C) int execvpe(char *file_arg, char **argv, char **envp) { > >> int ret; > >> > >> > >> > >> char[] file = file_arg[0..strlen(file_arg)]; > >> char[] path; > >> char[] next; > >> > >> > >> > >> char *temp = getenv("PATH"); > >> > >> > >> > >> path = temp[0..strlen(temp)]; > >> > >> > >> > >> while(path.length > 0) { > >> temp = strchr(path, ':'); > >> > >> > >> > >> if(temp == null) > >> next.length = 0; > >> else { > >> next = path[temp-cast(char*)path+1..length]; > >> path = path[0..temp-cast(char*)path]; > >> } > >> > >> > >> > >> // If the exectuable is found, then this never returns. > >> // But if the executable is not found, then this returns > >> // some nonzero value. > >> ret = execve(path~"/"~file, argv, envp); > >> > >> > >> > >> path = next; > >> } > >> > >> > >> > >> return ret; > >>} > |
August 21, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matthew | Matthew wrote: > No worries, mate. I just meant I'd steal the idea. I'm a pathological rewriter. ;) > > Are you, or is anyone else, up for testing this on Linux? (I'm yet to set up D on my linux box, and I am woefully short on time. Of > course, this probably means I shouldn't write any more multi-platform code before I do ...<G>) > > "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg62sj$uof$1@digitaldaemon.com... > >>I don't mind, but I can't guarantee it isn't buggy. In particular, I >>think that I should have added ~\0 on the execve() call. Right? >> >>Matthew wrote: >> >>> Russ, I'll take this as a basis for a permanent fix, if that's >>> ok with you? (I've some ideas for making it a bit >>> neater, and we would only implement the D version, but >>> essentially it's a sound idea.) >>> >>>"Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote: >>>>kinghajj wrote: >>>>>In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... >>>>>> I'm trying to use the execv function in std.process, but when the program links, it gives me an undefined >>>>>> reference to `execvpe' message. This is using the latest >>>>>> dmd on a linux system. >>>>> >>>>> I get that too. I don't know why: the prototype for execvpe >>>>> is in std.c.process (which std.process imports)... I even >>>>> tried re-compiling the library, but it still failed. >>>> >>>> Phobos uses execvpe(), but it isn't implemented by glibc, at least on my system. execvpe() is just like execve(), except >>>> that it searches through your $PATH to find the executable. >>>> So I added this function to my program, which seemed to make >>>> it work. Feel free to fix the code if you find any bugs: >>>> >>>> // HACK HACK HACK >>>> // phobos uses execvpe(), which is not implemented in glibc. >>>> // This implementation provides what is missing. >>>> >>>>/* execvpe() - execve() with PATH search */ Wouldn't it be easier to do it as 'execvp() setting the environment'? In C (sorry, I'm still more fluent in that): extern char **environ; int execvp(char *file_arg, char **argv, char **envp) { char **old_env = environ; environ = envp; execvp(file_arg, argv); // Oops - must have failed! environ = old_env; return(-1); } FYI: environ is the one variable defined by POSIX with no standard header. -- Jonathan Leffler #include <disclaimer.h> Email: jleffler@earthlink.net, jleffler@us.ibm.com Guardian of DBD::Informix v2003.04 -- http://dbi.perl.org/ |
August 21, 2004 Re: undefined reference to `execvpe' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Leffler | "Jonathan Leffler" <jleffler@earthlink.net> wrote in message news:cg6e21$146m$1@digitaldaemon.com... > Matthew wrote: > > > No worries, mate. I just meant I'd steal the idea. I'm a pathological rewriter. ;) > > > > Are you, or is anyone else, up for testing this on Linux? (I'm yet to set up D on my linux box, and I am woefully short on time. Of course, this probably means I shouldn't write any more multi-platform code before I do ...<G>) > > > > "Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote in message news:cg62sj$uof$1@digitaldaemon.com... > > > >>I don't mind, but I can't guarantee it isn't buggy. In particular, I think that I should have added ~\0 on the execve() call. Right? > >> > >>Matthew wrote: > >> > >>> Russ, I'll take this as a basis for a permanent fix, if that's > >>> ok with you? (I've some ideas for making it a bit > >>> neater, and we would only implement the D version, but > >>> essentially it's a sound idea.) > >>> > >>>"Russ Lewis" <spamhole-2001-07-16@deming-os.org> wrote: > >>>>kinghajj wrote: > >>>>>In article <Pine.LNX.4.61.0408191703500.3453@debian>, Ameer Armaly says... > >>>>>> I'm trying to use the execv function in std.process, but > >>>>>> when the program links, it gives me an undefined > >>>>>> reference to `execvpe' message. This is using the latest > >>>>>> dmd on a linux system. > >>>>> > >>>>> I get that too. I don't know why: the prototype for execvpe > >>>>> is in std.c.process (which std.process imports)... I even > >>>>> tried re-compiling the library, but it still failed. > >>>> > >>>> Phobos uses execvpe(), but it isn't implemented by glibc, at > >>>> least on my system. execvpe() is just like execve(), except > >>>> that it searches through your $PATH to find the executable. > >>>> So I added this function to my program, which seemed to make > >>>> it work. Feel free to fix the code if you find any bugs: > >>>> > >>>> // HACK HACK HACK > >>>> // phobos uses execvpe(), which is not implemented in glibc. > >>>> // This implementation provides what is missing. > >>>> > >>>>/* execvpe() - execve() with PATH search */ > > > Wouldn't it be easier to do it as 'execvp() setting the environment'? > > In C (sorry, I'm still more fluent in that): > > extern char **environ; > > int execvp(char *file_arg, char **argv, char **envp) > { > char **old_env = environ; > environ = envp; > execvp(file_arg, argv); > // Oops - must have failed! > environ = old_env; > return(-1); > } > > FYI: environ is the one variable defined by POSIX with no standard header. Indeed. But I don't think D supports that. (Of course, I could have provided execvpe() in C, but that'd have been more hassle.) Nonetheless, it's worth keeping mind. Thanks |
Copyright © 1999-2021 by the D Language Foundation