boost::system::error_code set_option(implementation_type& impl,
      const SettableSerialPortOption& option, boost::system::error_code& ec)
  {
    using namespace std; // For memcpy.

    ::DCB dcb;
    memset(&dcb, 0, sizeof(DCB));
    dcb.DCBlength = sizeof(DCB);
    if (!::GetCommState(handle_service_.native(impl), &dcb))
    {
      DWORD last_error = ::GetLastError();
      ec = boost::system::error_code(last_error,
          boost::asio::error::get_system_category());
      return ec;
    }

    if (option.store(dcb, ec))
      return ec;

    if (!::SetCommState(handle_service_.native(impl), &dcb))
    {
      DWORD last_error = ::GetLastError();
      ec = boost::system::error_code(last_error,
          boost::asio::error::get_system_category());
      return ec;
    }

    ec = boost::system::error_code();
    return ec;
  }
  boost::system::error_code set_option(implementation_type& impl,
      const SettableSerialPortOption& option, boost::system::error_code& ec)
  {
    termios ios;
    descriptor_ops::clear_error(ec);
    descriptor_ops::error_wrapper(::tcgetattr(
          descriptor_service_.native(impl), &ios), ec);
    if (ec)
      return ec;

    if (option.store(ios, ec))
      return ec;

    descriptor_ops::clear_error(ec);
    descriptor_ops::error_wrapper(::tcsetattr(
          descriptor_service_.native(impl), TCSANOW, &ios), ec);
    return ec;
  }