Streamlined SystemException definition and usage
jkaeber [Thu, 6 Mar 2008 14:25:02 +0000 (14:25 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@733 270642c3-0616-0410-b53a-bc976706d245

16 files changed:
Socket/CommunicationPolicy.cc
Socket/NetdeviceController.cc
Socket/Protocols/DVB/DVBDemuxHandles.cc
Socket/Protocols/DVB/DVBDemuxSocketProtocol.cc
Socket/Protocols/DVB/DVBFrontendHandle.cc
Socket/Protocols/INet/ConnectedUDPSocketHandle.cc
Socket/Protocols/INet/MulticastSocketProtocol.cc
Socket/Protocols/Raw/PacketSocketHandle.cc
Socket/Protocols/Raw/TunTapSocketHandle.cc
Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.cc
Socket/Protocols/UN/UNDatagramSocketHandle.cc
Socket/Protocols/UN/UNSocketProtocol.cc
Socket/SocketProtocol.cc
Utils/Daemon/Daemon.cc
Utils/Exception.cc
Utils/Exception.test.cc

index aff4c66..d175b58 100644 (file)
@@ -58,7 +58,7 @@ prefix_ int senf::ConnectedCommunicationPolicy::do_accept(FileHandle handle,
             case EINTR:
                 break;
             default:
-                throw SystemException();
+                throw SystemException("ConnectedCommunicationPolicy::do_accept failed.");
             }
     } while (rv<0);
     return rv;
index fc43cc1..7f40c07 100644 (file)
@@ -101,7 +101,7 @@ prefix_ void senf::NetdeviceController::openSocket()
 {
     sockfd_ = ::socket( PF_INET, SOCK_DGRAM, 0);
     if ( sockfd_ < 0)
-        throw SystemException( "Could not open socket for NetdeviceController");
+        throw SystemException("Could not open socket for NetdeviceController.");
 }
 
 prefix_ void senf::NetdeviceController::ifrName(ifreq& ifr)
@@ -110,15 +110,15 @@ prefix_ void senf::NetdeviceController::ifrName(ifreq& ifr)
     ::memset( &ifr, 0, sizeof(ifr));
     ifr.ifr_ifindex = ifindex_;
     if ( ::ioctl( sockfd_, SIOCGIFNAME, &ifr ) < 0 )
-        throw SystemException( 
-                       "NetdeviceController: Could not discover the name of the interface with index ") << ifindex_;
+        throw SystemException("NetdeviceController")
+        << " could not discover the name of the interface with index " << ifindex_ << ".";
 }
 
 prefix_ void senf::NetdeviceController::doIoctl(ifreq& ifr, int request)
     const
 {
     if ( ::ioctl( sockfd_, request, &ifr ) < 0 )
-        throw SystemException();
+        throw SystemException("NetdeviceController::doIoctl failed.");
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
index a8f33a7..788069f 100644 (file)
@@ -47,7 +47,7 @@ prefix_ void senf::DVBDemuxSectionSocketProtocol::init_client(unsigned short ada
             "/dev/dvb/adapter%d/demux%d") % adapter % device);
     int f = open(devDemux.c_str(), O_RDONLY | O_NONBLOCK);
     if (f < 0){
-        throw SystemException( "Could not open demux device of DVB adapter ") << devDemux;
+        throw SystemException("Could not open demux device of DVB adapter ") << devDemux << ".";
     }
     fd(f);
 }
@@ -62,7 +62,7 @@ prefix_ void senf::DVBDemuxSectionSocketProtocol::setSectionFilter(struct dmx_sc
     const
 {
     if (::ioctl(fd(), DMX_SET_FILTER, filter) < 0)
-        throw SystemException("Could not set section filter of DVB adapter");
+        throw SystemException("Could not set section filter of DVB adapter.");
 }
 
 // ----------------------------------------------------------------
@@ -74,7 +74,7 @@ prefix_ void senf::DVBDemuxPESSocketProtocol::init_client(unsigned short adapter
             "/dev/dvb/adapter%d/demux%d") % adapter % device);
     int f = open(devDemux.c_str(), O_RDONLY | O_NONBLOCK);
     if (f < 0)
-        throw SystemException( "Could not open demux device of DVB adapter ") << devDemux;
+        throw SystemException( "Could not open demux device of DVB adapter ") << devDemux << ".";
     fd(f);
 }
 
@@ -88,7 +88,7 @@ prefix_ void senf::DVBDemuxPESSocketProtocol::setPESFilter(struct dmx_pes_filter
     const
 {
     if (::ioctl(fd(), DMX_SET_PES_FILTER, filter) < 0)
-        throw SystemException("Could not set PES filter of DVB adapter");
+        throw SystemException("Could not set PES filter of DVB adapter.");
 }
 
 // ----------------------------------------------------------------
@@ -100,7 +100,7 @@ prefix_ void senf::DVBDvrSocketProtocol::init_client(unsigned short adapter, uns
             "/dev/dvb/adapter%d/dvr%d") % adapter % device);
     int f = open(devDvr.c_str(), O_RDONLY | O_NONBLOCK);
     if (f < 0)
-        throw SystemException( "Could not open dvr device of DVB adapter ") << devDvr;
+        throw SystemException( "Could not open dvr device of DVB adapter ") << devDvr << ".";
     fd(f);
 }
 
index beb974e..0059e39 100644 (file)
@@ -42,22 +42,23 @@ prefix_ void senf::DVBDemuxSocketProtocol::setBufferSize(unsigned long size)
     const
 {
     if (::ioctl(fd(), DMX_SET_BUFFER_SIZE, size) < 0)
-        throw SystemException(
-                "Could not set the size of the buffer on DVB adapter. requested size: ") << size;
+        throw SystemException()
+              << "Could not set the size of the buffer on DVB adapter. requested size: "
+              << size << ".";
 }
 
 prefix_ void senf::DVBDemuxSocketProtocol::startFiltering()
     const
 {
     if (::ioctl(fd(), DMX_START) < 0)
-        throw SystemException("Could not start filtering operation on DVB adapter");
+        throw SystemException("Could not start filtering operation on DVB adapter.");
 }
 
 prefix_ void senf::DVBDemuxSocketProtocol::stopFiltering()
     const
 {
     if (::ioctl(fd(), DMX_STOP) < 0)
-        throw SystemException("Could not stop filtering operation on DVB adapter");
+        throw SystemException("Could not stop filtering operation on DVB adapter.");
 }
 
 prefix_ bool senf::DVBDemuxSocketProtocol::eof()
index 1e47c7a..7933b71 100644 (file)
@@ -47,7 +47,7 @@ prefix_ void senf::DVBFrontendSocketProtocol::init_client(uint8_t adapter, boost
             "/dev/dvb/adapter%d/frontend%d") % adapter % device);
     int f = open(devFrontend.c_str(), O_RDONLY | O_NONBLOCK);
     if (f < 0)
-        throw SystemException("Could not open frontend device of DVB adapter ")<< devFrontend;
+        throw SystemException() << "Could not open frontend device of DVB adapter " << devFrontend << ".";
     
     fd(f);
 }
@@ -68,7 +68,7 @@ prefix_ void senf::DVBFrontendSocketProtocol::signalStrength(int16_t *strength)
     const
 {
     if (::ioctl(fd(), FE_READ_SIGNAL_STRENGTH, strength) < 0)
-        throw SystemException( "Could not get signal strength of DVB adapter");
+        throw SystemException( "Could not get signal strength of DVB adapter.");
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
index 5e89b45..bc5432a 100644 (file)
@@ -46,7 +46,7 @@ prefix_ void senf::ConnectedUDPv4SocketProtocol::init_client()
 {
     int sock = ::socket(PF_INET,SOCK_DGRAM,0);
     if (sock < 0)
-        throw SystemException();
+        throw SystemException("::socket(PF_INET,SOCK_DGRAM,0) failed.");
     fd(sock);
 }
 
@@ -66,7 +66,7 @@ prefix_ void senf::ConnectedUDPv6SocketProtocol::init_client()
 {
     int sock = ::socket(PF_INET6,SOCK_DGRAM,0);
     if (sock < 0)
-        throw SystemException();
+        throw SystemException("::socket(PF_INET6,SOCK_DGRAM,0) failed.");
     fd(sock);
 }
 
index ba30fce..1712748 100644 (file)
@@ -116,7 +116,7 @@ prefix_ void senf::INet4MulticastSocketProtocol::mcAddMembership(INet4Address co
     mreqn.imr_address.s_addr = htons(INADDR_ANY);
     mreqn.imr_ifindex = 0;
     if (::setsockopt(fd(),SOL_IP,IP_ADD_MEMBERSHIP,&mreqn,sizeof(mreqn)) < 0)
-        throw SystemException("::setsockopt(IP_ADD_MEMBERSHIP");
+        throw SystemException("::setsockopt(IP_ADD_MEMBERSHIP)");
 }
 
 prefix_ void senf::INet4MulticastSocketProtocol::mcAddMembership(INet4Address const & mcAddr,
index 54345f1..3a7eaad 100644 (file)
@@ -50,7 +50,7 @@ prefix_ void senf::PacketSocketProtocol::init_client(SocketType type, int protoc
         protocol = ETH_P_ALL;
     int sock = ::socket(PF_PACKET, socktype, htons(protocol));
     if (sock < 0)
-        throw SystemException();
+        throw SystemException("::socket(...) failed.");
     fd(sock);
 }
 
@@ -61,7 +61,7 @@ prefix_ unsigned senf::PacketSocketProtocol::available()
         return 0;
     ssize_t l = ::recv(fd(),0,0,MSG_PEEK | MSG_TRUNC);
     if (l < 0)
-        throw SystemException();
+        throw SystemException("::recv(socket_fd) failed.");
     return l;
 }
 
index 6734b8a..cd68e06 100644 (file)
@@ -50,7 +50,7 @@ prefix_ void senf::TapSocketProtocol::init_client(std::string const & interface_
 {
     int f;
     if ( (f = ::open("/dev/net/tun", O_RDWR)) < 0 )
-        throw SystemException( "Could not open tap control device: /dev/net/tun");
+        throw SystemException( "Could not open tap control device: /dev/net/tun.");
     struct ifreq ifr;
     ::memset( &ifr, 0, sizeof(ifr));
     ifr.ifr_flags = IFF_TAP;
@@ -58,7 +58,7 @@ prefix_ void senf::TapSocketProtocol::init_client(std::string const & interface_
         ifr.ifr_flags |= IFF_NO_PI;
     interface_name.copy( ifr.ifr_name, IFNAMSIZ);
     if (::ioctl(f, TUNSETIFF, (void *) &ifr) < 0 )
-        throw SystemException( "Could not create tap device: ") << ifr.ifr_name;
+        throw SystemException( "Could not create tap device: ") << ifr.ifr_name << ".";
     fd(f);
 }
 
index 9e47881..2a9a4db 100644 (file)
@@ -40,7 +40,7 @@ prefix_ void senf::ConnectedUNDatagramSocketProtocol::init_client() const
 {
     int sock = ::socket(PF_UNIX,SOCK_DGRAM,0);
     if (sock < 0)
-        throw SystemException( "Could not create socket(PF_UNIX,SOCK_DGRAM,0)" );
+        throw SystemException( "Could not create socket(PF_UNIX,SOCK_DGRAM,0)." );
    fd(sock);
 }
 
index d1b66bd..a84d8ec 100644 (file)
@@ -41,7 +41,7 @@ prefix_ void senf::UNDatagramSocketProtocol::init_client() const
 {
     int sock = ::socket(PF_UNIX,SOCK_DGRAM,0);
     if (sock < 0)
-        throw SystemException( "Could not create socket(PF_UNIX,SOCK_DGRAM,0)" );
+        throw SystemException( "Could not create socket(PF_UNIX,SOCK_DGRAM,0)." );
     fd(sock);
 }
 
index 0c58441..2e9404d 100644 (file)
@@ -42,7 +42,7 @@ prefix_ unsigned senf::UNSocketProtocol::available()
 {
     int n;
     if (::ioctl(fd(),SIOCINQ,&n) < 0)
-        throw SystemException("Could not call available() on UNSocket");
+        throw SystemException("Could not call available() on UNSocket.");
     return n;
 }
 
@@ -77,7 +77,7 @@ prefix_ void senf::UNSocketProtocol::check_and_unlink()
         ::unlink(una.path().c_str());
     }
     catch (SystemException & e) {
-        SENF_LOG(("UNSocketProtocol::check_and_unlink() failed; " << e.errorString() ));
+        SENF_LOG(("UNSocketProtocol::check_and_unlink() failed; [" << e.errorString() << "]."));
     }
 }
     
index 672f21f..f2fe712 100644 (file)
@@ -38,9 +38,9 @@ prefix_ void senf::SocketProtocol::close()
     const
 {
     if (::shutdown(body().fd(),SHUT_RDWR) < 0)
-        throw SystemException();
+        throw SystemException("::shutdown(socket_fd)");
     if (::close(body().fd()) < 0)
-        throw SystemException();
+        throw SystemException("::close(socket_fd)");
 }
 
 prefix_ void senf::SocketProtocol::terminate()
index 1521867..f0be324 100644 (file)
@@ -98,7 +98,8 @@ prefix_ void senf::Daemon::openLog()
     if (! stdoutLog_.empty()) {
         fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
         if (fd < 0)
-            throw SystemException("::open()");
+            throw SystemException()
+                  << " Could not open \"" << stdoutLog_ << "\" for redirecting stdout.";
         stdout_ = fd;
     }
     if (stderrLog_ == stdoutLog_)
@@ -106,7 +107,8 @@ prefix_ void senf::Daemon::openLog()
     else if (! stderrLog_.empty()) {
         fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666);
         if (fd < 0)
-            throw SystemException("::open()");
+            throw SystemException()
+                  << " Could not open \"" << stderrLog_ << "\" for redirecting stderr.";
         stderr_ = fd;
     }
 }
@@ -323,7 +325,7 @@ prefix_ bool senf::Daemon::pidfileCreate()
     // was some race condition, probably over NFS.
 
     std::string tempname;
-    boost::format linkErrorFormat("; could not link \"%1%\" to \"%2%\".");
+    boost::format linkErrorFormat(" Could not link \"%1%\" to \"%2%\".");
 
     {
         char hostname[HOST_NAME_MAX+1];
@@ -337,13 +339,18 @@ prefix_ bool senf::Daemon::pidfileCreate()
     while (1) {
         {
             std::ofstream pidf (tempname.c_str());
+            if (! pidf)
+                throw SystemException()
+                      << " Could not open pidfile \"" << tempname << "\" for output.";
             pidf << ::getpid() << std::endl;
+            if (! pidf)
+                throw SystemException()
+                      << " Could not write to pidfile \"" << tempname << "\".";
         }
 
         if (::link(tempname.c_str(), pidfile_.c_str()) < 0) {
             if (errno != EEXIST) 
-                throw SystemException("::link()")
-                    << linkErrorFormat % pidfile_.c_str() % tempname.c_str();
+                throw SystemException() << linkErrorFormat % pidfile_ % tempname;
         }
         else {
             struct ::stat s;
@@ -374,8 +381,7 @@ prefix_ bool senf::Daemon::pidfileCreate()
         LIBC_CALL( ::unlink, (tempname.c_str() ));
         if (::link(pidfile_.c_str(), tempname.c_str()) < 0) {
             if (errno != ENOENT)
-                throw SystemException("::link()")
-                    << linkErrorFormat % tempname.c_str() % pidfile_.c_str();
+                throw SystemException() << linkErrorFormat % tempname % pidfile_;
             // Hmm ... the pidfile mysteriously disappeared ... try again.
             continue;
         }
index 61d5860..e23357f 100644 (file)
@@ -51,7 +51,7 @@ prefix_ void senf::SystemException::init(std::string const & descr, int code)
 {
     code_ = code;
     (*this) << "[" << errorString() << "]";
-    if (! descr.empty()) (*this) << "; " << descr;
+    if (! descr.empty()) (*this) << " " << descr;
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
index a65aa5f..3e51428 100644 (file)
@@ -50,8 +50,7 @@ BOOST_AUTO_UNIT_TEST(errnoException)
     }
     catch (senf::SystemException & e) {
         BOOST_CHECK_EQUAL( e.errorNumber(), ENOENT );
-        //BOOST_CHECK_EQUAL( e.what(), "::open(): (2) No such file or directory\nx=1\ny=2" );
-        BOOST_CHECK_EQUAL( e.what(), "[No such file or directory]; ::open()\nx=1\ny=2" );
+        BOOST_CHECK_EQUAL( e.errorString(), "No such file or directory");
     }
 }