diff -cr boost_1_65_1/libs/filesystem/src/operations.cpp boost_1_65_1.mod/libs/filesystem/src/operations.cpp *** boost_1_65_1/libs/filesystem/src/operations.cpp 2017-09-02 11:56:12.000000000 +0200 --- boost_1_65_1.mod/libs/filesystem/src/operations.cpp 2017-09-22 10:42:52.713234509 +0200 *************** *** 172,177 **** --- 172,183 ---- # ifndef IO_REPARSE_TAG_SYMLINK # define IO_REPARSE_TAG_SYMLINK (0xA000000CL) # endif + # ifndef IO_REPARSE_TAG_MOUNT_POINT + # define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) + # endif + # ifndef IO_REPARSE_TAG_DEDUP + # define IO_REPARSE_TAG_DEDUP (0x80000013L) + # endif inline std::wstring wgetenv(const wchar_t* name) { *************** *** 684,690 **** hTemplateFile); } ! bool is_reparse_point_a_symlink(const path& p) { handle_wrapper h(create_file_handle(p, FILE_READ_EA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, --- 690,696 ---- hTemplateFile); } ! ULONG get_reparse_tag(const path& p) { handle_wrapper h(create_file_handle(p, FILE_READ_EA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, *************** *** 700,716 **** MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &dwRetLen, NULL); if (!result) return false; ! return reinterpret_cast(buf.get())->ReparseTag ! == IO_REPARSE_TAG_SYMLINK ! // Issue 9016 asked that NTFS directory junctions be recognized as directories. ! // That is equivalent to recognizing them as symlinks, and then the normal symlink ! // mechanism will take care of recognizing them as directories. ! // ! // Directory junctions are very similar to symlinks, but have some performance ! // and other advantages over symlinks. They can be created from the command line ! // with "mklink /j junction-name target-path". ! || reinterpret_cast(buf.get())->ReparseTag ! == IO_REPARSE_TAG_MOUNT_POINT; // aka "directory junction" or "junction" } inline std::size_t get_full_path_name( --- 706,712 ---- MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &dwRetLen, NULL); if (!result) return false; ! return reinterpret_cast(buf.get())->ReparseTag; } inline std::size_t get_full_path_name( *************** *** 754,765 **** if (attr & FILE_ATTRIBUTE_REPARSE_POINT) { ! if (is_reparse_point_a_symlink(p)) return (attr & FILE_ATTRIBUTE_DIRECTORY) ? fs::_detail_directory_symlink : fs::symlink_file; return fs::reparse_file; } return (attr & FILE_ATTRIBUTE_DIRECTORY) ? fs::directory_file --- 750,771 ---- if (attr & FILE_ATTRIBUTE_REPARSE_POINT) { ! switch(get_reparse_tag(p)) ! { ! case IO_REPARSE_TAG_DEDUP: ! return (attr & FILE_ATTRIBUTE_DIRECTORY) ! ? fs::directory_file ! : fs::regular_file; ! case IO_REPARSE_TAG_MOUNT_POINT: ! return fs::directory_file; ! case IO_REPARSE_TAG_SYMLINK: return (attr & FILE_ATTRIBUTE_DIRECTORY) ? fs::_detail_directory_symlink : fs::symlink_file; + default: return fs::reparse_file; } + } return (attr & FILE_ATTRIBUTE_DIRECTORY) ? fs::directory_file *************** *** 1818,1826 **** return process_status_failure(p, ec); } ! if (!is_reparse_point_a_symlink(p)) return file_status(reparse_file, make_permissions(p, attr)); } if (ec != 0) ec->clear(); return (attr & FILE_ATTRIBUTE_DIRECTORY) --- 1824,1840 ---- return process_status_failure(p, ec); } ! switch(get_reparse_tag(p)) ! { ! case IO_REPARSE_TAG_DEDUP: ! case IO_REPARSE_TAG_SYMLINK: ! case IO_REPARSE_TAG_MOUNT_POINT: ! // Treat deduplicated files/dirs, mount points and symlinks as normals files/dirs ! break; ! default: return file_status(reparse_file, make_permissions(p, attr)); } + } if (ec != 0) ec->clear(); return (attr & FILE_ATTRIBUTE_DIRECTORY) *************** *** 1885,1898 **** if (ec != 0) ec->clear(); if (attr & FILE_ATTRIBUTE_REPARSE_POINT) ! return is_reparse_point_a_symlink(p) ! ? file_status(symlink_file, make_permissions(p, attr)) ! : file_status(reparse_file, make_permissions(p, attr)); ! return (attr & FILE_ATTRIBUTE_DIRECTORY) ? file_status(directory_file, make_permissions(p, attr)) : file_status(regular_file, make_permissions(p, attr)); - # endif } --- 1899,1920 ---- if (ec != 0) ec->clear(); if (attr & FILE_ATTRIBUTE_REPARSE_POINT) ! { ! switch(get_reparse_tag(p)) ! { ! case IO_REPARSE_TAG_DEDUP: ! case IO_REPARSE_TAG_MOUNT_POINT: ! // Treat deduplicated files and mount points just as their normal counterparts ! break; ! case IO_REPARSE_TAG_SYMLINK: ! return file_status(symlink_file, make_permissions(p, attr)); ! default: ! return file_status(reparse_file, make_permissions(p, attr)); ! } ! } return (attr & FILE_ATTRIBUTE_DIRECTORY) ? file_status(directory_file, make_permissions(p, attr)) : file_status(regular_file, make_permissions(p, attr)); # endif }