tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

PATH_OPT: allowing to search for qualified utilities



[was also: sh(1): POSIX "Command Search and Execution"]

Please note that this is not an "official" proposal. It just a
modification that I implement and could be picked up by others.

In a nutshell, I want to add the possibility to "qualify" an utility
name, with a name composed with components separated by '/' but still
allowing to search this "URI" (qualified name) with PATH---this is not
POSIX compliant.

For example, imagine one has organized all the "The" filesystem
utilities this way:

tfs/create
tfs/ck
tfs/mount
tfs/ctl

In this case, the qualified name is "tfs/create" just like it could be
"DOE/John". It's an URI. The problem is to locate this identified
resource in the PATH.

PATH searching is done in two places: in the shell (I'm only concerned
with bin/sh here) and in the exec[lv]p* family of functions, used by such
utilities as nice, nohup, timeout or xargs.

To quote the exec(3) man page:

---8<---
The functions execlp(), execlpe(), execvp(), and execvpe() will duplicate
the actions of the shell in searching for an executable file if the
specified file name 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, _PATH_DEFPATH from <paths.h> is used
instead, its value being: /usr/bin:/bin:/usr/pkg/bin:/usr/local/bin.  In
addition, certain errors are treated specially.
--->8---

In order for this to be accomplished, I plan to add a PATH_OPT
environment variable, that will be only a string of ASCII alpha
caracters [A-Za-z], with 'p' reserved for POSIX (having precedence)
and 'q' specifying to allow for such qualified name search. The order
of the flags in the string is not significant.

This adds a:

path_opt = getenv("PATH_OPT");

call and the processing of the flags:

do_qname = (path_opt != NULL
	&& strchr(path_opt, 'q') != NULL
	&& strchr(path_opt, 'p') == NULL)? 1 : 0;

In order for the test to be very simple and not cost much, a qualified
name is such that the first char is not '/' and that no component has
a terminating '.'. Supposing q is such a tentative pathname (neither
nil nor empty):

q[0] != '/' && strstr(q, "./") == NULL
	 && ( (p = strrchr(q, '\0')) && *--p != '/' && *p != '.' )

This does mean that any relative '.' or '..' invalidates the pathname
as an URI.

To use bar/foo relative to current working directory, supposing the
qualified names extension is active, just prepend a "./".

Has anyone comments about such a scheme? The name of the env variable?
The cost in exec*p* functions?

TIA
-- 
        Thierry Laronde <tlaronde +AT+ kergis +dot+ com>
                     http://www.kergis.com/
                    http://kertex.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C


Home | Main Index | Thread Index | Old Index