filepath
Duncan Coutts
duncan.coutts at worc.ox.ac.uk
Sun Dec 9 21:45:15 EST 2007
On Sun, 2007-12-09 at 23:35 +0000, Ian Lynagh wrote:
> > > > > but I'm not convinced that isn't a bug too.
> > > >
> > > > That is because it also uses the system path. See execvp vs execve.
> > >
> > > Right, but is that what it ought to do?
> >
> > If not there's no way to execute a program that lives in the current
> > directory if there is also a program by that name earlier on the search
> > path, like in /bin.
>
> I'm not sure we're on the same wavelength. What I mean is, should
> rawSystem use execvp rather than execv? Or should both options be
> available?
We certainly need the standard rawSystem to use the path (ie execvp) or
everything will break (you'd not be able to run "sh" it'd have to be
"/bin/sh"). It's certainly reasonable to provide the alternative that
does no patch searching though I doubt it's terribly useful since people
can already specify absolute paths, or paths relative to the current
directory so the only difference is in this corner case. I don't think
it affects much else.
> > If exec "./true" and "true" have to run the same program.
> >
> > So the point is when it comes to search paths, a ./ path is not really
> > relative at all.
>
> I don't understand that.
Ok, so for the purposes of path searching there are two kinds of paths:
absolute:
/bin/sh
./sh
They are relative to the root and current directory respectively. There
is no ambiguity there. We know the fs root and the current directory, so
that refers unambiguously to a specific file.
relative:
sh
This is relative to each dir in the search path. So could refer to any
of:
/bin/sh
/usr/bin/sh
./sh
or whatever the system's search path is.
>From man 3 execvp
Special semantics for execlp() and execvp()
The functions execlp() and execvp() will duplicate the actions of the
shell in searching for an executable file if the specified filename
does not contain a slash (/) character. The search path is the path
specified in the environment by the PATH variable. If this variable
isn't specified, the default path ``:/bin:/usr/bin'' is used.
NOTES
On some other systems the default path (used when the environment does
not contain the variable PATH) has the current working directory listed
after /bin and /usr/bin, as an anti-Trojan-horse measure. Linux uses
here the traditional "current directory first" default path.
So it's very clear that posix treats "./blah" differently from "blah"
for this function at least. It's true that the kernel does not and we do
not need to either. We can have a rawSystem version that does searching
and a version that does no searching. Then we could say that the version
that does searching will look for "./blah" the search path, which may
not contain ".". I don't know if that wouldn't be more confusing.
Duncan
More information about the Libraries
mailing list