/* confdefs.h */ #define PACKAGE_NAME "dummy" #define PACKAGE_TARNAME "dummy" #define PACKAGE_VERSION "0" #define PACKAGE_STRING "dummy 0" #define PACKAGE_BUGREPORT "" #define PACKAGE_URL "" #define PACKAGE "dummy" #define VERSION "0" #define STDC_HEADERS 1 #define HAVE_SYS_TYPES_H 1 #define HAVE_SYS_STAT_H 1 #define HAVE_STDLIB_H 1 #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 1 #define HAVE_STRINGS_H 1 #define HAVE_INTTYPES_H 1 #define HAVE_STDINT_H 1 #define HAVE_UNISTD_H 1 #define __EXTENSIONS__ 1 #define _ALL_SOURCE 1 #define _DARWIN_C_SOURCE 1 #define _GNU_SOURCE 1 #define _NETBSD_SOURCE 1 #define _OPENBSD_SOURCE 1 #define _POSIX_PTHREAD_SEMANTICS 1 #define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1 #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #define __STDC_WANT_IEC_60559_DFP_EXT__ 1 #define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 #define __STDC_WANT_IEC_60559_TYPES_EXT__ 1 #define __STDC_WANT_LIB_EXT2__ 1 #define __STDC_WANT_MATH_SPEC_FUNCS__ 1 #define _TANDEM_SOURCE 1 #define _HPUX_ALT_XOPEN_SOCKET_API 1 #define HAVE_SYS_SOCKET_H 1 #define HAVE_ARPA_INET_H 1 #define HAVE_FEATURES_H 1 #define HAVE_UNISTD_H 1 #define HAVE_SYS_PARAM_H 1 #define HAVE_DIRENT_H 1 #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TIME_H 1 #define HAVE_NETDB_H 1 #define HAVE_NETINET_IN_H 1 #define HAVE_LIMITS_H 1 #define HAVE_WCHAR_H 1 #define HAVE_STDINT_H 1 #define HAVE_INTTYPES_H 1 #define HAVE_THREADS_H 1 #define HAVE_SYS_MMAN_H 1 #define HAVE_SYS_SELECT_H 1 #define HAVE_PTHREAD_H 1 #define HAVE_SYS_CDEFS_H 1 #define HAVE_SYS_IOCTL_H 1 #define HAVE_SYS_UIO_H 1 #define restrict __restrict #define HAVE_SHUTDOWN 1 #define HAVE_STRUCT_SOCKADDR_STORAGE 1 #define HAVE_SA_FAMILY_T 1 #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 #define HAVE_ALLOCA_H 1 #define HAVE_ALLOCA 1 #define HAVE_FCHDIR 1 #define HAVE_FCNTL 1 #define HAVE_SYMLINK 1 #define HAVE_FDOPENDIR 1 #define HAVE_MEMPCPY 1 #define HAVE_FSTATAT 1 #define HAVE_FTRUNCATE 1 #define HAVE_GETDTABLESIZE 1 #define HAVE_GETTIMEOFDAY 1 #define HAVE_ISBLANK 1 #define HAVE_LSTAT 1 #define HAVE_MPROTECT 1 #define HAVE_OPENAT 1 #define HAVE_STRERROR_R 1 #define HAVE___XPG_STRERROR_R 1 #define HAVE_PIPE 1 #define HAVE_SIGACTION 1 #define HAVE_SIGALTSTACK 1 #define HAVE_SIGINTERRUPT 1 #define HAVE_SLEEP 1 #define HAVE_CATGETS 1 #define HAVE_SNPRINTF 1 #define HAVE_USLEEP 1 #define HAVE_ENVIRON_DECL 1 #define HAVE_DECL_STRERROR_R 1 #define HAVE_STRERROR_R 1 #define STRERROR_R_CHAR_P 1 #define HAVE_DECL_FCHDIR 1 #define HAVE_WORKING_O_NOATIME 1 #define HAVE_WORKING_O_NOFOLLOW 1 #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 #define HAVE_DECL_GETCWD 1 #define HAVE_DECL_GETDTABLESIZE 1 #define HAVE_IPV4 1 #define HAVE_IPV6 1 #define HAVE_WINT_T 1 #define HAVE_LONG_LONG_INT 1 #define HAVE_UNSIGNED_LONG_LONG_INT 1 #define HAVE_WEAK_SYMBOLS 1 #define HAVE_PTHREAD_API 1 #define USE_POSIX_THREADS 1 #define USE_POSIX_THREADS_WEAK 1 #define MALLOC_0_IS_NONNULL 1 #define HAVE_MAP_ANONYMOUS 1 #define HAVE_DECL_MEMRCHR 1 #define HAVE_DECL_ALARM 1 #define PROMOTED_MODE_T mode_t #define HAVE_DECL_STRERROR_R 1 #define HAVE_SIGSET_T 1 #define HAVE__BOOL 1 #define HAVE_WCHAR_T 1 #define HAVE_DECL_STRDUP 1 #define _USE_STD_STAT 1 #define HAVE_DECL_UNSETENV 1 #define GNULIB_TEST_ACCEPT 1 #define HAVE_ALLOCA 1 #define GNULIB_TEST_BIND 1 #define GNULIB_TEST_CHDIR 1 #define GNULIB_TEST_CLOEXEC 1 #define GNULIB_TEST_CLOSE 1 #define HAVE_CLOSEDIR 1 #define GNULIB_TEST_CLOSEDIR 1 #define GNULIB_TEST_CONNECT 1 #define D_INO_IN_DIRENT 1 #define HAVE_DIRFD 1 #define HAVE_DECL_DIRFD 1 #define GNULIB_TEST_DIRFD 1 #define GNULIB_TEST_DUP 1 #define GNULIB_TEST_DUP2 1 #define GNULIB_TEST_ENVIRON 1 #define GNULIB_TEST_FCHDIR 1 #define GNULIB_TEST_FCNTL 1 #define GNULIB_FD_SAFER_FLAG 1 #define GNULIB_TEST_FDOPEN 1 #define HAVE_DECL_FDOPENDIR 1 #define GNULIB_TEST_FDOPENDIR 1 #define GNULIB_FDOPENDIR 1 #define GNULIB_TEST_FSTAT 1 #define GNULIB_TEST_FSTATAT 1 #define GNULIB_TEST_FTRUNCATE 1 /* end confdefs.h. */ #include #include #if HAVE_UNISTD_H # include #else # include #endif #include #include #include #include #include /* Arrange to define PATH_MAX, like "pathmax.h" does. */ #if HAVE_UNISTD_H # include #endif #include #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifdef __hpux # undef PATH_MAX # define PATH_MAX 1024 #endif #if defined _WIN32 && ! defined __CYGWIN__ # undef PATH_MAX # define PATH_MAX 260 #endif #ifndef AT_FDCWD # define AT_FDCWD 0 #endif #ifdef ENAMETOOLONG # define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG) #else # define is_ENAMETOOLONG(x) 0 #endif /* Use the getcwd function, not any macro. */ #undef getcwd #if defined _WIN32 && !defined __CYGWIN__ #define access _access #define chdir _chdir #define chmod _chmod #define close _close #define creat _creat #define dup _dup #define dup2 _dup2 #define ecvt _ecvt #define execl _execl #define execle _execle #define execlp _execlp #define execv _execv #define execve _execve #define execvp _execvp #define execvpe _execvpe #define fcloseall _fcloseall #define fcvt _fcvt #define fdopen _fdopen #define fileno _fileno #define gcvt _gcvt #define getcwd _getcwd #define getpid _getpid #define getw _getw #define isatty _isatty #define j0 _j0 #define j1 _j1 #define jn _jn #define lfind _lfind #define lsearch _lsearch #define lseek _lseek #define memccpy _memccpy #define mkdir _mkdir #define mktemp _mktemp #define open _open #define putenv _putenv #define putw _putw #define read _read #define rmdir _rmdir #define strdup _strdup #define swab _swab #define tempnam _tempnam #define tzset _tzset #define umask _umask #define unlink _unlink #define utime _utime #define wcsdup _wcsdup #define write _write #define y0 _y0 #define y1 _y1 #define yn _yn #endif #ifndef S_IRWXU # define S_IRWXU 0700 #endif /* The length of this name must be 8. */ #define DIR_NAME "confdir3" #define DIR_NAME_LEN 8 #define DIR_NAME_SIZE (DIR_NAME_LEN + 1) /* The length of "../". */ #define DOTDOTSLASH_LEN 3 /* Leftover bytes in the buffer, to work around library or OS bugs. */ #define BUF_SLOP 20 int main () { alarm (10); #ifndef PATH_MAX /* The Hurd doesn't define this, so getcwd can't exhibit the bug -- at least not on a local file system. And if we were to start worrying about remote file systems, we'd have to enable the wrapper function all of the time, just to be safe. That's not worth the cost. */ exit (0); #elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) - DIR_NAME_SIZE - BUF_SLOP) <= PATH_MAX) /* FIXME: Assuming there's a system for which this is true, this should be done in a compile test. */ exit (0); #else char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) + DIR_NAME_SIZE + BUF_SLOP]; char *cwd = getcwd (buf, PATH_MAX); size_t initial_cwd_len; size_t cwd_len; int fail = 0; size_t n_chdirs = 0; if (cwd == NULL) exit (10); cwd_len = initial_cwd_len = strlen (cwd); while (1) { size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN); char *c = NULL; cwd_len += DIR_NAME_SIZE; /* If mkdir or chdir fails, it could be that this system cannot create any file with an absolute name longer than PATH_MAX, such as cygwin. If so, leave fail as 0, because the current working directory can't be too long for getcwd if it can't even be created. On Linux with the 9p file system, mkdir fails with error EINVAL when cwd_len gets too long; ignore this failure because the getcwd() system call produces good results whereas the gnulib substitute calls getdents64 which fails with error EPROTO. For other errors, be pessimistic and consider that as a failure, too. */ if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0) { if (! (errno == ERANGE || is_ENAMETOOLONG (errno))) #ifdef __linux__ if (! (errno == EINVAL)) #endif fail = 20; break; } if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE) { struct stat sb; c = getcwd (buf, PATH_MAX); if (!c && errno == ENOENT) { fail = 11; break; } if (c) { fail = 31; break; } if (! (errno == ERANGE || is_ENAMETOOLONG (errno))) { fail = 21; break; } /* Our replacement needs to be able to stat() long ../../paths, so generate a path larger than PATH_MAX to check, avoiding the replacement if we can't stat(). */ c = getcwd (buf, cwd_len + 1); if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno)) { fail = 32; break; } } if (dotdot_max <= cwd_len - initial_cwd_len) { if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len) break; c = getcwd (buf, cwd_len + 1); if (!c) { if (! (errno == ERANGE || errno == ENOENT || is_ENAMETOOLONG (errno))) { fail = 22; break; } if (AT_FDCWD || errno == ERANGE || errno == ENOENT) { fail = 12; break; } } } if (c && strlen (c) != cwd_len) { fail = 23; break; } ++n_chdirs; } /* Leaving behind such a deep directory is not polite. So clean up here, right away, even though the driving shell script would also clean up. */ { size_t i; /* Try rmdir first, in case the chdir failed. */ rmdir (DIR_NAME); for (i = 0; i <= n_chdirs; i++) { if (chdir ("..") < 0) break; if (rmdir (DIR_NAME) != 0) break; } } exit (fail); #endif }