242 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| // (C) Copyright Ion Gaztanaga 2005-2012. 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)
 | |
| //
 | |
| // See http://www.boost.org/libs/interprocess for documentation.
 | |
| //
 | |
| // Parts of this code are taken from boost::filesystem library
 | |
| //
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| //  Copyright (C) 2002 Beman Dawes
 | |
| //  Copyright (C) 2001 Dietmar Kuehl
 | |
| //  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_INTERPROCESS_ERRORS_HPP
 | |
| #define BOOST_INTERPROCESS_ERRORS_HPP
 | |
| 
 | |
| #ifndef BOOST_CONFIG_HPP
 | |
| #  include <boost/config.hpp>
 | |
| #endif
 | |
| #
 | |
| #if defined(BOOST_HAS_PRAGMA_ONCE)
 | |
| #  pragma once
 | |
| #endif
 | |
| 
 | |
| #include <boost/interprocess/detail/config_begin.hpp>
 | |
| #include <boost/interprocess/detail/workaround.hpp>
 | |
| #include <stdarg.h>
 | |
| #include <string>
 | |
| 
 | |
| #if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
| #  include <boost/interprocess/detail/win32_api.hpp>
 | |
| #else
 | |
| #  ifdef BOOST_HAS_UNISTD_H
 | |
| #    include <errno.h>        //Errors
 | |
| #    include <cstring>        //strerror
 | |
| #  else  //ifdef BOOST_HAS_UNISTD_H
 | |
| #    error Unknown platform
 | |
| #  endif //ifdef BOOST_HAS_UNISTD_H
 | |
| #endif   //#if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
| 
 | |
| //!\file
 | |
| //!Describes the error numbering of interprocess classes
 | |
| 
 | |
| namespace boost {
 | |
| namespace interprocess {
 | |
| #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
 | |
| inline int system_error_code() // artifact of POSIX and WINDOWS error reporting
 | |
| {
 | |
|    #if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
|    return winapi::get_last_error();
 | |
|    #else
 | |
|    return errno; // GCC 3.1 won't accept ::errno
 | |
|    #endif
 | |
| }
 | |
| 
 | |
| 
 | |
| #if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
| inline void fill_system_message(int sys_err_code, std::string &str)
 | |
| {
 | |
|    void *lpMsgBuf;
 | |
|    winapi::format_message(
 | |
|       winapi::format_message_allocate_buffer |
 | |
|       winapi::format_message_from_system |
 | |
|       winapi::format_message_ignore_inserts,
 | |
|       0,
 | |
|       sys_err_code,
 | |
|       winapi::make_lang_id(winapi::lang_neutral, winapi::sublang_default), // Default language
 | |
|       reinterpret_cast<char *>(&lpMsgBuf),
 | |
|       0,
 | |
|       0
 | |
|    );
 | |
|    str += static_cast<const char*>(lpMsgBuf);
 | |
|    winapi::local_free( lpMsgBuf ); // free the buffer
 | |
|    while ( str.size()
 | |
|       && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') )
 | |
|       str.erase( str.size()-1 );
 | |
| }
 | |
| # else
 | |
| inline void fill_system_message( int system_error, std::string &str)
 | |
| {  str = std::strerror(system_error);  }
 | |
| # endif
 | |
| #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
 | |
| 
 | |
| enum error_code_t
 | |
| {
 | |
|    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,
 | |
|    not_found_error,
 | |
| //   not_directory_error,
 | |
|    busy_error,       // implies trying again might succeed
 | |
|    already_exists_error,
 | |
|    not_empty_error,
 | |
|    is_directory_error,
 | |
|    out_of_space_error,
 | |
|    out_of_memory_error,
 | |
|    out_of_resource_error,
 | |
|    lock_error,
 | |
|    sem_error,
 | |
|    mode_error,
 | |
|    size_error,
 | |
|    corrupted_error,
 | |
|    not_such_file_or_directory,
 | |
|    invalid_argument,
 | |
|    timeout_when_locking_error,
 | |
|    timeout_when_waiting_error,
 | |
|    owner_dead_error
 | |
| };
 | |
| 
 | |
| typedef int    native_error_t;
 | |
| 
 | |
| #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
 | |
| struct ec_xlate
 | |
| {
 | |
|    native_error_t sys_ec;
 | |
|    error_code_t   ec;
 | |
| };
 | |
| 
 | |
| static const ec_xlate ec_table[] =
 | |
| {
 | |
|    #if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
|    { /*ERROR_ACCESS_DENIED*/5L, security_error },
 | |
|    { /*ERROR_INVALID_ACCESS*/12L, security_error },
 | |
|    { /*ERROR_SHARING_VIOLATION*/32L, security_error },
 | |
|    { /*ERROR_LOCK_VIOLATION*/33L, security_error },
 | |
|    { /*ERROR_LOCKED*/212L, security_error },
 | |
|    { /*ERROR_NOACCESS*/998L, security_error },
 | |
|    { /*ERROR_WRITE_PROTECT*/19L, read_only_error },
 | |
|    { /*ERROR_NOT_READY*/21L, io_error },
 | |
|    { /*ERROR_SEEK*/25L, io_error },
 | |
|    { /*ERROR_READ_FAULT*/30L, io_error },
 | |
|    { /*ERROR_WRITE_FAULT*/29L, io_error },
 | |
|    { /*ERROR_CANTOPEN*/1011L, io_error },
 | |
|    { /*ERROR_CANTREAD*/1012L, io_error },
 | |
|    { /*ERROR_CANTWRITE*/1013L, io_error },
 | |
|    { /*ERROR_DIRECTORY*/267L, path_error },
 | |
|    { /*ERROR_INVALID_NAME*/123L, path_error },
 | |
|    { /*ERROR_FILE_NOT_FOUND*/2L, not_found_error },
 | |
|    { /*ERROR_PATH_NOT_FOUND*/3L, not_found_error },
 | |
|    { /*ERROR_DEV_NOT_EXIST*/55L, not_found_error },
 | |
|    { /*ERROR_DEVICE_IN_USE*/2404L, busy_error },
 | |
|    { /*ERROR_OPEN_FILES*/2401L, busy_error },
 | |
|    { /*ERROR_BUSY_DRIVE*/142L, busy_error },
 | |
|    { /*ERROR_BUSY*/170L, busy_error },
 | |
|    { /*ERROR_FILE_EXISTS*/80L, already_exists_error },
 | |
|    { /*ERROR_ALREADY_EXISTS*/183L, already_exists_error },
 | |
|    { /*ERROR_DIR_NOT_EMPTY*/145L, not_empty_error },
 | |
|    { /*ERROR_HANDLE_DISK_FULL*/39L, out_of_space_error },
 | |
|    { /*ERROR_DISK_FULL*/112L, out_of_space_error },
 | |
|    { /*ERROR_OUTOFMEMORY*/14L, out_of_memory_error },
 | |
|    { /*ERROR_NOT_ENOUGH_MEMORY*/8L, out_of_memory_error },
 | |
|    { /*ERROR_TOO_MANY_OPEN_FILES*/4L, out_of_resource_error },
 | |
|    { /*ERROR_INVALID_ADDRESS*/487L, busy_error }
 | |
|    #else    //#if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
|    { EACCES, security_error },
 | |
|    { EROFS, read_only_error },
 | |
|    { EIO, io_error },
 | |
|    { ENAMETOOLONG, path_error },
 | |
|    { ENOENT, not_found_error },
 | |
|    //    { ENOTDIR, not_directory_error },
 | |
|    { EAGAIN, busy_error },
 | |
|    { EBUSY, busy_error },
 | |
|    { ETXTBSY, busy_error },
 | |
|    { EEXIST, already_exists_error },
 | |
|    { ENOTEMPTY, not_empty_error },
 | |
|    { EISDIR, is_directory_error },
 | |
|    { ENOSPC, out_of_space_error },
 | |
|    { ENOMEM, out_of_memory_error },
 | |
|    { EMFILE, out_of_resource_error },
 | |
|    { ENOENT, not_such_file_or_directory },
 | |
|    { EINVAL, invalid_argument }
 | |
|    #endif   //#if defined (BOOST_INTERPROCESS_WINDOWS)
 | |
| };
 | |
| 
 | |
| inline error_code_t lookup_error(native_error_t err)
 | |
| {
 | |
|    const ec_xlate *cur  = &ec_table[0],
 | |
|                   *end  = cur + sizeof(ec_table)/sizeof(ec_xlate);
 | |
|    for  (;cur != end; ++cur ){
 | |
|       if ( err == cur->sys_ec ) return cur->ec;
 | |
|    }
 | |
|    return system_error; // general system error code
 | |
| }
 | |
| 
 | |
| struct error_info
 | |
| {
 | |
|    error_info(error_code_t ec = other_error )
 | |
|       :  m_nat(0), m_ec(ec)
 | |
|    {}
 | |
| 
 | |
|    error_info(native_error_t sys_err_code)
 | |
|       :  m_nat(sys_err_code), m_ec(lookup_error(sys_err_code))
 | |
|    {}
 | |
| 
 | |
|    error_info & operator =(error_code_t ec)
 | |
|    {
 | |
|       m_nat = 0;
 | |
|       m_ec = ec;
 | |
|       return *this;
 | |
|    }
 | |
| 
 | |
|    error_info & operator =(native_error_t sys_err_code)
 | |
|    {
 | |
|       m_nat = sys_err_code;
 | |
|       m_ec = lookup_error(sys_err_code);
 | |
|       return *this;
 | |
|    }
 | |
| 
 | |
|    native_error_t get_native_error()const
 | |
|    {  return m_nat;  }
 | |
| 
 | |
|    error_code_t   get_error_code()const
 | |
|    {  return m_ec;  }
 | |
| 
 | |
|    private:
 | |
|    native_error_t m_nat;
 | |
|    error_code_t   m_ec;
 | |
| };
 | |
| #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
 | |
| 
 | |
| }  // namespace interprocess {
 | |
| }  // namespace boost
 | |
| 
 | |
| #include <boost/interprocess/detail/config_end.hpp>
 | |
| 
 | |
| #endif // BOOST_INTERPROCESS_ERRORS_HPP
 | 
