path3
File path routines
Usage
#include <ast.h> char* pathaccess(char* path, const char* dirs, const char* a, const char* b, int mode); char* pathbin(void); char* pathcanon(char* path, int flags); char* pathcat(char* path, const char* dirs, int sep, const char* a, const char* b); char* pathcd(char* path, const char* home); int pathcheck(const char* package, const char* tool, Pathcheck_t* pc); int pathgetlink(const char* name, char* buf, int siz); char* pathkey(char* key, char* attr, const char* lang, const char* path); char* pathnext(char* path, char* extra, long* visits); char* pathpath(char* path, const char* p, const char* a, int mode); char* pathprobe(char* path, char* attr, const char* lang, const char* tool, const char* proc, int op); char* pathrepl(char* path, const char* match, const char* replace); int pathsetlink(const char* text, char* name); char* pathshell(void); int pathstat(const char* path, struct stat* st); char* pathtemp(char* path, const char* dir, const char* pfx);
Overview
These routines operate on file path names. Path buffers are assumed to be of size $1$2PATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAX $1$2<ast.h><ast.h><ast.h><ast.h><ast.h><ast.h><ast.h><ast.h> always defines $1$2PATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAX even if it indeterminant on the local system. Yes, this was probably a bad choice, but it was made about 10 years ago. We will probably move to a <stk.h> based implementation.
$1$2pathaccesspathaccesspathaccesspathaccesspathaccesspathaccesspathaccesspathaccess constructs a path in $1$2pathpathpathpathpathpathpathpath to the file $1$2a/ba/ba/ba/ba/ba/ba/ba/b with access $1$2modemodemodemodemodemodemodemode using the $1$2:::::::: separated directories in dirs. Both a and b may be $1$200000000 $1$2modemodemodemodemodemodemodemode is the inclusive-or of:
$1$2F_OKF_OKF_OKF_OKF_OKF_OKF_OKF_OK
|
File exists. |
|---|---|
$1$2R_OKR_OKR_OKR_OKR_OKR_OKR_OKR_OK
|
Read permission on file. |
$1$2W_OKW_OKW_OKW_OKW_OKW_OKW_OKW_OK
|
Write permission on file. |
$1$2X_OKX_OKX_OKX_OKX_OKX_OKX_OKX_OK
|
Execute permission on file. |
$1$2PATH_REGULARPATH_REGULARPATH_REGULARPATH_REGULARPATH_REGULARPATH_REGULARPATH_REGULARPATH_REGULAR
|
A regular file. |
$1$2PATH_ABSOLUTEPATH_ABSOLUTEPATH_ABSOLUTEPATH_ABSOLUTEPATH_ABSOLUTEPATH_ABSOLUTEPATH_ABSOLUTEPATH_ABSOLUTE
|
Generated path name is rooted at $1$2//////// path is returned, 0 on error. |
$1$2pathbinpathbinpathbinpathbinpathbinpathbinpathbinpathbin returns a pointer to the $1$2:::::::: separated list of directories to search for executable commands. The $1$2PATHPATHPATHPATHPATHPATHPATHPATH environment variable is first consulted. If not defined then $1$2confstr(_CS_PATH,...)confstr(_CS_PATH,...)confstr(_CS_PATH,...)confstr(_CS_PATH,...)confstr(_CS_PATH,...)confstr(_CS_PATH,...)confstr(_CS_PATH,...)confstr(_CS_PATH,...) is used. A valid string is always returned.
$1$2pathcanonpathcanonpathcanonpathcanonpathcanonpathcanonpathcanonpathcanon canonicalizes the path path in place. A pointer to the trailing 0 in the canonicalized path is returned. A canonical path has: redundant $1$2........ and $1$2//////// removed; $1$2................ moved to the front; $1$2/../../../../../../../.. preserved for super root hacks; $1$2........................ resolved if fs3d(3) is enabled. flags is the inclusive-or of:
$1$2PATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOT
|
Each $1$2................ is checked for access. |
|---|---|
$1$2PATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTS
|
Path must exist at each component. |
$1$2PATH_PHYSICALPATH_PHYSICALPATH_PHYSICALPATH_PHYSICALPATH_PHYSICALPATH_PHYSICALPATH_PHYSICALPATH_PHYSICAL
|
Symbolic links are resolved at each component. |
0 is returned on error. If an error occurs and either of $1$2PATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOTPATH_DOTDOT or $1$2PATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTSPATH_EXISTS is set then path will contain the components following the failure point.
$1$2pathcatpathcatpathcatpathcatpathcatpathcatpathcatpathcat concatenates the first sep separated path component in dirs with the path components a and b into $1$2pathpathpathpathpathpathpathpath The path is constructed in path by separating each path component with /. Both a and b may be $1$200000000 A pointer to the next sep separated component in dirs is returned, $1$200000000 when there are no more components. $1$2pathcatpathcatpathcatpathcatpathcatpathcatpathcatpathcat is used by $1$2pathaccesspathaccesspathaccesspathaccesspathaccesspathaccesspathaccesspathaccess
$1$2pathcdpathcdpathcdpathcdpathcdpathcdpathcdpathcd sets the current working directory to path via chdir(2). If path is longer than $1$2PATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAXPATH_MAX then it is split up into a sequence of relative paths and chdir is called on each of these. For any given system, if you got to a directory, then $1$2pathcdpathcdpathcdpathcdpathcdpathcdpathcdpathcd can get you back, modulo permission and link changes.
$1$2pathcheckpathcheckpathcheckpathcheckpathcheckpathcheckpathcheckpathcheck is a stub for license libraries. See license(3).
$1$2pathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlink returns the 0-terminated symbolic link text for path in the buffer bu of size siz. The link text length is returned on success, -1 on error. Weird universe (1) interactions with dynamic symbolic links are handled by converting non-standard dynamic link text to $1$2pathsetsymlinkpathsetsymlinkpathsetsymlinkpathsetsymlinkpathsetsymlinkpathsetsymlinkpathsetsymlinkpathsetsymlink converts in the other direction.
$1$2pathkeypathkeypathkeypathkeypathkeypathkeypathkeypathkey generates in key a 14 character lookup key (plus terminating 0) for the language lang processor in path. A poihter to the key is returned, 0 on error. If key == 0 then space is allocated via malloc(3). Key specific attribute name=value pairs are copied into attr if attr != 0.
$1$2pathpathpathpathpathpathpathpathpathpathpathpathpathpathpathpath constructs in path a path to p with access(2) mode mode using the directories from $1$2pathbin()pathbin()pathbin()pathbin()pathbin()pathbin()pathbin()pathbin() If a != 0 then a, argv[0] (if available via optget(3)), and the $1$2________ environment variable (set by ksh(1)) are used for related root searching. If p also contains a $1$2//////// then ../p is searched for.
$1$2pathprobepathprobepathprobepathprobepathprobepathprobepathprobepathprobe generates in path the full path name of the tool specific probe(1) information file for the lang langauge processor proc. If path == 0 then space is allocated via malloc(3). Probe attribute name=value pairs are copied into attr if attr != 0. op may be one of:
-
-1 -
return the path name with no access checks or generation
|
message emitted information must be generated via probe(1) |
|---|---|
|
no message emitted information must be probed via probe(1) |
0 is returned if the information does not exist and cannot be generated.
$1$2pathreplpathreplpathreplpathreplpathreplpathreplpathreplpathrepl does an in-place replacement of the first occurrence of /match/ with /replace/ in path.
$1$2pathsetlinkpathsetlinkpathsetlinkpathsetlinkpathsetlinkpathsetlinkpathsetlinkpathsetlink creates a symbolic link text in the path name. See $1$2pathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlinkpathgetlink above for weird universe(1) interactions hidden by this routine.
$1$2pathshellpathshellpathshellpathshellpathshellpathshellpathshellpathshell returns a pointer to the pathname for the shell for the current process. The $1$2SHELLSHELLSHELLSHELLSHELLSHELLSHELLSHELL environment variable is first consulted, but is rejected under suspicious ownership/setuid conditions of if it seems to point to csh(1); otherwise $1$2confstr(_CS_SHELL,...)confstr(_CS_SHELL,...)confstr(_CS_SHELL,...)confstr(_CS_SHELL,...)confstr(_CS_SHELL,...)confstr(_CS_SHELL,...)confstr(_CS_SHELL,...)confstr(_CS_SHELL,...) is used. A valid string is always returned.
$1$2pathstatpathstatpathstatpathstatpathstatpathstatpathstatpathstat first tries and if that fails it tries The $1$2statstatstatstatstatstatstatstat or $1$2lstatlstatlstatlstatlstatlstatlstatlstat return value is returned.
$1$2pathtemppathtemppathtemppathtemppathtemppathtemppathtemppathtemp generates in path a temporary file path name of the form dir/pfx<pid>.<suf> where the length of pfx, if !=0, is limited to 5, the length of <pid> (the base 64 representation of the current process id) is limited to 3, and <suf> (an internally generated suffix that avoid file confilicts) is limited to 3. The generated path name conforms to the classic UNIX 14 char and the DOS $1$28.38.38.38.38.38.38.38.3 limitations. Both dir and pfx may be $1$200000000 access(2) is used to avoid file conflicts but the generated path name is not created, so you could lose in a race.
Releases
Unchanged in 135 releases since Mac OS X 10.4.