diff --git a/PPI/SocketSink.cti b/PPI/SocketSink.cti index b7482eb13f55e528213344e6f3c95fdf6dea8e76..07dba5b124992c356842b7fdee025802aa8e7317 100644 --- a/PPI/SocketSink.cti +++ b/PPI/SocketSink.cti @@ -30,6 +30,42 @@ #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////// +// senf::ppi::TargetDgramWriter<HandleType> + +template <class HandleType> +prefix_ senf::ppi::TargetDgramWriter<HandleType>::TargetDgramWriter() +{} + +template <class HandleType> +prefix_ senf::ppi::TargetDgramWriter<HandleType>:: +TargetDgramWriter(typename Handle::Address const & target) +: target_ (target) +{} + +template <class HandleType> +prefix_ typename senf::ppi::TargetDgramWriter<HandleType>::Handle::Address +senf::ppi::TargetDgramWriter<HandleType>::target() + const +{ + return target_; +} + +template <class HandleType> +prefix_ void +senf::ppi::TargetDgramWriter<HandleType>::target(typename Handle::Address const & target) +{ + target_ = target; +} + +template <class HandleType> +prefix_ void senf::ppi::TargetDgramWriter<HandleType>::operator()(Handle handle, + Packet const & packet) +{ + if (target_) + handle.writeto(target_, packet.data()); +} + /////////////////////////////////////////////////////////////////////////// // senf::ppi::module::ActiveSocketSink<Writer> diff --git a/PPI/SocketSink.hh b/PPI/SocketSink.hh index 83a1d5f196ae914759baefa806cc78222c002207..e87b66fe620d4db05aab914777a1d21505bfb005 100644 --- a/PPI/SocketSink.hh +++ b/PPI/SocketSink.hh @@ -65,6 +65,24 @@ namespace ppi { \param[in] packet Packet to write */ }; + template <class HandleType> + class TargetDgramWriter + { + public: + typedef HandleType Handle; + + TargetDgramWriter(); + TargetDgramWriter(typename Handle::Address const & target); + + typename Handle::Address target() const; + void target(typename Handle::Address const & target); + + void operator()(Handle handle, Packet const & packet); + + private: + typename Handle::Address target_; + }; + class IPv4SourceForcingDgramWriter : ConnectedDgramWriter { public: diff --git a/Scheduler/EventManager.cc b/Scheduler/EventManager.cc index 30ac6d20875ed9a2f357dfeb894265f576cf2631..d267a1ee818515d206ed5b42d31fdee64e64f3de 100644 --- a/Scheduler/EventManager.cc +++ b/Scheduler/EventManager.cc @@ -39,7 +39,7 @@ prefix_ senf::scheduler::detail::EventManager::EventManager() { #ifndef SENF_DISABLE_CONSOLE - consoleDir_().add("events", senf::membind(&EventManager::consoleEvents, this)) + consoleDir_().add("events", senf::membind(&EventManager::listEvents, this)) .doc("List all scheduler events sorted by priority\n" "\n" "Columns:\n" @@ -61,7 +61,7 @@ prefix_ senf::scheduler::detail::EventManager::EventManager() #endif } -prefix_ void senf::scheduler::detail::EventManager::consoleEvents(std::ostream & os) +prefix_ void senf::scheduler::detail::EventManager::listEvents(std::ostream & os) { // On an 80 column display, this wraps nicely directly before the INFO column boost::format fmt ("%s %-55.55s 0x%08x %8d %s %s\n"); diff --git a/Scheduler/EventManager.hh b/Scheduler/EventManager.hh index 75865563998756fd5777ea131ca41b078b05570d..099ebae7d97d896c99575a3ca9736eb2055bdb57 100644 --- a/Scheduler/EventManager.hh +++ b/Scheduler/EventManager.hh @@ -105,6 +105,8 @@ namespace detail { iterator begin() const; iterator end() const; + void listEvents(std::ostream & os); + protected: private: @@ -115,8 +117,6 @@ namespace detail { friend class singleton<EventManager>; #ifndef SENF_DISABLE_CONSOLE - void consoleEvents(std::ostream & os); - console::LazyDirectory consoleDir_; #endif }; diff --git a/Socket/NetdeviceController.cc b/Socket/NetdeviceController.cc index 345679b382bf6974cf6e3b32dc9ce109c3ea3dad..b514904ba5378ac49c8b624153a278839812eddd 100644 --- a/Socket/NetdeviceController.cc +++ b/Socket/NetdeviceController.cc @@ -136,6 +136,33 @@ prefix_ void senf::NetdeviceController::promisc(bool mode) doIoctl( ifr, SIOCSIFFLAGS); } +prefix_ bool senf::NetdeviceController::isUp() + const +{ + struct ifreq ifr; + ifrName(ifr); + doIoctl(ifr, SIOCGIFFLAGS); + return ifr.ifr_flags & IFF_UP; +} + +prefix_ void senf::NetdeviceController::up() +{ + struct ifreq ifr; + ifrName(ifr); + doIoctl(ifr, SIOCGIFFLAGS); + ifr.ifr_flags |= IFF_UP; + doIoctl(ifr, SIOCSIFFLAGS); +} + +prefix_ void senf::NetdeviceController::down() +{ + struct ifreq ifr; + ifrName(ifr); + doIoctl(ifr, SIOCGIFFLAGS); + ifr.ifr_flags &= ~IFF_UP; + doIoctl(ifr, SIOCSIFFLAGS); +} + prefix_ int senf::NetdeviceController::interfaceIndex() const { diff --git a/Socket/NetdeviceController.hh b/Socket/NetdeviceController.hh index db7c5cf2a1bf945c145000502ce04475f12d9948..ed74c18f86bdb1ff0401844176b117913a5179b5 100644 --- a/Socket/NetdeviceController.hh +++ b/Socket/NetdeviceController.hh @@ -84,7 +84,11 @@ namespace senf { bool promisc() const; ///< return \c true if interface is in promiscuous mode void promisc(bool mode); ///< enable/disable promiscuous mode of the interface /**< Note, that this is a privileged operation. */ - + + bool isUp() const; ///< return \c true if interface is up + void up(); ///< ifconfig up interface + void down(); ///< ifconfig down interface + private: void openSocket(); void doIoctl(ifreq& ifr, int request) const; diff --git a/Utils/Daemon/Daemon.cc b/Utils/Daemon/Daemon.cc index 8cbf98fbbfb6d72fdb0e0b597ae83bcd3ee7adea..1b6e8ae9a62817b28f81fc36a462ebb24c579745 100644 --- a/Utils/Daemon/Daemon.cc +++ b/Utils/Daemon/Daemon.cc @@ -132,17 +132,19 @@ prefix_ void senf::Daemon::openLog() << " Could not open \"" << stdoutLog_ << "\" for redirecting stdout."; stdout_ = fd; } - if (stderrLog_ == stdoutLog_) { - stderr_ = ::dup(fd); - if (stderr_ < 0) - SENF_THROW_SYSTEM_EXCEPTION("::dup()"); - } - else if (! stderrLog_.empty()) { - fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666); - if (fd < 0) - SENF_THROW_SYSTEM_EXCEPTION("") - << " Could not open \"" << stderrLog_ << "\" for redirecting stderr."; - stderr_ = fd; + if (! stderrLog_.empty()) { + if (stderrLog_ == stdoutLog_) { + stderr_ = ::dup(fd); + if (stderr_ < 0) + SENF_THROW_SYSTEM_EXCEPTION("::dup()"); + } + else { + fd = ::open(stdoutLog_.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0666); + if (fd < 0) + SENF_THROW_SYSTEM_EXCEPTION("") + << " Could not open \"" << stderrLog_ << "\" for redirecting stderr."; + stderr_ = fd; + } } } @@ -369,14 +371,17 @@ prefix_ void senf::Daemon::fork() LIBC_CALL( ::sigaddset, (&cldsig, SIGCHLD) ); LIBC_CALL( ::sigprocmask, (SIG_BLOCK, &cldsig, &oldsig) ); - if (! senf::scheduler::empty() ) + if (! senf::scheduler::empty() ) { std::cerr << "\n" "*** WARNING ***\n" "Scheduler not empty before fork(). THIS MUST NOT HAPPEN.\n" - "The scheduler will be reinitialized by the fork() and lose all registrations.\n" - "*** WARNING ***\n" + "The scheduler will be reinitialized by the fork() and lose all registrations.\n\n"; + senf::scheduler::detail::EventManager::instance().listEvents(std::cerr); + std::cerr << + "\n*** WARNING ***\n" "\n"; + } LIBC_CALL_RV( pid, ::fork, () );