$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: bdawes_at_[hidden]
Date: 2007-08-24 17:35:51
Author: bemandawes
Date: 2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
New Revision: 38912
URL: http://svn.boost.org/trac/boost/changeset/38912
Log:
Add current_path() setter, !#800, change form of some includes in response to bug report !#600
Removed:
   branches/libs/filesystem/boost/filesystem/cerrno.hpp
Text files modified: 
   branches/c++0x/boost/boost/cerrno.hpp                        |    14 +--                                     
   branches/libs/filesystem/boost/filesystem/convenience.hpp    |     9 +-                                      
   branches/libs/filesystem/boost/filesystem/operations.hpp     |    13 +++                                     
   branches/libs/filesystem/boost/filesystem/path.hpp           |     2                                         
   branches/libs/filesystem/filesystem/src/operations.cpp       |   158 +++++++++++++++++++++++---------------- 
   branches/libs/filesystem/filesystem/src/path.cpp             |     6                                         
   branches/libs/filesystem/filesystem/test/operations_test.cpp |    58 ++++++++------                          
   branches/libs/filesystem/filesystem/test/path_test.cpp       |     2                                         
   8 files changed, 156 insertions(+), 106 deletions(-)
Modified: branches/c++0x/boost/boost/cerrno.hpp
==============================================================================
--- branches/c++0x/boost/boost/cerrno.hpp	(original)
+++ branches/c++0x/boost/boost/cerrno.hpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -1,14 +1,14 @@
-//  Boost Filesystem cerrno.hpp header  --------------------------------------//
+//  Boost cerrno.hpp header  -------------------------------------------------//
 
-//  © Copyright Beman Dawes 2005.
+//  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
+//  See library home page at http://www.boost.org/libs/system
 
-#ifndef BOOST_FILESYSTEM_CERRNO_HPP
-#define BOOST_FILESYSTEM_CERRNO_HPP
+#ifndef BOOST_CERRNO_HPP
+#define BOOST_CERRNO_HPP
 
 #include <cerrno>
 
@@ -190,8 +190,4 @@
 #define EILSEQ 9945
 #endif
 
-#define EBADHANDLE   9998  // bad handle
-#define EOTHER       9999  // Other error not translatable
-                           // to a POSIX errno value
-
 #endif // include guard
Deleted: branches/libs/filesystem/boost/filesystem/cerrno.hpp
==============================================================================
--- branches/libs/filesystem/boost/filesystem/cerrno.hpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
+++ (empty file)
@@ -1,23 +0,0 @@
-//  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 <cerrno>
-
-#if defined __BORLANDC__
-#define ENOSYS       9997
-#endif
-
-#define EBADHANDLE   9998  // bad handle
-#define EOTHER       9999  // Other error not translatable
-                           // to a POSIX errno value
-
-#endif // include guard
Modified: branches/libs/filesystem/boost/filesystem/convenience.hpp
==============================================================================
--- branches/libs/filesystem/boost/filesystem/convenience.hpp	(original)
+++ branches/libs/filesystem/boost/filesystem/convenience.hpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -1,7 +1,7 @@
 //  boost/filesystem/convenience.hpp  ----------------------------------------//
 
-//  © Copyright Beman Dawes, 2002-2005
-//  © Copyright Vladimir Prus, 2002
+//  Copyright Beman Dawes, 2002-2005
+//  Copyright Vladimir Prus, 2002
 //  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)
@@ -14,7 +14,7 @@
 #define BOOST_FILESYSTEM_CONVENIENCE_HPP
 
 #include <boost/filesystem/operations.hpp>
-#include <boost/cerrno.hpp>
+#include <boost/system/error_code.hpp>
 #include <vector>
 #include <stack>
 
@@ -45,7 +45,8 @@
            if ( !ph.empty() && !is_directory(ph) )
                boost::throw_exception( basic_filesystem_error<Path>(
                  "boost::filesystem::create_directories", ph,
-                 boost::system::error_code(EEXIST, boost::system::errno_ecat) ) );
+                 boost::system::make_error_code(
+                   boost::system::posix::file_exists ) ) );
            return false;
          }
 
Modified: branches/libs/filesystem/boost/filesystem/operations.hpp
==============================================================================
--- branches/libs/filesystem/boost/filesystem/operations.hpp	(original)
+++ branches/libs/filesystem/boost/filesystem/operations.hpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -160,6 +160,8 @@
         last_write_time_api( const std::string & ph, std::time_t new_value );
       BOOST_FILESYSTEM_DECL system::error_code
         get_current_path_api( std::string & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        set_current_path_api( const std::string & ph );
       BOOST_FILESYSTEM_DECL query_pair
         create_directory_api( const std::string & ph );
       BOOST_FILESYSTEM_DECL system::error_code
@@ -200,6 +202,8 @@
         last_write_time_api( const std::wstring & ph, std::time_t new_value );
       BOOST_FILESYSTEM_DECL system::error_code 
         get_current_path_api( std::wstring & ph );
+      BOOST_FILESYSTEM_DECL system::error_code 
+        set_current_path_api( const std::wstring & ph );
       BOOST_FILESYSTEM_DECL query_pair
         create_directory_api( const std::wstring & ph );
 # ifdef BOOST_FS_HARD_LINK
@@ -506,6 +510,15 @@
     }
 
     template< class Path >
+    void current_path( const Path & ph )
+    {
+      system::error_code ec( detail::set_current_path_api( ph.string() ) );
+      if ( ec )
+          boost::throw_exception( basic_filesystem_error<Path>(
+            "boost::filesystem::current_path", ph, ec ) );
+    }
+
+    template< class Path >
     const Path & initial_path()
     {
       static Path init_path;
Modified: branches/libs/filesystem/boost/filesystem/path.hpp
==============================================================================
--- branches/libs/filesystem/boost/filesystem/path.hpp	(original)
+++ branches/libs/filesystem/boost/filesystem/path.hpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -1,6 +1,6 @@
 //  boost/filesystem/path.hpp  -----------------------------------------------//
 
-// Copyright Beman Dawes 2002-2005
+//  Copyright Beman Dawes 2002-2005
 
 //  Distributed under 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)
Modified: branches/libs/filesystem/filesystem/src/operations.cpp
==============================================================================
--- branches/libs/filesystem/filesystem/src/operations.cpp	(original)
+++ branches/libs/filesystem/filesystem/src/operations.cpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -42,18 +42,17 @@
 
 namespace fs = boost::filesystem;
 using boost::system::error_code;
-using boost::system::errno_ecat;
-using boost::system::native_ecat;
+using boost::system::system_category;
 
 # if defined(BOOST_WINDOWS_API)
-#   include "windows.h"
+#   include <windows.h>
 #   if defined(__BORLANDC__) || defined(__MWERKS__)
 #     if defined(__BORLANDC__)
         using std::time_t;
 #     endif
-#     include "utime.h"
+#     include <utime.h>
 #   else
-#     include "sys/utime.h"
+#     include <sys/utime.h>
 #   endif
 
 # else // BOOST_POSIX_API
@@ -67,10 +66,10 @@
 #     define BOOST_STATVFS statfs
 #     define BOOST_STATVFS_F_FRSIZE static_cast<boost::uintmax_t>( vfs.f_bsize )
 #   endif
-#   include "dirent.h"
-#   include "unistd.h"
-#   include "fcntl.h"
-#   include "utime.h"
+#   include <dirent.h>
+#   include <unistd.h>
+#   include <fcntl.h>
+#   include <utime.h>
 # endif
 
 //  BOOST_FILESYSTEM_STATUS_CACHE enables file_status cache in
@@ -143,6 +142,9 @@
   inline DWORD get_current_directory( DWORD sz, wchar_t * buf )
     { return ::GetCurrentDirectoryW( sz, buf ); } 
 
+  inline bool set_current_directory( const wchar_t * buf )
+    { return ::SetCurrentDirectoryW( buf ) != 0 ; } 
+
   inline bool get_free_disk_space( const std::wstring & ph,
     PULARGE_INTEGER avail, PULARGE_INTEGER total, PULARGE_INTEGER free )
     { return ::GetDiskFreeSpaceExW( ph.c_str(), avail, total, free ) != 0; }
@@ -178,7 +180,7 @@
     DWORD attr( get_file_attributes( ph.c_str() ) );
     if ( attr == 0xFFFFFFFF )
     {
-      ec = error_code( ::GetLastError(), native_ecat );
+      ec = error_code( ::GetLastError(), system_category );
       if ((ec.value() == ERROR_FILE_NOT_FOUND)
         || (ec.value() == ERROR_PATH_NOT_FOUND)
         || (ec.value() == ERROR_INVALID_NAME) // "tools/jam/src/:sys:stat.h", "//foo"
@@ -206,7 +208,7 @@
   {
     WIN32_FILE_ATTRIBUTE_DATA fad;
     if ( get_file_attributes_ex( ph.c_str(), fad ) == 0 )
-      return std::make_pair( error_code( ::GetLastError(), native_ecat ), false );    
+      return std::make_pair( error_code( ::GetLastError(), system_category ), false );    
     return std::make_pair( error_code(),
       ( fad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
         ? is_empty_directory( ph )
@@ -276,14 +278,14 @@
         { return std::make_pair( error_code(), false ); }
       assert( p1.handle == INVALID_HANDLE_VALUE
         && p2.handle == INVALID_HANDLE_VALUE );
-        { return std::make_pair( error_code( error1, errno_ecat), false ); }
+        { return std::make_pair( error_code( error1, system_category), false ); }
     }
     // at this point, both handles are known to be valid
     BY_HANDLE_FILE_INFORMATION info1, info2;
     if ( !::GetFileInformationByHandle( p1.handle, &info1 ) )
-      { return std::make_pair( error_code( ::GetLastError(), native_ecat ), false ); }
+      { return std::make_pair( error_code( ::GetLastError(), system_category ), false ); }
     if ( !::GetFileInformationByHandle( p2.handle, &info2 ) )
-      { return std::make_pair( error_code( ::GetLastError(), native_ecat ), false ); }
+      { return std::make_pair( error_code( ::GetLastError(), system_category ), false ); }
     // In theory, volume serial numbers are sufficient to distinguish between
     // devices, but in practice VSN's are sometimes duplicated, so last write
     // time and file size are also checked.
@@ -306,9 +308,9 @@
     WIN32_FILE_ATTRIBUTE_DATA fad;
     // by now, intmax_t is 64-bits on all Windows compilers
     if ( get_file_attributes_ex( ph.c_str(), fad ) == 0 )
-      return std::make_pair( error_code( ::GetLastError(), native_ecat ), 0 );    
+      return std::make_pair( error_code( ::GetLastError(), system_category ), 0 );    
     if ( (fad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0 )
-      return std::make_pair( error_code( ERROR_FILE_NOT_FOUND, native_ecat), 0 );
+      return std::make_pair( error_code( ERROR_FILE_NOT_FOUND, system_category), 0 );
     return std::make_pair( error_code(),
       (static_cast<boost::uintmax_t>(fad.nFileSizeHigh)
         << (sizeof(fad.nFileSizeLow)*8))
@@ -340,7 +342,7 @@
     }
     else
     {
-      result.first = error_code( ::GetLastError(), native_ecat );
+      result.first = error_code( ::GetLastError(), system_category );
       result.second.capacity = result.second.free
         = result.second.available = 0;
     }
@@ -361,11 +363,22 @@
     typedef typename String::value_type value_type;
     boost::scoped_array<value_type> buf( new value_type[sz] );
     if ( get_current_directory( sz, buf.get() ) == 0 )
-      return error_code( ::GetLastError(), native_ecat );
+      return error_code( ::GetLastError(), system_category );
     ph = buf.get();
     return error_code();
   }
 
+  inline bool set_current_directory( const char * buf )
+    { return ::SetCurrentDirectoryA( buf ) != 0; } 
+
+  template< class String >
+  error_code
+  set_current_path_template( const String & ph )
+  {
+    return error_code( set_current_directory( ph.c_str() )
+      ? 0 : ::GetLastError(), system_category );
+  }
+
   inline std::size_t get_full_path_name(
     const std::string & ph, std::size_t len, char * buf, char ** p )
   {
@@ -384,13 +397,13 @@
     typename String::value_type * pfn;
     std::size_t len = get_full_path_name( ph,
       buf_size , buf, &pfn );
-    if ( len == 0 ) return error_code( ::GetLastError(), native_ecat );
+    if ( len == 0 ) return error_code( ::GetLastError(), system_category );
     if ( len > buf_size )
     {
       typedef typename String::value_type value_type;
       boost::scoped_array<value_type> big_buf( new value_type[len] );
       if ( (len=get_full_path_name( ph, len , big_buf.get(), &pfn ))
-        == 0 ) return error_code( ::GetLastError(), native_ecat );
+        == 0 ) return error_code( ::GetLastError(), system_category );
       big_buf[len] = '\0';
       target = big_buf.get();
       return error_code();
@@ -409,9 +422,9 @@
         FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
         OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ) );
     if ( hw.handle == INVALID_HANDLE_VALUE )
-      return error_code( ::GetLastError(), native_ecat );
+      return error_code( ::GetLastError(), system_category );
     return error_code( ::GetFileTime( hw.handle, 0, 0, &last_write_time ) != 0
-      ? 0 : ::GetLastError(), native_ecat );
+      ? 0 : ::GetLastError(), system_category );
   }
 
   template<class String>
@@ -423,9 +436,9 @@
         FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
         OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ) );
     if ( hw.handle == INVALID_HANDLE_VALUE )
-      return error_code( ::GetLastError(), native_ecat );
+      return error_code( ::GetLastError(), system_category );
     return error_code( ::SetFileTime( hw.handle, 0, 0, &last_write_time ) != 0
-      ? 0 : ::GetLastError(), native_ecat );
+      ? 0 : ::GetLastError(), system_category );
   }
 
   // these constants come from inspecting some Microsoft sample code
@@ -490,11 +503,11 @@
     if ( fs::is_directory( sf ) )
     {
       if ( !remove_directory( ph ) )
-        return error_code(::GetLastError(), native_ecat);
+        return error_code(::GetLastError(), system_category);
     }
     else
     {
-      if ( !delete_file( ph ) ) return error_code(::GetLastError(), native_ecat);
+      if ( !delete_file( ph ) ) return error_code(::GetLastError(), system_category);
     }
     return error_code();
   }
@@ -508,7 +521,7 @@
   {
     error_code error, dummy;
     if ( create_directory( dir_ph ) ) return std::make_pair( error, true );
-    error = error_code( ::GetLastError(), native_ecat );
+    error = error_code( ::GetLastError(), system_category );
     // an error here may simply mean the postcondition is already met
     if ( error.value() == ERROR_ALREADY_EXISTS
       && fs::is_directory( fs::detail::status_api( dir_ph, dummy ) ) )
@@ -529,7 +542,7 @@
     const String & from_ph )
   {
     return error_code( create_hard_link( to_ph.c_str(), from_ph.c_str() )
-      ? 0 : ::GetLastError(), native_ecat );
+      ? 0 : ::GetLastError(), system_category );
   }
 #endif
 
@@ -548,9 +561,9 @@
       BOOST_FILESYSTEM_DECL error_code not_found_error()
       {
 #     ifdef BOOST_WINDOWS_API
-        return error_code(ERROR_PATH_NOT_FOUND, native_ecat);
+        return error_code(ERROR_PATH_NOT_FOUND, system_category);
 #     else
-        return error_code(ENOENT, errno_ecat); 
+        return error_code(ENOENT, system_category); 
 #     endif
       }
 
@@ -601,6 +614,11 @@
       get_current_path_api( std::wstring & ph )
         { return get_current_path_template( ph ); }
 
+      BOOST_FILESYSTEM_DECL
+      error_code 
+      set_current_path_api( const std::wstring & ph )
+        { return set_current_path_template( ph ); }
+
       BOOST_FILESYSTEM_DECL error_code
         get_full_path_name_api( const std::wstring & ph, std::wstring & target )
          { return get_full_path_name_template( ph, target ); }
@@ -627,7 +645,7 @@
       BOOST_FILESYSTEM_DECL error_code
       create_symlink_api( const std::wstring & to_ph,
         const std::wstring & from_ph )
-        { return error_code( ERROR_NOT_SUPPORTED, native_ecat ); }
+        { return error_code( ERROR_NOT_SUPPORTED, system_category ); }
 
       BOOST_FILESYSTEM_DECL error_code
       remove_api( const std::wstring & ph ) { return remove_template( ph ); }
@@ -636,14 +654,14 @@
       rename_api( const std::wstring & from, const std::wstring & to )
       {
         return error_code( ::MoveFileW( from.c_str(), to.c_str() )
-          ? 0 : ::GetLastError(), native_ecat );
+          ? 0 : ::GetLastError(), system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code
       copy_file_api( const std::wstring & from, const std::wstring & to )
       {
         return error_code( ::CopyFileW( from.c_str(), to.c_str(), /*fail_if_exists=*/true )
-          ? 0 : ::GetLastError(), native_ecat );
+          ? 0 : ::GetLastError(), system_category );
       }
 
       BOOST_FILESYSTEM_DECL bool create_file_api( const std::wstring & ph,
@@ -719,7 +737,7 @@
         { 
           handle = 0;
           return error_code( ::GetLastError() == ERROR_FILE_NOT_FOUND
-            ? 0 : ::GetLastError(), native_ecat );
+            ? 0 : ::GetLastError(), system_category );
         }
         target = data.cFileName;
         if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
@@ -737,7 +755,7 @@
         {
           int error = ::GetLastError();
           dir_itr_close( handle );
-          return error_code( error == ERROR_NO_MORE_FILES ? 0 : error, native_ecat );
+          return error_code( error == ERROR_NO_MORE_FILES ? 0 : error, system_category );
         }
         target = data.cFileName;
         if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
@@ -774,6 +792,11 @@
       get_current_path_api( std::string & ph )
         { return get_current_path_template( ph ); }
 
+      BOOST_FILESYSTEM_DECL
+      error_code 
+      set_current_path_api( const std::string & ph )
+        { return set_current_path_template( ph ); }
+
       BOOST_FILESYSTEM_DECL error_code
         get_full_path_name_api( const std::string & ph, std::string & target )
          { return get_full_path_name_template( ph, target ); }
@@ -802,7 +825,7 @@
       BOOST_FILESYSTEM_DECL error_code
       create_symlink_api( const std::string & to_ph,
         const std::string & from_ph )
-        { return error_code( ERROR_NOT_SUPPORTED, native_ecat ); }
+        { return error_code( ERROR_NOT_SUPPORTED, system_category ); }
 
       BOOST_FILESYSTEM_DECL error_code
       remove_api( const std::string & ph ) { return remove_template( ph ); }
@@ -811,14 +834,14 @@
       rename_api( const std::string & from, const std::string & to )
       {
         return error_code( ::MoveFileA( from.c_str(), to.c_str() )
-          ? 0 : ::GetLastError(), native_ecat );
+          ? 0 : ::GetLastError(), system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code
       copy_file_api( const std::string & from, const std::string & to )
       {
         return error_code( ::CopyFileA( from.c_str(), to.c_str(), /*fail_if_exists=*/true )
-          ? 0 : ::GetLastError(), native_ecat );
+          ? 0 : ::GetLastError(), system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code
@@ -840,7 +863,7 @@
         { 
           handle = 0;
           return error_code( ::GetLastError() == ERROR_FILE_NOT_FOUND
-            ? 0 : ::GetLastError(), native_ecat );
+            ? 0 : ::GetLastError(), system_category );
         }
         target = data.cFileName;
         if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
@@ -856,7 +879,7 @@
         {
           bool ok = ::FindClose( handle ) != 0;
           handle = 0;
-          return error_code( ok ? 0 : ::GetLastError(), native_ecat );
+          return error_code( ok ? 0 : ::GetLastError(), system_category );
         }
         return error_code();
       }
@@ -870,7 +893,7 @@
         {
           int error = ::GetLastError();
           dir_itr_close( handle );
-          return error_code( error == ERROR_NO_MORE_FILES ? 0 : error, native_ecat );
+          return error_code( error == ERROR_NO_MORE_FILES ? 0 : error, system_category );
         }
         target = data.cFileName;
         if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
@@ -892,7 +915,7 @@
             ec = error_code();
             return fs::file_status( fs::file_not_found );
           }
-          ec = error_code( errno, errno_ecat );
+          ec = error_code( errno, system_category );
           return fs::file_status( fs::status_unknown );
         }
         ec = error_code();
@@ -922,7 +945,7 @@
             ec = error_code();
             return fs::file_status( fs::file_not_found );
           }
-          ec = error_code( errno, errno_ecat );
+          ec = error_code( errno, system_category );
           return fs::file_status( fs::status_unknown );
         }
         ec = error_code();
@@ -957,7 +980,7 @@
       {
         struct stat path_stat;
         if ( (::stat( ph.c_str(), &path_stat )) != 0 )
-          return std::make_pair( error_code( errno, errno_ecat ), false );        
+          return std::make_pair( error_code( errno, system_category ), false );        
         return std::make_pair( error_code(), S_ISDIR( path_stat.st_mode )
           ? is_empty_directory( ph )
           : path_stat.st_size == 0 );
@@ -971,7 +994,7 @@
         struct stat s1;
         int e1( ::stat( ph1.c_str(), &s1 ) );
         if ( e1 != 0 || e2 != 0 )
-          return std::make_pair( error_code( e1 != 0 && e2 != 0 ? errno : 0, errno_ecat ), false );
+          return std::make_pair( error_code( e1 != 0 && e2 != 0 ? errno : 0, system_category ), false );
         // at this point, both stats are known to be valid
         return std::make_pair( error_code(),
             s1.st_dev == s2.st_dev
@@ -988,9 +1011,9 @@
       {
         struct stat path_stat;
         if ( ::stat( ph.c_str(), &path_stat ) != 0 )
-          return std::make_pair( error_code( errno, errno_ecat ), 0 );
+          return std::make_pair( error_code( errno, system_category ), 0 );
         if ( !S_ISREG( path_stat.st_mode ) )
-          return std::make_pair( error_code( EPERM, errno_ecat ), 0 ); 
+          return std::make_pair( error_code( EPERM, system_category ), 0 ); 
         return std::make_pair( error_code(),
           static_cast<boost::uintmax_t>(path_stat.st_size) );
       }
@@ -1002,7 +1025,7 @@
         space_pair result;
         if ( ::BOOST_STATVFS( ph.c_str(), &vfs ) != 0 )
         {
-          result.first = error_code( errno, errno_ecat );
+          result.first = error_code( errno, system_category );
           result.second.capacity = result.second.free
             = result.second.available = 0;
         }
@@ -1024,7 +1047,7 @@
       {
         struct stat path_stat;
         if ( ::stat( ph.c_str(), &path_stat ) != 0 )
-          return std::make_pair( error_code( errno, errno_ecat ), 0 );
+          return std::make_pair( error_code( errno, system_category ), 0 );
         return std::make_pair( error_code(), path_stat.st_mtime );
       }
 
@@ -1033,11 +1056,11 @@
       {
         struct stat path_stat;
         if ( ::stat( ph.c_str(), &path_stat ) != 0 )
-          return error_code( errno, errno_ecat );
+          return error_code( errno, system_category );
         ::utimbuf buf;
         buf.actime = path_stat.st_atime; // utime() updates access time too:-(
         buf.modtime = new_value;
-        return error_code( ::utime( ph.c_str(), &buf ) != 0 ? errno : 0, errno_ecat );
+        return error_code( ::utime( ph.c_str(), &buf ) != 0 ? errno : 0, system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code 
@@ -1054,7 +1077,7 @@
 #         if defined(__MSL__) && (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
               && errno != 0
 #         endif
-              ) return error_code( errno, errno_ecat );
+              ) return error_code( errno, system_category );
           }
           else
           {
@@ -1065,6 +1088,13 @@
         return error_code();
       }
 
+      BOOST_FILESYSTEM_DECL error_code
+      set_current_path_api( std::string & ph )
+      {
+        return error_code( ::chdir( ph.string().c_str()
+          ? errno : 0, system_category );
+      }
+
       BOOST_FILESYSTEM_DECL fs::detail::query_pair
       create_directory_api( const std::string & ph )
       {
@@ -1074,7 +1104,7 @@
         error_code dummy;
         if ( ec != EEXIST 
           || !fs::is_directory( status_api( ph, dummy ) ) )
-          { return std::make_pair( error_code( ec, errno_ecat ), false ); }
+          { return std::make_pair( error_code( ec, system_category ), false ); }
         return std::make_pair( error_code(), false );
       }
 
@@ -1083,7 +1113,7 @@
           const std::string & from_ph )
       {
         return error_code( ::link( to_ph.c_str(), from_ph.c_str() ) == 0
-          ? 0 : errno, errno_ecat );
+          ? 0 : errno, system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code
@@ -1091,7 +1121,7 @@
           const std::string & from_ph )
       {
         return error_code( ::symlink( to_ph.c_str(), from_ph.c_str() ) == 0
-          ? 0 : errno, errno_ecat ); 
+          ? 0 : errno, system_category ); 
       }
 
       BOOST_FILESYSTEM_DECL error_code
@@ -1116,7 +1146,7 @@
           // shall fail and set errno to EEXIST or ENOTEMPTY."
           // Linux uses ENOTEMPTY, Solaris uses EEXIST.
           if ( error == EEXIST ) error = ENOTEMPTY;
-          return error_code( error, errno_ecat );
+          return error_code( error, system_category );
         }
         return error_code();
       }
@@ -1127,9 +1157,9 @@
         // POSIX is too permissive so must check
         error_code dummy;
         if ( fs::exists( status_api( to, dummy ) ) ) 
-          return error_code( EEXIST, errno_ecat );
+          return error_code( EEXIST, system_category );
         return error_code( std::rename( from.c_str(), to.c_str() ) != 0 
-          ? errno : 0, errno_ecat );
+          ? errno : 0, system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code
@@ -1149,7 +1179,7 @@
                                 from_stat.st_mode )) < 0 )
         {
           if ( infile >= 0 ) ::close( infile );
-          return error_code( errno, errno_ecat );
+          return error_code( errno, system_category );
         }
 
         ssize_t sz, sz_read=1, sz_write;
@@ -1174,7 +1204,7 @@
         if ( ::close( infile) < 0 ) sz_read = -1;
         if ( ::close( outfile) < 0 ) sz_read = -1;
 
-        return error_code( sz_read < 0 ? errno : 0, errno_ecat );
+        return error_code( sz_read < 0 ? errno : 0, system_category );
       }
 
       BOOST_FILESYSTEM_DECL error_code
@@ -1184,10 +1214,10 @@
       {
         static const std::string dummy_first_name( "." );
         if ( (handle = ::opendir( dir.c_str() )) == 0 )
-          return error_code( errno, errno_ecat );
+          return error_code( errno, system_category );
         target = dummy_first_name;
         long pc_name_max( ::pathconf( dir.c_str(), _PC_NAME_MAX ) );
-        if ( pc_name_max == -1L ) return error_code( errno, errno_ecat );
+        if ( pc_name_max == -1L ) return error_code( errno, system_category );
         dirent de;
         buffer = std::malloc( (sizeof(dirent) - sizeof(de.d_name))
           + static_cast<std::size_t>( pc_name_max ) + 1 );
@@ -1202,7 +1232,7 @@
         if ( handle == 0 ) return error_code();
         DIR * h( static_cast<DIR*>(handle) );
         handle = 0;
-        return error_code( ::closedir( h ) == 0 ? 0 : errno, errno_ecat );
+        return error_code( ::closedir( h ) == 0 ? 0 : errno, system_category );
       }
 
       // warning: the only dirent member updated is d_name
@@ -1238,7 +1268,7 @@
         dirent * result;
         int return_code;
         if ( (return_code = readdir_r_simulator( static_cast<DIR*>(handle),
-          entry, &result )) != 0 ) return error_code( errno, errno_ecat );
+          entry, &result )) != 0 ) return error_code( errno, system_category );
         if ( result == 0 ) return dir_itr_close( handle, buffer );
         target = entry->d_name;
 #     ifdef BOOST_FILESYSTEM_STATUS_CACHE
Modified: branches/libs/filesystem/filesystem/src/path.cpp
==============================================================================
--- branches/libs/filesystem/filesystem/src/path.cpp	(original)
+++ branches/libs/filesystem/filesystem/src/path.cpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -62,7 +62,7 @@
       if ( locked ) boost::throw_exception(
         wfilesystem_error(
           "boost::filesystem::wpath_traits::imbue() after lockdown",
-          system::error_code(EOTHER, system::errno_ecat) ) );
+          system::make_error_code( system::posix::not_supported ) ) );
       imbue( new_loc, std::nothrow );
     }
     
@@ -86,7 +86,7 @@
         work.get()+work_size, to_next ) != std::codecvt_base::ok )
         boost::throw_exception( boost::filesystem::wfilesystem_error(
           "boost::filesystem::wpath::to_external conversion error",
-          ph, system::error_code( EINVAL, system::errno_ecat ) ) );
+          ph, system::posix::invalid_argument ) );
       *to_next = '\0';
       return external_string_type( work.get() );
     }
@@ -105,7 +105,7 @@
         work.get()+work_size, to_next ) != std::codecvt_base::ok )
         boost::throw_exception( boost::filesystem::wfilesystem_error(
           "boost::filesystem::wpath::to_internal conversion error",
-          system::error_code( EINVAL, system::errno_ecat ) ) );
+          system::posix::invalid_argument ) );
       *to_next = L'\0';
       return internal_string_type( work.get() );
     }
Modified: branches/libs/filesystem/filesystem/test/operations_test.cpp
==============================================================================
--- branches/libs/filesystem/filesystem/test/operations_test.cpp	(original)
+++ branches/libs/filesystem/filesystem/test/operations_test.cpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -26,7 +26,7 @@
 
 using boost::bind;
 using boost::system::error_code;
-using boost::system::errno_ecat;
+using boost::system::system_category;
 using boost::system::system_error;
 
 #include <fstream>
@@ -71,7 +71,7 @@
     std::ofstream f( ph.file_string().c_str() );
     if ( !f )
       throw fs::filesystem_error( "operations_test create_file",
-      ph, error_code(errno, errno_ecat) );
+      ph, error_code(errno, system_category) );
     if ( !contents.empty() ) f << contents;
   }
 
@@ -80,7 +80,7 @@
     std::ifstream f( ph.file_string().c_str() );
     if ( !f )
       throw fs::filesystem_error( "operations_test verify_file",
-        ph, error_code(errno, errno_ecat) );
+        ph, error_code(errno, system_category) );
     std::string contents;
     f >> contents;
     if ( contents != expected )
@@ -101,10 +101,10 @@
         std::cout << "\n" << ex.what() << "\n";
       }
       if ( en == 0
-        || en == ex.code().to_errno() ) return true;
+        || en == ex.code().default_error_condition().value() ) return true;
       std::cout
         << "\nWarning: line " << line
-        << " exception reports iso() " << ex.code().to_errno()
+        << " exception reports default_error_condition().value() " << ex.code().default_error_condition().value()
         << ", should be " << en
         << "\n value() is " << ex.code().value()
         << std::endl;
@@ -160,7 +160,7 @@
       if ( report_throws ) std::cout << x.what() << std::endl;
       if ( platform == "Windows" )
         BOOST_CHECK( std::strcmp( x.what(),
-          "boost::filesystem::create_directory: The system cannot find the path specified." ) == 0 );
+          "boost::filesystem::create_directory: The system cannot find the path specified" ) == 0 );
     }
     BOOST_CHECK( exception_thrown );
 
@@ -176,7 +176,7 @@
       if ( platform == "Windows" )
       {
         bool ok ( std::strcmp( x.what(),
-          "boost::filesystem::create_directory: The system cannot find the path specified.: \"no-such-dir\\foo\\bar\"" ) == 0 );
+          "boost::filesystem::create_directory: The system cannot find the path specified: \"no-such-dir\\foo\\bar\"" ) == 0 );
         BOOST_CHECK( ok );
       }
     }
@@ -194,7 +194,7 @@
       if ( platform == "Windows" )
       {
         bool ok ( std::strcmp( x.what(),
-          "boost::filesystem::create_directory: The system cannot find the path specified.: \"no-such-dir\\foo\\bar\"" ) == 0 );
+          "boost::filesystem::create_directory: The system cannot find the path specified: \"no-such-dir\\foo\\bar\"" ) == 0 );
         BOOST_CHECK( ok );
       }
     }
@@ -325,26 +325,12 @@
   {
     BOOST_CHECK( ex.path1().string() == " no-way, Jose" );
   }
-
-  BOOST_CHECK( fs::create_directory( dir ) );
-
   // several functions give unreasonable results if uintmax_t isn't 64-bits
   std::cout << "sizeof(boost::uintmax_t) = " << sizeof(boost::uintmax_t) << '\n';
   BOOST_CHECK( sizeof( boost::uintmax_t ) >= 8 );
 
-  // make some reasonable assuptions for testing purposes
-  fs::space_info spi( fs::space( dir ) );
-  BOOST_CHECK( spi.capacity > 1000000 );
-  BOOST_CHECK( spi.free > 1000 );
-  BOOST_CHECK( spi.capacity > spi.free );
-  BOOST_CHECK( spi.free >= spi.available );
-
-  // it is convenient to display space, but older VC++ versions choke 
-# if !defined(BOOST_MSVC) || _MSC_VER >= 1300  // 1300 == VC++ 7.0
-    std::cout << " capacity = " << spi.capacity << '\n';
-    std::cout << "     free = " << spi.free << '\n';
-    std::cout << "available = " << spi.available << '\n';
-# endif
+  // create a directory, then check it for consistency
+  BOOST_CHECK( fs::create_directory( dir ) );
 
   BOOST_CHECK( fs::exists( dir ) );
   BOOST_CHECK( BOOST_FS_IS_EMPTY( dir ) );
@@ -359,6 +345,30 @@
   BOOST_CHECK( !fs::is_other( stat ) );
   BOOST_CHECK( !fs::is_symlink( stat ) );
 
+  // set the current directory, then check it for consistency
+  fs::path original_dir = fs::current_path<fs::path>();
+  BOOST_CHECK( dir != original_dir );
+  fs::current_path( dir );
+  BOOST_CHECK( fs::current_path<fs::path>() == dir );
+  BOOST_CHECK( fs::current_path<fs::path>() != original_dir );
+  fs::current_path( original_dir );
+  BOOST_CHECK( fs::current_path<fs::path>() == original_dir );
+  BOOST_CHECK( fs::current_path<fs::path>() != dir );
+
+  // make some reasonable assuptions for testing purposes
+  fs::space_info spi( fs::space( dir ) );
+  BOOST_CHECK( spi.capacity > 1000000 );
+  BOOST_CHECK( spi.free > 1000 );
+  BOOST_CHECK( spi.capacity > spi.free );
+  BOOST_CHECK( spi.free >= spi.available );
+
+  // it is convenient to display space, but older VC++ versions choke 
+# if !defined(BOOST_MSVC) || _MSC_VER >= 1300  // 1300 == VC++ 7.0
+    std::cout << " capacity = " << spi.capacity << '\n';
+    std::cout << "     free = " << spi.free << '\n';
+    std::cout << "available = " << spi.available << '\n';
+# endif
+
   if ( platform == "Windows" )
     BOOST_CHECK( CHECK_EXCEPTION( bind( BOOST_BND(fs::file_size), dir ), 
       ENOENT ) );
Modified: branches/libs/filesystem/filesystem/test/path_test.cpp
==============================================================================
--- branches/libs/filesystem/filesystem/test/path_test.cpp	(original)
+++ branches/libs/filesystem/filesystem/test/path_test.cpp	2007-08-24 17:35:46 EDT (Fri, 24 Aug 2007)
@@ -180,7 +180,7 @@
   void exception_tests()
   {
     const std::string str_1("string-1");
-    boost::system::error_code ec( 12345, boost::system::errno_ecat);
+    boost::system::error_code ec( 12345, boost::system::system_category);
     try { throw fs::filesystem_error( str_1, ec ); }
     catch ( const fs::filesystem_error & ex )
     {