Utils/Console: Fix console crash on socket write failure
[senf.git] / senf / Utils / Console / Server.cc
index 48ac147..40b4d80 100644 (file)
 #include <senf/Utils/senfassert.hh>
 #include <senf/Utils/membind.hh>
 #include <senf/Utils/Logger/SenfLog.hh>
+#include <senf/Version.hh>
 #include "LineEditor.hh"
 #include "ScopedDirectory.hh"
 #include "Sysdir.hh"
+#include "SysInfo.hh"
 #include "ParsedCommand.hh"
 
 //#include "Server.mpp"
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
+namespace {
+    senf::console::SysInfo::Proxy addSysInfo (
+            "SENF: The Simple and Extensible Network Framework\n"
+            "  © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research\n"
+            "  Contact: senf-dev@lists.berlios.de\n"
+            "  Version: " SENF_LIB_VERSION " Revision number: " SENF_REVISION "\n", 0);
+}
 
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::detail::NonBlockingSocketSink
@@ -164,7 +173,7 @@ prefix_ void senf::console::detail::DumbClientReader::showPrompt()
     prompt += " ";
 
     stream() << std::flush;
-    handle().write(prompt);
+    v_write(prompt);
     promptLen_ = prompt.size();
     promptActive_ = true;
 }
@@ -185,7 +194,17 @@ prefix_ void senf::console::detail::DumbClientReader::v_enablePrompt()
 
 prefix_ void senf::console::detail::DumbClientReader::v_write(std::string const & data)
 {
-    handle().write(data);
+    try {
+        handle().write(data);
+    }
+    catch (std::exception & ex) {
+        SENF_LOG(("unexpected failure writing to socket:" << ex.what()));
+        stopClient(); // SUICIDE
+    }
+    catch (...) {
+        SENF_LOG(("unexpected failure writing to socket: unknown exception"));
+        stopClient(); // SUICIDE
+    }
 }
 
 prefix_ unsigned senf::console::detail::DumbClientReader::v_width()
@@ -213,7 +232,17 @@ prefix_ void senf::console::detail::NoninteractiveClientReader::v_enablePrompt()
 
 prefix_ void senf::console::detail::NoninteractiveClientReader::v_write(std::string const & data)
 {
-    handle().write(data);
+    try {
+        handle().write(data);
+    }
+    catch (std::exception & ex) {
+        SENF_LOG(("unexpected failure writing to socket:" << ex.what()));
+        stopClient(); // SUICIDE
+    }
+    catch (...) {
+        SENF_LOG(("unexpected failure writing to socket: unknown exception"));
+        stopClient(); // SUICIDE
+    }
 }
 
 prefix_ unsigned senf::console::detail::NoninteractiveClientReader::v_width()