NAME
path - file path routines
SYNOPSIS
#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);
DESCRIPTION
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
- 0
-
message emitted information must be generated via probe(1)
- 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.
SEE ALSO
3d(1), access(2), confstr(3), fs3d(3), lstat(2), stat(2)