X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FBSDSocketProtocol.cc;h=4524cae47bc65508adc3528b5f2092166a530a8f;hb=a1fdb7bb122f0b05be809a922d4b7ef5e125fa67;hp=f1423f97ac2b4d72a9facc993d813e3a34800bb1;hpb=fff433ccd27c330133cc4a838e84d37541e93b04;p=senf.git diff --git a/Socket/Protocols/BSDSocketProtocol.cc b/Socket/Protocols/BSDSocketProtocol.cc index f1423f9..4524cae 100644 --- a/Socket/Protocols/BSDSocketProtocol.cc +++ b/Socket/Protocols/BSDSocketProtocol.cc @@ -41,9 +41,9 @@ prefix_ std::pair senf::BSDSocketProtocol::linger() { struct linger ling; socklen_t len = sizeof(ling); - ::memset(&ling,sizeof(ling),0); + ::memset(&ling, 0, sizeof(ling)); if (::getsockopt(fd(),SOL_SOCKET,SO_LINGER,&ling,&len) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); return std::make_pair(ling.l_onoff, ling.l_linger); } @@ -54,7 +54,7 @@ prefix_ void senf::BSDSocketProtocol::linger(bool enable, unsigned timeout) ling.l_onoff = enable; ling.l_linger = timeout; if (::setsockopt(fd(),SOL_SOCKET,SO_LINGER,&ling,sizeof(ling)) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); } prefix_ boost::uint8_t senf::BSDSocketProtocol::priority() @@ -63,7 +63,7 @@ prefix_ boost::uint8_t senf::BSDSocketProtocol::priority() int value; socklen_t len (sizeof(value)); if (::getsockopt(fd(),SOL_SOCKET,SO_PRIORITY,&value,&len) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); return value; } @@ -72,7 +72,17 @@ prefix_ void senf::BSDSocketProtocol::priority(boost::uint8_t value) { int ivalue (value); if (::setsockopt(fd(),SOL_SOCKET,SO_PRIORITY,&ivalue,sizeof(ivalue)) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); +} + +prefix_ int senf::BSDSocketProtocol::error() + const +{ + int err; + socklen_t len (sizeof(err)); + if (::getsockopt(fd(),SOL_SOCKET,SO_ERROR,&err,&len) < 0) + SENF_THROW_SYSTEM_EXCEPTION(""); + return err; } prefix_ unsigned senf::BSDSocketProtocol::rcvbuf() @@ -81,7 +91,7 @@ prefix_ unsigned senf::BSDSocketProtocol::rcvbuf() unsigned size; socklen_t len (sizeof(size)); if (::getsockopt(fd(),SOL_SOCKET,SO_RCVBUF,&size,&len) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); // Linux doubles the bufer size on setting the RCVBUF to cater for internal // headers. We fix this up here .. (see lkml FAQ) return size/2; @@ -91,7 +101,7 @@ prefix_ void senf::BSDSocketProtocol::rcvbuf(unsigned size) const { if (::setsockopt(fd(),SOL_SOCKET,SO_RCVBUF,&size,sizeof(size)) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); } prefix_ unsigned senf::BSDSocketProtocol::sndbuf() @@ -100,7 +110,7 @@ prefix_ unsigned senf::BSDSocketProtocol::sndbuf() unsigned size; socklen_t len (sizeof(size)); if (::getsockopt(fd(),SOL_SOCKET,SO_SNDBUF,&size,&len) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); // Linux doubles the bufer size on setting the SNDBUF to cater for internal // headers. We fix this up here .. (see lkml FAQ) return size/2; @@ -110,7 +120,7 @@ prefix_ void senf::BSDSocketProtocol::sndbuf(unsigned size) const { if (::setsockopt(fd(),SOL_SOCKET,SO_SNDBUF,&size,sizeof(size)) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); } /////////////////////////////////////////////////////////////////////////// @@ -121,7 +131,7 @@ prefix_ bool senf::AddressableBSDSocketProtocol::reuseaddr() int value; socklen_t len (sizeof(value)); if (::getsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&value,&len) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); return value; } @@ -130,14 +140,14 @@ prefix_ void senf::AddressableBSDSocketProtocol::reuseaddr(bool value) { int ivalue (value); if (::setsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&ivalue,sizeof(ivalue)) < 0) - throw SystemException(); + SENF_THROW_SYSTEM_EXCEPTION(""); } /////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "BSDSocketProtocol.mpp" - + // Local Variables: // mode: c++ // fill-column: 100