Provided by: manpages-posix_2.16-1_all bug

NAME

       pathchk - check pathnames

SYNOPSIS

       pathchk [-p] pathname...

DESCRIPTION

       The  pathchk  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 -p option.

       By  default,  the  pathchk  utility  shall  check  each  component  of each pathname operand based on the
       underlying file system. A diagnostic shall be written for each pathname operand that:

        * Is longer than {PATH_MAX} bytes (see Pathname Variable  Values  in  the  Base  Definitions  volume  of
          IEEE Std 1003.1-2001, Chapter 13, Headers, <limits.h>)

        * Contains any component longer than {NAME_MAX} bytes in its containing directory

        * Contains any component in a directory that is not searchable

        * Contains any character in any component that is not valid in its containing directory

       The  format  of  the  diagnostic  message is not specified, but shall indicate the error detected and the
       corresponding pathname operand.

       It shall not be considered an error if one or more components of a pathname 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.

OPTIONS

       The pathchk utility shall conform to the Base Definitions volume of IEEE Std 1003.1-2001,  Section  12.2,
       Utility Syntax Guidelines.

       The following option shall be supported:

       -p     Instead  of  performing  checks  based  on the underlying file system, write a diagnostic for each
              pathname operand that:

               * Is longer than {_POSIX_PATH_MAX} bytes (see Minimum Values in the Base  Definitions  volume  of
                 IEEE Std 1003.1-2001, Chapter 13, Headers, <limits.h>)

               * Contains any component longer than {_POSIX_NAME_MAX} bytes

               * Contains any character in any component that is not in the portable filename character set

OPERANDS

       The following operand shall be supported:

       pathname
              A pathname to be checked.

STDIN

       Not used.

INPUT FILES

       None.

ENVIRONMENT VARIABLES

       The following environment variables shall affect the execution of pathchk:

       LANG   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.)

       LC_ALL If set to a non-empty string value, override the values  of  all  the  other  internationalization
              variables.

       LC_CTYPE
              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).

       LC_MESSAGES
              Determine the locale that should be used to affect the format and contents of diagnostic  messages
              written to standard error.

       NLSPATH
              Determine the location of message catalogs for the processing of LC_MESSAGES .

ASYNCHRONOUS EVENTS

       Default.

STDOUT

       Not used.

STDERR

       The standard error shall be used only for diagnostic messages.

OUTPUT FILES

       None.

EXTENDED DESCRIPTION

       None.

EXIT STATUS

       The following exit values shall be returned:

        0     All pathname operands passed all of the checks.

       >0     An error occurred.

CONSEQUENCES OF ERRORS

       Default.

       The following sections are informative.

APPLICATION USAGE

       The  test  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  pathchk  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.

       The noclobber option in the shell (see the set 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.

EXAMPLES

       To verify that all pathnames in an imported data interchange archive are legitimate  and  unambiguous  on
       the current system:

              pax -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

       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 pax utility:

              find . -print | xargs pathchk -p
              if [ $? -eq 0 ]
              then
                  pax -w -f archive .
              else
                  echo Portable archive cannot be created.
                  exit 1
              fi

       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:

              case $- 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"

       The following assumptions are made in this example:

        1. PROCESSING  represents the code that is used by the application to use $path once it is verified that
           $path.out works as intended.

        2. The state of the noclobber 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 reset variable is used in this example to
           restore the initial state.)

        3. Note the usage of:

           rm "$path.out" > "$path.out"

            a. The pathchk command has already verified, at this point, that $path.out is not truncated.

            b. With the noclobber option set, the shell verifies that $path.out does not  already  exist  before
               invoking rm.

            c. If  the  shell  succeeded in creating $path.out, rm removes it so that the application can create
               the file again in the PROCESSING step.

            d. If the PROCESSING step wants the file to exist already when it is invoked, the:

               rm "$path.out" > "$path.out"

           should be replaced with:

                  > "$path.out"

           which verifies that the file did not already  exist,  but  leaves  $path.out  in  place  for  use  by
           PROCESSING.

RATIONALE

       The  pathchk  utility  was  new for the ISO POSIX-2:1993 standard.  It, along with the set -C( noclobber)
       option added to the shell, replaces the mktemp, validfnam, and create utilities that  appeared  in  early
       proposals. All of these utilities were attempts to solve several common problems:

        * 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.

        * Atomically create a file.

        * Perform various string handling functions to generate a temporary filename.

       The create 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 noclobber option also provides a way of creating a lock for process synchronization;  since
       it provides an atomic create, there is no race between a test for existence and the following creation if
       it did not exist.

       Having  a  function  like  tmpnam()  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:

              $TMPDIR/application_abbreviation$$.suffix

       In cases where there is likely to be contention for a given suffix, a simple shell for or while loop  can
       be  used  with  the  shell  noclobber  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.

FUTURE DIRECTIONS

       None.

SEE ALSO

       Redirection , set , test

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 .

IEEE/The Open Group                                   2003                                            PATHCHK(P)