X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FBSDSocketProtocol.cc;h=4524cae47bc65508adc3528b5f2092166a530a8f;hb=b8ca4a544cce3e6023bb56b712a03d6362f2bb79;hp=a625fcc67cb785145def3de9e2a34c6e2e339837;hpb=5ed1fa1c42763aebad06c1e4ac8fc5a19e15519a;p=senf.git diff --git a/Socket/Protocols/BSDSocketProtocol.cc b/Socket/Protocols/BSDSocketProtocol.cc index a625fcc..4524cae 100644 --- a/Socket/Protocols/BSDSocketProtocol.cc +++ b/Socket/Protocols/BSDSocketProtocol.cc @@ -1,8 +1,8 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -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) - throwErrno(); + SENF_THROW_SYSTEM_EXCEPTION(""); return std::make_pair(ling.l_onoff, ling.l_linger); } @@ -54,90 +54,100 @@ 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) - throwErrno(); + SENF_THROW_SYSTEM_EXCEPTION(""); } -/////////////////////////////////////////////////////////////////////////// - -prefix_ bool senf::AddressableBSDSocketProtocol::reuseaddr() +prefix_ boost::uint8_t senf::BSDSocketProtocol::priority() const { int value; socklen_t len (sizeof(value)); - if (::getsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&value,&len) < 0) - throwErrno(); + if (::getsockopt(fd(),SOL_SOCKET,SO_PRIORITY,&value,&len) < 0) + SENF_THROW_SYSTEM_EXCEPTION(""); return value; } -prefix_ void senf::AddressableBSDSocketProtocol::reuseaddr(bool value) +prefix_ void senf::BSDSocketProtocol::priority(boost::uint8_t value) const { int ivalue (value); - if (::setsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&ivalue,sizeof(ivalue)) < 0) - throwErrno(); -} - -prefix_ boost::uint8_t senf::AddressableBSDSocketProtocol::priority() - const -{ - int value; - socklen_t len (sizeof(value)); - if (::getsockopt(fd(),SOL_SOCKET,SO_PRIORITY,&value,&len) < 0) - throwErrno(); - return value; + if (::setsockopt(fd(),SOL_SOCKET,SO_PRIORITY,&ivalue,sizeof(ivalue)) < 0) + SENF_THROW_SYSTEM_EXCEPTION(""); } -prefix_ void senf::AddressableBSDSocketProtocol::priority(boost::uint8_t value) +prefix_ int senf::BSDSocketProtocol::error() const { - int ivalue (value); - if (::setsockopt(fd(),SOL_SOCKET,SO_PRIORITY,&ivalue,sizeof(ivalue)) < 0) - throwErrno(); + 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::AddressableBSDSocketProtocol::rcvbuf() +prefix_ unsigned senf::BSDSocketProtocol::rcvbuf() const { unsigned size; socklen_t len (sizeof(size)); if (::getsockopt(fd(),SOL_SOCKET,SO_RCVBUF,&size,&len) < 0) - throwErrno(); + 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; } -prefix_ void senf::AddressableBSDSocketProtocol::rcvbuf(unsigned size) +prefix_ void senf::BSDSocketProtocol::rcvbuf(unsigned size) const { if (::setsockopt(fd(),SOL_SOCKET,SO_RCVBUF,&size,sizeof(size)) < 0) - throwErrno(); + SENF_THROW_SYSTEM_EXCEPTION(""); } -prefix_ unsigned senf::AddressableBSDSocketProtocol::sndbuf() +prefix_ unsigned senf::BSDSocketProtocol::sndbuf() const { unsigned size; socklen_t len (sizeof(size)); if (::getsockopt(fd(),SOL_SOCKET,SO_SNDBUF,&size,&len) < 0) - throwErrno(); + 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; } -prefix_ void senf::AddressableBSDSocketProtocol::sndbuf(unsigned size) +prefix_ void senf::BSDSocketProtocol::sndbuf(unsigned size) const { if (::setsockopt(fd(),SOL_SOCKET,SO_SNDBUF,&size,sizeof(size)) < 0) - throwErrno(); + SENF_THROW_SYSTEM_EXCEPTION(""); +} + +/////////////////////////////////////////////////////////////////////////// + +prefix_ bool senf::AddressableBSDSocketProtocol::reuseaddr() + const +{ + int value; + socklen_t len (sizeof(value)); + if (::getsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&value,&len) < 0) + SENF_THROW_SYSTEM_EXCEPTION(""); + return value; +} + +prefix_ void senf::AddressableBSDSocketProtocol::reuseaddr(bool value) + const +{ + int ivalue (value); + if (::setsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&ivalue,sizeof(ivalue)) < 0) + SENF_THROW_SYSTEM_EXCEPTION(""); } /////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "BSDSocketProtocol.mpp" - + // Local Variables: // mode: c++ // fill-column: 100