summaryrefslogtreecommitdiffstats
path: root/man1p/pathchk.1p
diff options
context:
space:
mode:
Diffstat (limited to 'man1p/pathchk.1p')
-rw-r--r--man1p/pathchk.1p358
1 files changed, 358 insertions, 0 deletions
diff --git a/man1p/pathchk.1p b/man1p/pathchk.1p
new file mode 100644
index 000000000..394f47d1e
--- /dev/null
+++ b/man1p/pathchk.1p
@@ -0,0 +1,358 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "PATHCHK" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" pathchk
+.SH NAME
+pathchk \- check pathnames
+.SH SYNOPSIS
+.LP
+\fBpathchk\fP \fB[\fP\fB-p\fP\fB]\fP \fIpathname\fP\fB...\fP
+.SH DESCRIPTION
+.LP
+The \fIpathchk\fP utility shall check that one or more pathnames are
+valid (that is, they could be used to access or create a
+file without causing syntax errors) and portable (that is, no filename
+truncation results). More extensive portability checks are
+provided by the \fB-p\fP option.
+.LP
+By default, the \fIpathchk\fP utility shall check each component of
+each \fIpathname\fP operand based on the underlying file
+system. A diagnostic shall be written for each \fIpathname\fP operand
+that:
+.IP " *" 3
+Is longer than {PATH_MAX} bytes (see \fBPathname Variable Values\fP
+in the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, Chapter 13, Headers, \fI<limits.h>\fP)
+.LP
+.IP " *" 3
+Contains any component longer than {NAME_MAX} bytes in its containing
+directory
+.LP
+.IP " *" 3
+Contains any component in a directory that is not searchable
+.LP
+.IP " *" 3
+Contains any character in any component that is not valid in its containing
+directory
+.LP
+.LP
+The format of the diagnostic message is not specified, but shall indicate
+the error detected and the corresponding
+\fIpathname\fP operand.
+.LP
+It shall not be considered an error if one or more components of a
+\fIpathname\fP operand do not exist as long as a file
+matching the pathname specified by the missing components could be
+created that does not violate any of the checks specified
+above.
+.SH OPTIONS
+.LP
+The \fIpathchk\fP utility shall conform to the Base Definitions volume
+of IEEE\ Std\ 1003.1-2001, Section 12.2, Utility Syntax Guidelines.
+.LP
+The following option shall be supported:
+.TP 7
+\fB-p\fP
+Instead of performing checks based on the underlying file system,
+write a diagnostic for each \fIpathname\fP operand that:
+.RS
+.IP " *" 3
+Is longer than {_POSIX_PATH_MAX} bytes (see \fBMinimum Values\fP in
+the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, Chapter 13, Headers, \fI<limits.h>\fP)
+.LP
+.IP " *" 3
+Contains any component longer than {_POSIX_NAME_MAX} bytes
+.LP
+.IP " *" 3
+Contains any character in any component that is not in the portable
+filename character set
+.LP
+.RE
+.sp
+.SH OPERANDS
+.LP
+The following operand shall be supported:
+.TP 7
+\fIpathname\fP
+A pathname to be checked.
+.sp
+.SH STDIN
+.LP
+Not used.
+.SH INPUT FILES
+.LP
+None.
+.SH ENVIRONMENT VARIABLES
+.LP
+The following environment variables shall affect the execution of
+\fIpathchk\fP:
+.TP 7
+\fILANG\fP
+Provide a default value for the internationalization variables that
+are unset or null. (See the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, Section 8.2, Internationalization Variables
+for
+the precedence of internationalization variables used to determine
+the values of locale categories.)
+.TP 7
+\fILC_ALL\fP
+If set to a non-empty string value, override the values of all the
+other internationalization variables.
+.TP 7
+\fILC_CTYPE\fP
+Determine the locale for the interpretation of sequences of bytes
+of text data as characters (for example, single-byte as
+opposed to multi-byte characters in arguments).
+.TP 7
+\fILC_MESSAGES\fP
+Determine the locale that should be used to affect the format and
+contents of diagnostic messages written to standard
+error.
+.TP 7
+\fINLSPATH\fP
+Determine the location of message catalogs for the processing of \fILC_MESSAGES
+\&.\fP
+.sp
+.SH ASYNCHRONOUS EVENTS
+.LP
+Default.
+.SH STDOUT
+.LP
+Not used.
+.SH STDERR
+.LP
+The standard error shall be used only for diagnostic messages.
+.SH OUTPUT FILES
+.LP
+None.
+.SH EXTENDED DESCRIPTION
+.LP
+None.
+.SH EXIT STATUS
+.LP
+The following exit values shall be returned:
+.TP 7
+\ 0
+All \fIpathname\fP operands passed all of the checks.
+.TP 7
+>0
+An error occurred.
+.sp
+.SH CONSEQUENCES OF ERRORS
+.LP
+Default.
+.LP
+\fIThe following sections are informative.\fP
+.SH APPLICATION USAGE
+.LP
+The \fItest\fP utility can be used to determine whether a given pathname
+names an existing
+file; it does not, however, give any indication of whether or not
+any component of the pathname was truncated in a directory where
+the _POSIX_NO_TRUNC feature is not in effect. The \fIpathchk\fP utility
+does not check for file existence; it performs checks to
+determine whether a pathname does exist or could be created with no
+pathname component truncation.
+.LP
+The \fInoclobber\fP option in the shell (see the \fIset\fP special
+built-in) can be used to
+atomically create a file. As with all file creation semantics in the
+System Interfaces volume of IEEE\ Std\ 1003.1-2001, it
+guarantees atomic creation, but still depends on applications to agree
+on conventions and cooperate on the use of files after they
+have been created.
+.SH EXAMPLES
+.LP
+To verify that all pathnames in an imported data interchange archive
+are legitimate and unambiguous on the current system:
+.sp
+.RS
+.nf
+
+\fBpax -f archive | sed -e '/ == .*/s///' | xargs pathchk
+if [ $? -eq 0 ]
+then
+ pax -r -f archive
+else
+ echo Investigate problems before importing files.
+ exit 1
+fi
+\fP
+.fi
+.RE
+.LP
+To verify that all files in the current directory hierarchy could
+be moved to any system conforming to the System Interfaces
+volume of IEEE\ Std\ 1003.1-2001 that also supports the \fIpax\fP
+utility:
+.sp
+.RS
+.nf
+
+\fBfind . -print | xargs pathchk -p
+if [ $? -eq 0 ]
+then
+ pax -w -f archive .
+else
+ echo Portable archive cannot be created.
+ exit 1
+fi
+\fP
+.fi
+.RE
+.LP
+To verify that a user-supplied pathname names a readable file and
+that the application can create a file extending the given
+path without truncation and without overwriting any existing file:
+.sp
+.RS
+.nf
+
+\fBcase $- in
+ *C*) reset="";;
+ *) reset="set +C"
+ set -C;;
+esac
+test -r "$path" && pathchk "$path.out" &&
+ rm "$path.out" > "$path.out"
+if [ $? -ne 0 ]; then
+ printf "%s: %s not found or %s.out fails \\
+creation checks.\\n" $0 "$path" "$path"
+ $reset # Reset the noclobber option in case a trap
+ # on EXIT depends on it.
+ exit 1
+fi
+$reset
+PROCESSING < "$path" > "$path.out"
+\fP
+.fi
+.RE
+.LP
+The following assumptions are made in this example:
+.IP " 1." 4
+\fBPROCESSING\fP represents the code that is used by the application
+to use \fB$path\fP once it is verified that
+\fB$path.out\fP works as intended.
+.LP
+.IP " 2." 4
+The state of the \fInoclobber\fP option is unknown when this code
+is invoked and should be set on exit to the state it was in
+when this code was invoked. (The \fBreset\fP variable is used in this
+example to restore the initial state.)
+.LP
+.IP " 3." 4
+Note the usage of:
+.sp
+.RS
+.nf
+
+\fBrm "$path.out" > "$path.out"
+\fP
+.fi
+.RE
+.RS
+.IP " a." 4
+The \fIpathchk\fP command has already verified, at this point, that
+\fB$path.out\fP is not truncated.
+.LP
+.IP " b." 4
+With the \fInoclobber\fP option set, the shell verifies that \fB$path.out\fP
+does not already exist before invoking \fIrm\fP.
+.LP
+.IP " c." 4
+If the shell succeeded in creating \fB$path.out\fP, \fIrm\fP removes
+it so that the
+application can create the file again in the \fBPROCESSING\fP step.
+.LP
+.IP " d." 4
+If the \fBPROCESSING\fP step wants the file to exist already when
+it is invoked, the:
+.sp
+.RS
+.nf
+
+\fBrm "$path.out" > "$path.out"
+\fP
+.fi
+.RE
+.LP
+should be replaced with:
+.sp
+.RS
+.nf
+
+\fB> "$path.out"
+\fP
+.fi
+.RE
+.LP
+which verifies that the file did not already exist, but leaves \fB$path.out\fP
+in place for use by \fBPROCESSING\fP.
+.LP
+.RE
+.LP
+.SH RATIONALE
+.LP
+The \fIpathchk\fP utility was new for the ISO\ POSIX-2:1993 standard.
+It, along with the \fIset\fP \fB-C\fP( \fInoclobber\fP) option added
+to the shell, replaces the
+\fImktemp\fP, \fIvalidfnam\fP, and \fIcreate\fP utilities that appeared
+in early proposals. All of these utilities were attempts
+to solve several common problems:
+.IP " *" 3
+Verify the validity (for several different definitions of "valid")
+of a pathname supplied by a user, generated by an
+application, or imported from an external source.
+.LP
+.IP " *" 3
+Atomically create a file.
+.LP
+.IP " *" 3
+Perform various string handling functions to generate a temporary
+filename.
+.LP
+.LP
+The \fIcreate\fP utility, included in an early proposal, provided
+checking and atomic creation in a single invocation of the
+utility; these are orthogonal issues and need not be grouped into
+a single utility. Note that the \fInoclobber\fP option also
+provides a way of creating a lock for process synchronization; since
+it provides an atomic \fIcreate\fP, there is no race between
+a test for existence and the following creation if it did not exist.
+.LP
+Having a function like \fItmpnam\fP() in the ISO\ C standard is important
+in many
+high-level languages. The shell programming language, however, has
+built-in string manipulation facilities, making it very easy to
+construct temporary filenames. The names needed obviously depend on
+the application, but are frequently of a form similar to:
+.sp
+.RS
+.nf
+
+\fB$TMPDIR/\fP\fIapplication_abbreviation\fP\fB$$.\fP\fIsuffix\fP
+.fi
+.RE
+.LP
+In cases where there is likely to be contention for a given suffix,
+a simple shell \fBfor\fP or \fBwhile\fP loop can be used
+with the shell \fInoclobber\fP option to create a file without risk
+of collisions, as long as applications trying to use the same
+filename name space are cooperating on the use of files after they
+have been created.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIRedirection\fP , \fIset\fP , \fItest\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .