]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/capture/pcap/pcap_cap.cpp
More subscriptions, less notifiers.
[stg.git] / projects / stargazer / plugins / capture / pcap / pcap_cap.cpp
index 57a5a8781d22ea1ba8c86b3db6a50c332a204ff1..323bd7bf85f6200d372ab631061452676af50ebf 100644 (file)
@@ -21,7 +21,6 @@
 #include "pcap_cap.h"
 
 #include "stg/traffcounter.h"
-#include "stg/plugin_creator.h"
 #include "stg/common.h"
 #include "stg/raw_ip_packet.h"
 
@@ -32,7 +31,6 @@
 //-----------------------------------------------------------------------------
 namespace
 {
-PLUGIN_CREATOR<PCAP_CAP> pcc;
 
 const size_t SNAP_LEN = 1518;
 const size_t ETHER_ADDR_LEN = 6;
@@ -46,13 +44,13 @@ u_short    ether_type;                     /* IP? ARP? RARP? etc */
 
 }
 
-extern "C" PLUGIN * GetPlugin();
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-PLUGIN * GetPlugin()
+extern "C" STG::Plugin* GetPlugin()
 {
-return pcc.GetPlugin();
+    static PCAP_CAP plugin;
+    return &plugin;
 }
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
@@ -63,12 +61,9 @@ return "pcap_cap v.1.0";
 }
 //-----------------------------------------------------------------------------
 PCAP_CAP::PCAP_CAP()
-    : errorStr(),
-      thread(),
-      nonstop(false),
-      isRunning(false),
+    : isRunning(false),
       traffCnt(NULL),
-      logger(GetPluginLogger(GetStgLogger(), "cap_pcap"))
+      logger(STG::PluginLogger::get("pcap_cap"))
 {
 }
 //-----------------------------------------------------------------------------
@@ -79,7 +74,7 @@ devices.erase(devices.begin(), devices.end());
 if (settings.moduleParams.empty())
     {
     devices.push_back(DEV());
-    logger("Defaulting to pseudo-device 'all'.");
+    logger("Defaulting to pseudo-device 'any'.");
     return 0;
     }
 
@@ -182,15 +177,7 @@ while (it != devices.end())
     ++it;
     }
 
-nonstop = true;
-
-if (pthread_create(&thread, NULL, Run, this))
-    {
-    errorStr = "Cannot create thread.";
-    logger("Cannot create thread.");
-    printfd(__FILE__, "Cannot create thread\n");
-    return -1;
-    }
+m_thread = std::jthread([this](auto token){ Run(std::move(token)); });
 
 return 0;
 }
@@ -200,7 +187,7 @@ int PCAP_CAP::Stop()
 if (!isRunning)
     return 0;
 
-nonstop = false;
+m_thread.request_stop();
 
 //5 seconds to thread stops itself
 for (int i = 0; i < 25 && isRunning; i++)
@@ -210,28 +197,9 @@ for (int i = 0; i < 25 && isRunning; i++)
     }
 //after 5 seconds waiting thread still running. now killing it
 if (isRunning)
-    {
-    if (pthread_kill(thread, SIGUSR1))
-        {
-        errorStr = "Cannot kill thread.";
-        logger("Cannot send signal to thread.");
-        return -1;
-        }
-    for (int i = 0; i < 25 && isRunning; ++i)
-        {
-        struct timespec ts = {0, 200000000};
-        nanosleep(&ts, NULL);
-        }
-    if (isRunning)
-        {
-        errorStr = "PCAP_CAP not stopped.";
-        logger("Cannot stop thread.");
-        printfd(__FILE__, "Cannot stop thread\n");
-        return -1;
-        }
-    }
-
-pthread_join(thread, NULL);
+    m_thread.detach();
+else
+    m_thread.join();
 
 for (DEV_MAP::iterator it(devices.begin()); it != devices.end(); ++it)
     {
@@ -242,35 +210,33 @@ for (DEV_MAP::iterator it(devices.begin()); it != devices.end(); ++it)
 return 0;
 }
 //-----------------------------------------------------------------------------
-void * PCAP_CAP::Run(void * d)
+void PCAP_CAP::Run(std::stop_token token)
 {
 sigset_t signalSet;
 sigfillset(&signalSet);
 pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
 
-PCAP_CAP * dc = static_cast<PCAP_CAP *>(d);
-dc->isRunning = true;
+isRunning = true;
 
 fd_set fds;
 FD_ZERO(&fds);
 int maxFd = 0;
-for (DEV_MAP::const_iterator it(dc->devices.begin()); it != dc->devices.end(); ++it)
+for (DEV_MAP::const_iterator it(devices.begin()); it != devices.end(); ++it)
     {
     FD_SET(it->fd, &fds);
     maxFd = std::max(maxFd, it->fd);
     }
 
-while (dc->nonstop)
+while (!token.stop_requested())
     {
     fd_set rfds = fds;
     struct timeval tv = {0, 500000};
 
     if (select(maxFd + 1, &rfds, NULL, NULL, &tv) > 0)
-        dc->TryRead(rfds);
+        TryRead(rfds);
     }
 
-dc->isRunning = false;
-return NULL;
+isRunning = false;
 }
 
 void PCAP_CAP::TryRead(const fd_set & set)
@@ -294,7 +260,7 @@ const ETH * eth = reinterpret_cast<const ETH *>(packet);
 if (eth->ether_type != 0x8)
     return;
 
-RAW_PACKET ip;
+STG::RawPacket ip;
 memcpy(&ip.rawPacket, packet + 14, sizeof(ip.rawPacket));
-traffCnt->Process(ip);
+traffCnt->process(ip);
 }