Socket/NetdeviceController: added promisc() methods
tho [Thu, 26 Mar 2009 10:32:56 +0000 (10:32 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1168 270642c3-0616-0410-b53a-bc976706d245

Makefile
Socket/NetdeviceController.cc
Socket/NetdeviceController.hh
Socket/NetdeviceController.test.cc
Utils/Console/Mainpage.dox
Utils/Daemon/Daemon.hh

index 10a82c9..532d737 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,7 @@
 #----------------------------------------------------------------------
 # Some SCONS shortcuts
 #----------------------------------------------------------------------
-
-CONCURRENCY_LEVEL ?= 2
+CONCURRENCY_LEVEL ?= $(shell grep process /proc/cpuinfo | wc -l)
 
 ifdef final
   SCONS_ARGS += "final="$(final)
index 7ce1f95..345679b 100644 (file)
@@ -115,6 +115,27 @@ prefix_ void senf::NetdeviceController::mtu(int new_mtu)
     doIoctl( ifr, SIOCSIFMTU);
 }
 
+prefix_ bool senf::NetdeviceController::promisc()
+    const
+{
+    struct ifreq ifr;
+    ifrName( ifr);
+    doIoctl( ifr, SIOCGIFFLAGS);
+    return ifr.ifr_flags & IFF_PROMISC;
+}
+
+prefix_ void senf::NetdeviceController::promisc(bool mode)
+{
+    struct ifreq ifr;
+    ifrName( ifr);
+    doIoctl( ifr, SIOCGIFFLAGS);
+    if (mode)
+        ifr.ifr_flags |= IFF_PROMISC;
+    else
+        ifr.ifr_flags &= ~IFF_PROMISC;
+    doIoctl( ifr, SIOCSIFFLAGS);
+}
+
 prefix_ int senf::NetdeviceController::interfaceIndex()
     const
 {
index 5f80968..db7c5cf 100644 (file)
@@ -44,8 +44,6 @@ namespace senf {
         devices. Note, that some setting members are privileged operations.
 
         \see manual page netdevice(7) for more informations.
-
-        \todo Add 'promisc' member to enable/disable promiscuous mode
      */
     class NetdeviceController
     {
@@ -62,21 +60,31 @@ namespace senf {
         void hardwareAddress(const MACAddress &newAddress);
                                         ///< set hardware address
                                         /**< Changes the hardware address of the interface.
-                                             Note, that setting the hardware address is a privileged operation. It is only allowed when the interface
-                                             is not up. If the interface is up, this call will cause an SystemException to be thrown.*/
+                                             Note, that setting the hardware address is a privileged
+                                             operation. It is only allowed when the interface is not
+                                             up. If the interface is up, this call will cause an
+                                             SystemException to be thrown. */
         std::string interfaceName() const;
                                         ///< return interface name
         void interfaceName(const std::string &newName);
                                         ///< set interface name
                                         /**< Changes the name of the interface.
-                                             Note, that setting the name is a privileged operation. It is only allowed when the interface
-                                             is not up. If the interface is up, this call will cause an SystemException to be thrown.*/
+                                             Note, that setting the name is a privileged operation. 
+                                             It is only allowed when the interface is not up. If 
+                                             the interface is up, this call will cause an 
+                                             SystemException to be thrown. */
 
         int mtu() const;                ///< return the Maximum Transmission Unit
         void mtu(int new_mtu);          ///< set the Maximum Transmission Unit
                                         /**< Set the MTU (Maximum Transfer Unit) of the device.
                                              Note, that this is a privileged operation.
-                                             Setting the MTU to too small values may cause kernel crashes. */
+                                             Setting the MTU to too small values may cause kernel 
+                                             crashes. */
+
+        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. */
+                
     private:
         void openSocket();
         void doIoctl(ifreq& ifr, int request) const;
index dcc8a3b..24258ee 100644 (file)
@@ -48,6 +48,9 @@ BOOST_AUTO_UNIT_TEST(NetdeviceController) {
     
     int oldMTU;
     SENF_CHECK_NO_THROW( oldMTU = ctrl.mtu());
+    
+    bool promisc;
+    SENF_CHECK_NO_THROW( promisc = ctrl.promisc());
 
     if (getuid() != 0) {
         BOOST_WARN_MESSAGE(false, "Cannot run some tests of senf::NetdeviceController as non-root user");
@@ -59,6 +62,10 @@ BOOST_AUTO_UNIT_TEST(NetdeviceController) {
     SENF_CHECK_NO_THROW( ctrl.mtu(oldMTU));
     BOOST_CHECK_EQUAL( ctrl.mtu(), oldMTU);
     
+    SENF_CHECK_NO_THROW( ctrl.promisc( !promisc));
+    BOOST_CHECK_EQUAL( ctrl.promisc(), !promisc);
+    SENF_CHECK_NO_THROW( ctrl.promisc( promisc));
+    BOOST_CHECK_EQUAL( ctrl.promisc(), promisc);
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
index 16e7376..b46ce64 100644 (file)
     The first possibility to control this is to change the root node. This is done by 
     \li passing that root node to the helper class or to the parse helper as an additional argument
         (see the respective documentation).
-    \li passing it to the senf:;console::ConfigBundle constructor when parsing multiple sources.
+    \li passing it to the senf::console::ConfigBundle constructor when parsing multiple sources.
     
     for example:
 
index e38a62c..f0d3e6b 100644 (file)
@@ -37,8 +37,7 @@ namespace senf {
 
     /** \brief %Daemon process
 
-        %senf::Daemon provides simple management for daemon processes. Specifically, the %Daemon class
-        implements
+        The %Daemon class provides simple management for daemon processes. Specifically, it implements
         \li <i>Safe startup.</i> If the startup fails, the foreground process which launches the
             daemon will terminate with an appropriate error exit code.
         \li <i>Straight forward application initialization.</i> The daemon process is forked before