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 "../membind.hh"
33 //#include "UDPServer.mpp"
35 ///////////////////////////////cc.p////////////////////////////////////////
37 prefix_ senf::console::UDPServer::UDPServer(senf::INet4SocketAddress const & address)
38 : replies_ (true), target_ (), handle_ (senf::UDPv4ClientSocketHandle(address)),
39 readevent_ ("senf::console::UDPServer::readevent",
40 senf::membind(&UDPServer::handleInput, this),
42 senf::scheduler::FdEvent::EV_READ),
43 parser_ (), executor_ ()
45 if (address.address().multicast())
46 handle_.facet<senf::INet4MulticastSocketProtocol>().mcAddMembership(address.address());
47 SENF_LOG(("UDP Console server started at " << address));
50 prefix_ senf::console::UDPServer::UDPServer(senf::INet6SocketAddress const & address)
51 : replies_ (true), target_ (), handle_ (senf::UDPv6ClientSocketHandle(address)),
52 readevent_ ("senf::console::UDPServer::readevent",
53 senf::membind(&UDPServer::handleInput, this),
55 senf::scheduler::FdEvent::EV_READ),
56 parser_ (), executor_ ()
58 if (address.address().multicast())
59 handle_.facet<senf::INet6MulticastSocketProtocol>().mcAddMembership(address.address());
60 SENF_LOG(("UDP Console server started at " << address));
63 prefix_ senf::console::UDPServer & senf::console::UDPServer::replies(bool enable)
69 prefix_ senf::console::UDPServer &
70 senf::console::UDPServer::replies(senf::INet4SocketAddress const & address)
72 SENF_ASSERT( handle_.local().family() == senf::INet4SocketAddress::addressFamily );
77 prefix_ senf::console::UDPServer &
78 senf::console::UDPServer::replies(senf::INet6SocketAddress const & address)
80 SENF_ASSERT( handle_.local().family() == senf::INet6SocketAddress::addressFamily );
85 prefix_ senf::console::DirectoryNode & senf::console::UDPServer::root()
88 return executor_.chroot();
91 prefix_ senf::console::UDPServer & senf::console::UDPServer::root(DirectoryNode & root)
93 executor_.chroot(root);
97 prefix_ void senf::console::UDPServer::handleInput(int events)
99 if (events != senf::scheduler::FdEvent::EV_READ) {
100 SENF_LOG((senf::log::IMPORTANT)("Input handle read error. Closing socket."));
101 readevent_.disable();
107 senf::GenericBSDSocketAddress address;
108 handle_.readfrom(data, address, 0u);
111 executor_.cwd(executor_.chroot());
112 std::stringstream stream;
114 parser_.parse(data, boost::bind<void>( boost::ref(executor_), boost::ref(stream), _1));
116 catch (Executor::ExitException &) {
119 catch (std::exception & ex) {
120 std::string msg (ex.what());
121 std::string::size_type i (msg.find("-- \n"));
122 if (i != std::string::npos)
123 msg = msg.substr(i+4);
124 stream << msg << std::endl;
129 if (stream.str().empty())
131 handle_.writeto(address, stream.str());
136 ///////////////////////////////cc.e////////////////////////////////////////
138 //#include "UDPServer.mpp"
144 // comment-column: 40
145 // c-file-style: "senf"
146 // indent-tabs-mode: nil
147 // ispell-local-dictionary: "american"
148 // compile-command: "scons -u test"