1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  23  *
  24  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  25  * Use is subject to license terms.
  26  */
  27 
  28 /*      Copyright (c) 1988 AT&T     */
  29 /*        All Rights Reserved   */
  30 
  31 
  32 #ifndef _FTW_H
  33 #define _FTW_H
  34 
  35 #include <sys/feature_tests.h>
  36 
  37 #include <sys/types.h>
  38 #include <sys/stat.h>
  39 
  40 #ifdef  __cplusplus
  41 extern "C" {
  42 #endif
  43 
  44 /*
  45  *      Codes for the third argument to the user-supplied function.
  46  */
  47 
  48 #define FTW_F   0       /* file */
  49 #define FTW_D   1       /* directory */
  50 #define FTW_DNR 2       /* directory without read permission */
  51 #define FTW_NS  3       /* unknown type, stat failed */
  52 #define FTW_SL  4       /* symbolic link */
  53 #define FTW_DP  6       /* directory */
  54 #define FTW_SLN 7       /* symbolic link that points to nonexistent file */
  55 #define FTW_DL  8       /* private interface for find utility */
  56 
  57 /*
  58  *      Codes for the fourth argument to nftw.  You can specify the
  59  *      union of these flags.
  60  */
  61 
  62 #define FTW_PHYS        01  /* use lstat instead of stat */
  63 #define FTW_MOUNT       02  /* do not cross a mount point */
  64 #define FTW_CHDIR       04  /* chdir to each directory before reading */
  65 #define FTW_DEPTH       010 /* call descendents before calling the parent */
  66 #define FTW_ANYERR      020 /* return FTW_NS on any stat failure */
  67 #define FTW_HOPTION     040 /* private interface for find utility */
  68 #define FTW_NOLOOP      0100 /* private interface for find utility */
  69 
  70 #if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) || defined(_XPG4_2)
  71 struct FTW
  72 {
  73 #if defined(_XPG4_2)
  74         int     __quit;
  75 #else
  76         int     quit;
  77 #endif
  78         int     base;
  79         int     level;
  80 };
  81 #endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) ... */
  82 
  83 /*
  84  * legal values for quit
  85  */
  86 
  87 #define FTW_SKD         1
  88 #define FTW_FOLLOW      2
  89 #define FTW_PRUNE       4
  90 
  91 /* large file compilation environment setup */
  92 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
  93 #ifdef  __PRAGMA_REDEFINE_EXTNAME
  94 #pragma redefine_extname        _xftw   _xftw64
  95 #pragma redefine_extname        _ftw    _ftw64
  96 #if !defined(_XOPEN_SOURCE) || defined(_XPG5)
  97 #pragma redefine_extname        nftw    nftw64
  98 #endif
  99 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 100 #define _xftw                   _xftw64
 101 #define _ftw                    _ftw64
 102 #if !defined(_XOPEN_SOURCE) || defined(_XPG5)
 103 #define nftw                    nftw64
 104 #endif
 105 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 106 #endif /* !_LP64 && _FILE_OFFSET_BITS == 64 */
 107 
 108 /* In the LP64 compilation environment, all APIs are already large file */
 109 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
 110 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 111 #pragma redefine_extname        _xftw64         _xftw
 112 #pragma redefine_extname        _ftw64          _ftw
 113 #if !defined(_XOPEN_SOURCE) || defined(_XPG5)
 114 #pragma redefine_extname        nftw64          nftw
 115 #endif
 116 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 117 #define _xftw64         _xftw
 118 #define _ftw64          _ftw
 119 #if !defined(_XOPEN_SOURCE) || defined(_XPG5)
 120 #define nftw64          nftw
 121 #endif
 122 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 123 #endif  /* _LP64 && _LARGEFILE64_SOURCE */
 124 
 125 extern int ftw(const char *,
 126         int (*)(const char *, const struct stat *, int), int);
 127 extern int _xftw(int, const char *,
 128         int (*)(const char *, const struct stat *, int), int);
 129 #if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) || defined(_XPG4_2)
 130 extern int nftw(const char *,
 131         int (*)(const char *, const struct stat *, int, struct FTW *),
 132         int, int);
 133 #endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) ... */
 134 
 135 /*
 136  * transitional large file interface versions
 137  */
 138 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 139             !defined(__PRAGMA_REDEFINE_EXTNAME))
 140 extern int ftw64(const char *,
 141         int (*)(const char *, const struct stat64 *, int), int);
 142 extern int _xftw64(int, const char *,
 143         int (*)(const char *, const struct stat64 *, int), int);
 144 #if !defined(_XOPEN_SOURCE)
 145 extern int nftw64(const char *,
 146         int (*)(const char *, const struct stat64 *, int, struct FTW *),
 147         int, int);
 148 #endif /* !defined(_XOPEN_SOURCE) */
 149 #endif /* _LARGEFILE64_SOURCE .. */
 150 
 151 #define _XFTWVER        2       /* version of file tree walk */
 152 
 153 #define ftw(path, fn, depth)    _xftw(_XFTWVER, (path), (fn), (depth))
 154 
 155 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 156             !defined(__PRAGMA_REDEFINE_EXTNAME))
 157 #define ftw64(path, fn, depth)  _xftw64(_XFTWVER, (path), (fn), (depth))
 158 #endif
 159 
 160 #ifdef  __cplusplus
 161 }
 162 #endif
 163 
 164 #endif  /* _FTW_H */