4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief UDPServer non-inline non-template implementation */
26 #include "UDPServer.hh"
27 //#include "UDPServer.ih"
30 #include <boost/algorithm/string/trim.hpp>
31 #include <senf/Utils/membind.hh>
33 //#include "UDPServer.mpp"
35 ///////////////////////////////cc.p////////////////////////////////////////
37 prefix_ senf::console::UDPServer::UDPServer(senf::INet4SocketAddress const & address)
38 : replies_ (true), emptyReplies_ (true), target_ (),
39 handle_ (senf::UDPv4ClientSocketHandle(address)),
40 readevent_ ("senf::console::UDPServer::readevent",
41 senf::membind(&UDPServer::handleInput, this),
43 senf::scheduler::FdEvent::EV_READ),
44 parser_ (), executor_ ()
46 if (address.address().multicast())
47 handle_.facet<senf::INet4MulticastSocketProtocol>().mcAddMembership(address.address());
48 SENF_LOG(("UDP Console server started at " << address ));
51 prefix_ senf::console::UDPServer::UDPServer(senf::INet6SocketAddress const & address)
52 : replies_ (true), target_ (), handle_ (senf::UDPv6ClientSocketHandle(address)),
53 readevent_ ("senf::console::UDPServer::readevent",
54 senf::membind(&UDPServer::handleInput, this),
56 senf::scheduler::FdEvent::EV_READ),
57 parser_ (), executor_ ()
59 if (address.address().multicast())
60 handle_.facet<senf::INet6MulticastSocketProtocol>().mcAddMembership(address.address());
61 SENF_LOG(("UDP Console server started at " << address ));
64 prefix_ senf::console::UDPServer & senf::console::UDPServer::replies(bool enable)
70 prefix_ senf::console::UDPServer &
71 senf::console::UDPServer::replies(senf::INet4SocketAddress const & address)
73 SENF_ASSERT( handle_.local().family() == senf::INet4SocketAddress::addressFamily,
74 "Internal failure: INet6 address on INet4 socket ??" );
79 prefix_ senf::console::UDPServer &
80 senf::console::UDPServer::replies(senf::INet6SocketAddress const & address)
82 SENF_ASSERT( handle_.local().family() == senf::INet6SocketAddress::addressFamily,
83 "Internal failure: INet4 address on INet6 socket ??" );
88 prefix_ senf::console::UDPServer & senf::console::UDPServer::emptyReplies(bool enable)
90 emptyReplies_ = enable;
94 prefix_ senf::console::DirectoryNode & senf::console::UDPServer::root()
97 return executor_.chroot();
100 prefix_ senf::console::UDPServer & senf::console::UDPServer::root(DirectoryNode & root)
102 executor_.chroot(root);
106 prefix_ void senf::console::UDPServer::handleInput(int events)
108 if (events != senf::scheduler::FdEvent::EV_READ) {
109 SENF_LOG((senf::log::IMPORTANT)("Input handle read error. Closing socket."));
110 readevent_.disable();
116 senf::GenericBSDSocketAddress address;
117 handle_.readfrom(data, address, 0u);
120 executor_.cwd(executor_.chroot());
121 std::stringstream stream;
123 parser_.parse(data, boost::bind<void>( boost::ref(executor_), boost::ref(stream), _1));
125 catch (Executor::ExitException &) {
128 catch (ExceptionMixin & ex) {
129 stream << ex.message() << '\n';
130 SENF_LOG((senf::log::IMPORTANT)("Error: " << ex.message()));
131 SENF_LOG((senf::log::NOTICE)(ex.backtrace()));
133 catch (std::exception & ex) {
134 stream << ex.what() << '\n';
135 SENF_LOG((senf::log::IMPORTANT)("Error: " << ex.what()));
137 if (replies_ && (emptyReplies_ || ! stream.str().empty())) {
140 if (stream.str().empty())
142 handle_.writeto(address, stream.str());
147 ///////////////////////////////cc.e////////////////////////////////////////
149 //#include "UDPServer.mpp"
155 // comment-column: 40
156 // c-file-style: "senf"
157 // indent-tabs-mode: nil
158 // ispell-local-dictionary: "american"
159 // compile-command: "scons -u test"