diff --git a/doc/exception.htm b/doc/exception.htm
index b5f4354..d83f16b 100644
--- a/doc/exception.htm
+++ b/doc/exception.htm
@@ -162,10 +162,11 @@ processing.
Peter Dimov patiently identified requirements for portability and
-internationalization of error messages.
+internationalization of error messages. He also suggested basing the portable
+error codes on POSIX.
Revised
-09 May, 2005
+08 June, 2005
© Copyright Beman Dawes, 2002
Use, modification, and distribution are subject to the Boost Software
diff --git a/doc/index.htm b/doc/index.htm
index 02a5d91..6f30622 100644
--- a/doc/index.htm
+++ b/doc/index.htm
@@ -24,6 +24,8 @@ Filesystem Library
Common Specifications
Race-condition danger
Implementation
+ Restricting library to narrow
+ character paths
Building the object-library
Notes for Cygwin users
Acknowledgements
@@ -403,6 +405,13 @@ either the POSIX or Windows API.
The library is in regular use on Apple OS X, HP-UX, IBM AIX, Linux,
Microsoft Windows, SGI IRIX, and Sun Solaris operating systems using a variety
of compilers.
+
+Compilers or standard libraries which do not support wide characters (wchar_t)
+or wide character strings (std::wstring) are detected automatically, and cause
+the library to compile code that is restricted to narrow character paths
+(boost::filesystem::path). Users can force this restriction by defining the
+macro BOOST_FILESYSTEM_NARROW_ONLY. That may be useful for dealing with legacy
+compilers or operating systems.
Building the object-library
The object-library will normally be built automatically. See
Getting Started. It can also be
@@ -619,7 +628,7 @@ version 1.31.0.
Revised
-29 May, 2005
+08 June, 2005
© Copyright Beman Dawes, 2002-2005
Use, modification, and distribution are subject to the Boost Software
diff --git a/include/boost/filesystem/cerrno.hpp b/include/boost/filesystem/cerrno.hpp
new file mode 100644
index 0000000..d3b8358
--- /dev/null
+++ b/include/boost/filesystem/cerrno.hpp
@@ -0,0 +1,23 @@
+// Boost Filesystem cerrno.hpp header --------------------------------------//
+
+// © Copyright Beman Dawes 2005.
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See library home page at http://www.boost.org/libs/filesystem
+
+#ifndef BOOST_FILESYSTEM_CERRNO_HPP
+#define BOOST_FILESYSTEM_CERRNO_HPP
+
+#include
+
+#if defined __BORLANDC__
+#define ENOSYS 9997
+#endif
+
+#define EBADHANDLE 9998 // bad handle
+#define EOTHERERR 9999 // Other operating system error not translatable
+ // to a POSIX errno value
+
+#endif // include guard
diff --git a/include/boost/filesystem/path.hpp b/include/boost/filesystem/path.hpp
index 7a92e2f..255689f 100644
--- a/include/boost/filesystem/path.hpp
+++ b/include/boost/filesystem/path.hpp
@@ -79,35 +79,23 @@ namespace boost
};
# endif // ifndef BOOST_FILESYSTEM_NARROW_ONLY
- enum error_code
- {
- no_error = 0,
- system_error, // system generated error; if possible, is translated
- // to one of the more specific errors below.
- other_error, // library generated error
- security_error, // includes access rights, permissions failures
- read_only_error,
- io_error,
- path_error, // such as bad syntax
- not_found_error,
- not_directory_error,
- busy_error, // implies trying again might succeed
- not_ready_error, // ditto
- already_exists_error,
- not_empty_error,
- is_directory_error,
- out_of_space_error,
- out_of_memory_error,
- out_of_resource_error
- };
+ typedef int errno_type; // determined by C standard
+ typedef int system_error_type; // both POSIX and Windows use int
- typedef int system_error_type;
+# ifdef BOOST_WINDOWS_API
+ BOOST_FILESYSTEM_DECL
+ errno_type lookup_errno( system_error_type sys_err_code );
+# else
+ inline errno_type lookup_errno( system_error_type sys_err_code )
+ { return sys_err_code; }
+# endif
- BOOST_FILESYSTEM_DECL error_code
- lookup_error_code( system_error_type sys_err_code );
-
- BOOST_FILESYSTEM_DECL void
- system_message( system_error_type sys_err_code, std::string & target );
+ // deprecated support for legacy function name
+ inline errno_type lookup_error_code( system_error_type sys_err_code )
+ { return lookup_errno( sys_err_code ); }
+
+ BOOST_FILESYSTEM_DECL
+ void system_message( system_error_type sys_err_code, std::string & target );
// Effects: appends error message to target
# if defined(BOOST_WINDOWS_API) && !defined(BOOST_FILESYSTEM_NARROW_ONLY)
@@ -475,7 +463,7 @@ namespace boost
typename String::size_type size = -1
)
{
- if ( size == -1 ) size = src.size();
+ if ( size == String::npos ) size = src.size();
element_pos = 0;
element_size = 0;
if ( src.empty() ) return;
@@ -592,7 +580,7 @@ namespace boost
&& m_path[end_pos] == path_separator::value );
// skip separators unless root directory
- string_type::size_type root_dir_pos( detail::root_directory_start
+ typename string_type::size_type root_dir_pos( detail::root_directory_start
( m_path, end_pos ) );
for ( ;
end_pos > 0
@@ -644,7 +632,7 @@ namespace boost
template
String basic_path::root_directory() const
{
- string_type::size_type start(
+ typename string_type::size_type start(
detail::root_directory_start( m_path, m_path.size() ) );
return start == string_type::npos
@@ -730,7 +718,7 @@ namespace boost
template
basic_path & basic_path::canonize()
{
- static const string_type::value_type dot[]
+ static const typename string_type::value_type dot[]
= { path_relative::value, 0 };
if ( m_path.empty() ) return *this;
@@ -752,7 +740,7 @@ namespace boost
template
basic_path & basic_path::normalize()
{
- static const string_type::value_type dot[]
+ static const typename string_type::value_type dot[]
= { path_relative::value, 0 };
if ( m_path.empty() ) return *this;
@@ -796,7 +784,7 @@ namespace boost
&& temp.m_path[temp.m_path.size()-1]
== path_separator::value )
{
- string_type::size_type rds(
+ typename string_type::size_type rds(
detail::root_directory_start( temp.m_path,
temp.m_path.size() ) );
if ( rds == string_type::npos
@@ -839,11 +827,11 @@ namespace boost
// for Windows, use the alternate separator, and bypass extra
// root separators
- string_type::size_type root_dir_start(
+ typename string_type::size_type root_dir_start(
detail::root_directory_start( m_path, m_path.size() ) );
bool in_root( root_dir_start != string_type::npos );
String s;
- for ( string_type::size_type pos( 0 );
+ for ( typename string_type::size_type pos( 0 );
pos != m_path.size(); ++pos )
{
// special case // [net]
@@ -891,7 +879,7 @@ namespace boost
{
iterator itr;
itr.m_path_ptr = this;
- string_type::size_type element_size;
+ typename string_type::size_type element_size;
detail::first_element( m_path, itr.m_pos, element_size );
itr.m_name = m_path.substr( itr.m_pos, element_size );
return itr;
@@ -954,7 +942,7 @@ namespace boost
}
typedef typename Path::string_type string_type;
- string_type::size_type end_pos(
+ typename string_type::size_type end_pos(
ph.m_path_ptr->m_path.find( path_separator::value, ph.m_pos ) );
# ifdef BOOST_WINDOWS_PATH
if ( end_pos == string_type::npos )
@@ -973,17 +961,17 @@ namespace boost
typedef typename Path::string_type string_type;
- static const string_type::value_type separators[] = {
+ static const typename string_type::value_type separators[] = {
path_separator::value,
# ifdef BOOST_WINDOWS_PATH
path_alt_separator::value,
# endif
0 };
- string_type::size_type end_pos( ph.m_pos );
+ typename string_type::size_type end_pos( ph.m_pos );
- string_type::size_type root_dir_pos( detail::root_directory_start
- (
+ typename string_type::size_type root_dir_pos(
+ detail::root_directory_start(
ph.m_path_ptr->m_path, end_pos ) );
// if at end and there was a trailing non-root '/', return "."
diff --git a/src/exception.cpp b/src/exception.cpp
index 4d3e39c..fb4a5cc 100644
--- a/src/exception.cpp
+++ b/src/exception.cpp
@@ -16,6 +16,7 @@
#include
#include
+#include
namespace fs = boost::filesystem;
@@ -25,10 +26,9 @@ namespace fs = boost::filesystem;
namespace std { using ::strerror; }
# endif
+
# if defined( BOOST_WINDOWS_API )
# include "windows.h"
-# else
-# include // for POSIX error codes
# endif
#include // must be the last header
@@ -37,62 +37,59 @@ namespace fs = boost::filesystem;
namespace
{
- struct ec_xlate { int sys_ec; fs::error_code ec; };
+#ifdef BOOST_WINDOWS_API
+ struct ec_xlate { fs::system_error_type sys_ec; fs::errno_type ec; };
const ec_xlate ec_table[] =
{
-# ifdef BOOST_WINDOWS_API
- { 0, fs::other_error },
- { ERROR_ACCESS_DENIED, fs::security_error },
- { ERROR_INVALID_ACCESS, fs::security_error },
- { ERROR_SHARING_VIOLATION, fs::security_error },
- { ERROR_LOCK_VIOLATION, fs::security_error },
- { ERROR_LOCKED, fs::security_error },
- { ERROR_NOACCESS, fs::security_error },
- { ERROR_WRITE_PROTECT, fs::read_only_error },
- { ERROR_NOT_READY, fs::not_ready_error },
- { ERROR_SEEK, fs::io_error },
- { ERROR_READ_FAULT, fs::io_error },
- { ERROR_WRITE_FAULT, fs::io_error },
- { ERROR_CANTOPEN, fs::io_error },
- { ERROR_CANTREAD, fs::io_error },
- { ERROR_CANTWRITE, fs::io_error },
- { ERROR_DIRECTORY, fs::path_error },
- { ERROR_INVALID_NAME, fs::path_error },
- { ERROR_FILE_NOT_FOUND, fs::not_found_error },
- { ERROR_PATH_NOT_FOUND, fs::not_found_error },
- { ERROR_DEV_NOT_EXIST, fs::not_found_error },
- { ERROR_DEVICE_IN_USE, fs::busy_error },
- { ERROR_OPEN_FILES, fs::busy_error },
- { ERROR_BUSY_DRIVE, fs::busy_error },
- { ERROR_BUSY, fs::busy_error },
- { ERROR_FILE_EXISTS, fs::already_exists_error },
- { ERROR_ALREADY_EXISTS, fs::already_exists_error },
- { ERROR_DIR_NOT_EMPTY, fs::not_empty_error },
- { ERROR_HANDLE_DISK_FULL, fs::out_of_space_error },
- { ERROR_DISK_FULL, fs::out_of_space_error },
- { ERROR_OUTOFMEMORY, fs::out_of_memory_error },
- { ERROR_NOT_ENOUGH_MEMORY, fs::out_of_memory_error },
- { ERROR_TOO_MANY_OPEN_FILES, fs::out_of_resource_error }
-# else
- { 0, fs::other_error },
- { EACCES, fs::security_error },
- { EROFS, fs::read_only_error },
- { EIO, fs::io_error },
- { EINVAL, fs::path_error },
- { ENAMETOOLONG, fs::path_error },
- { ENOENT, fs::not_found_error },
- { ENOTDIR, fs::not_directory_error },
- { EAGAIN, fs::busy_error },
- { EBUSY, fs::busy_error },
- { ETXTBSY, fs::busy_error },
- { EEXIST, fs::already_exists_error },
- { ENOTEMPTY, fs::not_empty_error },
- { EISDIR, fs::is_directory_error },
- { ENOSPC, fs::out_of_space_error },
- { ENOMEM, fs::out_of_memory_error },
- { EMFILE, fs::out_of_resource_error }
-# endif
+ // see WinError.h comments for descriptions of errors
+
+ // most common errors first to speed sequential search
+ { ERROR_FILE_NOT_FOUND, ENOENT },
+ { ERROR_PATH_NOT_FOUND, ENOENT },
+
+ // alphabetical for easy maintenance
+ { 0, 0 }, // no error
+ { ERROR_ACCESS_DENIED, EACCES },
+ { ERROR_ALREADY_EXISTS, EEXIST },
+ { ERROR_BAD_UNIT, ENODEV },
+ { ERROR_BUFFER_OVERFLOW, ENAMETOOLONG },
+ { ERROR_BUSY, EBUSY },
+ { ERROR_BUSY_DRIVE, EBUSY },
+ { ERROR_CANNOT_MAKE, EACCES },
+ { ERROR_CANTOPEN, EIO },
+ { ERROR_CANTREAD, EIO },
+ { ERROR_CANTWRITE, EIO },
+ { ERROR_CURRENT_DIRECTORY, EACCES },
+ { ERROR_DEV_NOT_EXIST, ENODEV },
+ { ERROR_DEVICE_IN_USE, EBUSY },
+ { ERROR_DIR_NOT_EMPTY, ENOTEMPTY },
+ { ERROR_DIRECTORY, EINVAL }, // WinError.h: "The directory name is invalid"
+ { ERROR_DISK_FULL, ENOSPC },
+ { ERROR_FILE_EXISTS, EEXIST },
+ { ERROR_HANDLE_DISK_FULL, ENOSPC },
+ { ERROR_INVALID_ACCESS, EACCES },
+ { ERROR_INVALID_DRIVE, ENODEV },
+ { ERROR_INVALID_FUNCTION, ENOSYS },
+ { ERROR_INVALID_HANDLE, EBADHANDLE },
+ { ERROR_INVALID_NAME, EINVAL },
+ { ERROR_LOCK_VIOLATION, EACCES },
+ { ERROR_LOCKED, EACCES },
+ { ERROR_NOACCESS, EACCES },
+ { ERROR_NOT_ENOUGH_MEMORY, ENOMEM },
+ { ERROR_NOT_READY, EAGAIN },
+ { ERROR_NOT_SAME_DEVICE, EXDEV },
+ { ERROR_OPEN_FAILED, EIO },
+ { ERROR_OPEN_FILES, EBUSY },
+ { ERROR_OUTOFMEMORY, ENOMEM },
+ { ERROR_READ_FAULT, EIO },
+ { ERROR_SEEK, EIO },
+ { ERROR_SHARING_VIOLATION, EACCES },
+ { ERROR_TOO_MANY_OPEN_FILES, ENFILE },
+ { ERROR_WRITE_FAULT, EIO },
+ { ERROR_WRITE_PROTECT, EROFS },
+ { 0,EOTHERERR }
};
+#endif
} // unnamed namespace
@@ -100,8 +97,10 @@ namespace boost
{
namespace filesystem
{
- BOOST_FILESYSTEM_DECL error_code
- lookup_error_code( system_error_type sys_err_code )
+# ifdef BOOST_WINDOWS_API
+
+ BOOST_FILESYSTEM_DECL
+ errno_type lookup_errno( system_error_type sys_err_code )
{
for ( const ec_xlate * cur = &ec_table[0];
cur != ec_table
@@ -109,10 +108,9 @@ namespace boost
{
if ( sys_err_code == cur->sys_ec ) return cur->ec;
}
- return system_error; // general system error code
+ return EOTHERERR;
}
-# ifdef BOOST_WINDOWS_API
BOOST_FILESYSTEM_DECL void
system_message( system_error_type sys_err_code, std::string & target )
{
diff --git a/src/operations.cpp b/src/operations.cpp
index b1cca5f..f0e9f63 100644
--- a/src/operations.cpp
+++ b/src/operations.cpp
@@ -622,7 +622,11 @@ namespace boost
dir_itr_first(
void *& handle, const std::wstring & dir, std::wstring & target )
{
- std::wstring dirpath( dir + L"/*" );
+ // use a form of search Sebastian Martel reports will work with Win98
+ std::wstring dirpath( dir );
+ dirpath += (dirpath.empty()
+ || dirpath[dirpath.size()-1] != L'\\') ? L"\\*" : L"*";
+
WIN32_FIND_DATAW data;
if ( (handle = ::FindFirstFileW( dirpath.c_str(), &data ))
== INVALID_HANDLE_VALUE )
@@ -718,7 +722,11 @@ namespace boost
// causes a ERROR_FILE_NOT_FOUND error which we do not considered an
// error. It is treated as eof instead.
{
- std::string dirpath( dir + "/*" );
+ // use a form of search Sebastian Martel reports will work with Win98
+ std::string dirpath( dir );
+ dirpath += (dirpath.empty()
+ || dirpath[dirpath.size()-1] != '\\') ? "\\*" : "*";
+
WIN32_FIND_DATAA data;
if ( (handle = ::FindFirstFileA( dirpath.c_str(), &data ))
== INVALID_HANDLE_VALUE )
diff --git a/test/convenience_test.cpp b/test/convenience_test.cpp
index 9d70100..beaf785 100644
--- a/test/convenience_test.cpp
+++ b/test/convenience_test.cpp
@@ -28,21 +28,20 @@ using fs::path;
namespace
{
template< typename F >
- bool throws_fs_error( F func, fs::error_code ec =
- ::boost::filesystem::no_error ) // VC++ 7.1 build 2292 won't accept fs::
+ bool throws_fs_error( F func, fs::errno_type ec = 0 )
{
try { func(); }
catch ( const fs::filesystem_error & ex )
{
- if ( ec == fs::no_error
+ if ( ec == 0
|| ec == fs::lookup_error_code(ex.system_error()) ) return true;
std::cout
<< "exception reports " << fs::lookup_error_code(ex.system_error())
<< ", should be " << ec
<< "\n system_error() is " << ex.system_error()
<< std::endl;
- return true;
+ return false;
}
return false;
}
diff --git a/test/lpath.hpp b/test/lpath.hpp
index e5dcdb7..6fd625b 100644
--- a/test/lpath.hpp
+++ b/test/lpath.hpp
@@ -32,7 +32,7 @@ namespace std
return s1 == e ? 0 : (*s1<*s2 ? -1 : 1);
}
static size_t length(const char_type* s)
- { const char_type* b=s; for(;*s!=0L;++s); return s-b; }
+ { const char_type* b=s; for(;*s!=0L;++s){} return s-b; }
static const char_type* find(const char_type* s, size_t n, const char_type& a)
{ return 0; }
diff --git a/test/operations_test.cpp b/test/operations_test.cpp
index 86725fc..dcbd0cb 100644
--- a/test/operations_test.cpp
+++ b/test/operations_test.cpp
@@ -8,6 +8,7 @@
// See library home page at http://www.boost.org/libs/filesystem
#include
+#include
namespace fs = boost::filesystem;
#include
@@ -19,7 +20,6 @@ using boost::bind;
#include
#include
#include
-#include
#include
#ifndef BOOST_FILESYSTEM_NARROW_ONLY
@@ -42,6 +42,8 @@ using boost::bind;
using ::difftime; using ::time; using ::tm; using ::mktime; }
# endif
+#define CHECK_EXCEPTION(b,e) throws_fs_error(b,e,__LINE__)
+
namespace
{
bool report_throws;
@@ -70,22 +72,21 @@ namespace
}
template< typename F >
- bool throws_fs_error( F func, fs::error_code ec =
- ::boost::filesystem::no_error ) // VC++ 7.1 build 2292 won't accept fs::
+ bool throws_fs_error( F func, fs::errno_type ec, int line )
{
try { func(); }
catch ( const fs::filesystem_error & ex )
{
if ( report_throws ) std::cout << ex.what() << "\n";
- if ( ec == fs::no_error
+ if ( ec == 0
|| ec == fs::lookup_error_code(ex.system_error()) ) return true;
std::cout
- << "exception reports " << fs::lookup_error_code(ex.system_error())
+ << "\nline " << line
+ << " exception reports " << fs::lookup_error_code(ex.system_error())
<< ", should be " << ec
<< "\n system_error() is " << ex.system_error()
<< std::endl;
- return true;
}
return false;
}
@@ -132,10 +133,10 @@ int test_main( int argc, char * argv[] )
# endif
std::cout << "API is " << platform << '\n';
- std::cout << "initial_path().string() is\n \""
+ std::cout << "\ninitial_path().string() is\n \""
<< fs::initial_path().string()
<< "\"\n";
- std::cout << "initial_path().file_string() is\n \""
+ std::cout << "\ninitial_path().file_string() is\n \""
<< fs::initial_path().file_string()
<< "\"\n";
BOOST_CHECK( fs::initial_path().is_complete() );
@@ -147,6 +148,8 @@ int test_main( int argc, char * argv[] )
BOOST_CHECK( fs::complete( "/" ).string() == fs::initial_path().root_path().string() );
BOOST_CHECK( fs::complete( "foo" ).string() == fs::initial_path().string()+"/foo" );
BOOST_CHECK( fs::complete( "/foo" ).string() == fs::initial_path().root_path().string()+"foo" );
+ BOOST_CHECK( fs::complete( "foo", fs::path( "//net/bar" ) ).string()
+ == "//net/bar/foo" );
// predicate and status tests
fs::path ng( " no-way, Jose" );
@@ -177,8 +180,6 @@ int test_main( int argc, char * argv[] )
== "c:/" );
BOOST_CHECK( fs::complete( fs::path( "c:/foo" ) ).string()
== "c:/foo" );
- BOOST_CHECK( fs::complete( fs::path( "//share" ) ).string()
- == "//share" );
BOOST_CHECK( fs::system_complete( fs::path( fs::initial_path().root_name() ) ).string() == fs::initial_path().string() );
BOOST_CHECK( fs::system_complete( fs::path( fs::initial_path().root_name()
@@ -205,8 +206,8 @@ int test_main( int argc, char * argv[] )
fs::remove_all( dir ); // in case residue from prior failed tests
BOOST_CHECK( !fs::exists( dir ) );
- // the bound functions should throw, so throws_fs_error() should return true
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::file_size), ng ), fs::not_found_error ) );
+ // the bound functions should throw, so CHECK_EXCEPTION() should return true
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::file_size), ng ), ENOENT ) );
// test path::exception members
try { fs::file_size( ng ); } // will throw
@@ -221,8 +222,12 @@ int test_main( int argc, char * argv[] )
BOOST_CHECK( fs::exists( dir ) );
BOOST_CHECK( BOOST_FS_IS_EMPTY( dir ) );
BOOST_CHECK( fs::is_directory( dir ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::file_size), dir ),
- fs::is_directory_error ) );
+ if ( platform == "Windows" )
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::file_size), dir ),
+ ENOENT ) );
+ else
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::file_size), dir ),
+ EISDIR ) );
BOOST_CHECK( !fs::create_directory( dir ) );
BOOST_CHECK( !fs::is_symlink( dir ) );
@@ -302,8 +307,8 @@ int test_main( int argc, char * argv[] )
BOOST_CHECK( fs::is_file( file_ph ) );
BOOST_CHECK( BOOST_FS_IS_EMPTY( file_ph ) );
BOOST_CHECK( fs::file_size( file_ph ) == 0 );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::create_directory),
- file_ph ), fs::not_directory_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::create_directory),
+ file_ph ), EEXIST ) );
// create a file named "f1"
file_ph = dir / "f1";
create_file( file_ph, "foobar1" );
@@ -316,7 +321,8 @@ int test_main( int argc, char * argv[] )
// equivalence tests
fs::path ng2("does_not_exist2");
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::equivalent), ng, ng2 ) ) );
+ BOOST_CHECK( CHECK_EXCEPTION(
+ bind( BOOST_BND(fs::equivalent), ng, ng2 ), ENOENT ) );
BOOST_CHECK( fs::equivalent( file_ph, dir / "f1" ) );
BOOST_CHECK( fs::equivalent( dir, d1 / ".." ) );
BOOST_CHECK( !fs::equivalent( file_ph, dir ) );
@@ -348,8 +354,9 @@ int test_main( int argc, char * argv[] )
BOOST_CHECK( fs::exists( link_ph ) );
BOOST_CHECK( fs::exists( file_ph ) );
BOOST_CHECK( fs::equivalent( link_ph, file_ph ) );
- BOOST_CHECK( throws_fs_error(
- bind( BOOST_BND(fs::create_hard_link), dir, dir/"shouldnotwork" ), fs::not_found_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION(
+ bind( BOOST_BND(fs::create_hard_link), dir, dir/"shouldnotwork" ),
+ 0 ) );
}
// there was an inital bug in directory_iterator that caused premature
// close of an OS handle. This block will detect regression.
@@ -374,28 +381,29 @@ int test_main( int argc, char * argv[] )
// [case 1] make sure can't rename() a non-existent file
BOOST_CHECK( !fs::exists( d1 / "f99" ) );
BOOST_CHECK( !fs::exists( d1 / "f98" ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), d1 / "f99", d1 / "f98" ),
- fs::not_found_error ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), fs::path(""), d1 / "f98" ),
- fs::not_found_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename), d1 / "f99", d1 / "f98" ),
+ ENOENT ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename), fs::path(""), d1 / "f98" ),
+ ENOENT ) );
// [case 2] rename() target.empty()
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), file_ph, "" ),
- fs::not_found_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename), file_ph, "" ),
+ ENOENT ) );
// [case 3] make sure can't rename() to an existent file or directory
BOOST_CHECK( fs::exists( dir / "f1" ) );
BOOST_CHECK( fs::exists( d1 / "f2" ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), dir / "f1", d1 / "f2" ) ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename),
+ dir / "f1", d1 / "f2" ), EEXIST ) );
// several POSIX implementations (cygwin, openBSD) report ENOENT instead of EEXIST,
// so we don't verify error type on the above test.
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), dir, d1 ) ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename), dir, d1 ), 0 ) );
// [case 4A] can't rename() file to a nonexistent parent directory
BOOST_CHECK( !fs::is_directory( dir / "f1" ) );
BOOST_CHECK( !fs::exists( dir / "d3/f3" ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), dir / "f1", dir / "d3/f3" ),
- fs::not_found_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename), dir / "f1", dir / "d3/f3" ),
+ ENOENT ) );
// [case 4B] rename() file in same directory
BOOST_CHECK( fs::exists( d1 / "f2" ) );
@@ -421,8 +429,8 @@ int test_main( int argc, char * argv[] )
BOOST_CHECK( fs::exists( d1 ) );
BOOST_CHECK( !fs::exists( dir / "d3/d5" ) );
BOOST_CHECK( !fs::exists( dir / "d3" ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::rename), d1, dir / "d3/d5" ),
- fs::not_found_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::rename), d1, dir / "d3/d5" ),
+ ENOENT ) );
// [case 5B] rename() on directory
fs::path d3( dir / "d3" );
@@ -471,7 +479,7 @@ int test_main( int argc, char * argv[] )
BOOST_CHECK( fs::exists( d1 ) );
BOOST_CHECK( fs::is_directory( d1 ) );
BOOST_CHECK( BOOST_FS_IS_EMPTY( d1 ) );
- BOOST_CHECK( throws_fs_error( bind( BOOST_BND(fs::remove), dir ), fs::not_empty_error ) );
+ BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::remove), dir ), ENOTEMPTY ) );
BOOST_CHECK( fs::remove( d1 ) );
BOOST_CHECK( !fs::exists( d1 ) );