]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/capture/ipq_linux/ipq_cap.cpp
Patch from SpiderX <spiderx@spiderx.dp.ua> - path to FreeRADIUS plugins.
[stg.git] / projects / stargazer / plugins / capture / ipq_linux / ipq_cap.cpp
index de5cd0ed2cdde2bfb23efc3caaccb54167fc0102..9818378af382020faf221d4ef4eaaee32b6d3ffe 100644 (file)
 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
 */
 
 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
 */
 
-#include <signal.h>
-#include <cerrno>
 #include <netinet/in.h>
 #include <linux/netfilter.h>
 
 #include <netinet/in.h>
 #include <linux/netfilter.h>
 
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+
 #include "stg/raw_ip_packet.h"
 #include "stg/traffcounter.h"
 #include "stg/plugin_creator.h"
 #include "stg/raw_ip_packet.h"
 #include "stg/traffcounter.h"
 #include "stg/plugin_creator.h"
+#include "stg/common.h"
+
 #include "ipq_cap.h"
 
 extern "C"
 #include "ipq_cap.h"
 
 extern "C"
@@ -54,10 +58,14 @@ return "ipq_cap v.1.2";
 //-----------------------------------------------------------------------------
 IPQ_CAP::IPQ_CAP()
     : ipq_h(NULL),
 //-----------------------------------------------------------------------------
 IPQ_CAP::IPQ_CAP()
     : ipq_h(NULL),
+      errorStr(),
+      thread(),
       nonstop(false),
       isRunning(false),
       capSock(-1),
       nonstop(false),
       isRunning(false),
       capSock(-1),
-      traffCnt(NULL)
+      traffCnt(NULL),
+      buf(),
+      logger(GetPluginLogger(GetStgLogger(), "cap_ipq"))
 {
 memset(buf, 0, BUFSIZE);
 }
 {
 memset(buf, 0, BUFSIZE);
 }
@@ -92,7 +100,8 @@ for (int i = 0; i < 25; i++)
     {
     if (!isRunning)
         break;
     {
     if (!isRunning)
         break;
-    usleep(200000);
+    struct timespec ts = {0, 200000000};
+    nanosleep(&ts, NULL);
     }
 //after 5 seconds waiting thread still running. now killing it
 if (isRunning)
     }
 //after 5 seconds waiting thread still running. now killing it
 if (isRunning)
@@ -104,7 +113,8 @@ if (isRunning)
         }
     for (int i = 0; i < 25 && isRunning; ++i)
         {
         }
     for (int i = 0; i < 25 && isRunning; ++i)
         {
-        usleep(200000);
+        struct timespec ts = {0, 200000000};
+        nanosleep(&ts, NULL);
         }
     if (isRunning)
         {
         }
     if (isRunning)
         {
@@ -121,9 +131,13 @@ return 0;
 //-----------------------------------------------------------------------------
 void * IPQ_CAP::Run(void * d)
 {
 //-----------------------------------------------------------------------------
 void * IPQ_CAP::Run(void * d)
 {
+sigset_t signalSet;
+sigfillset(&signalSet);
+pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
+
 RAW_PACKET raw_packet;
 
 RAW_PACKET raw_packet;
 
-IPQ_CAP * dc = (IPQ_CAP *)d;
+IPQ_CAP * dc = static_cast<IPQ_CAP *>(d);
 dc->isRunning = true;
 memset(&raw_packet, 0, sizeof(raw_packet));
 raw_packet.dataLen = -1;
 dc->isRunning = true;
 memset(&raw_packet, 0, sizeof(raw_packet));
 raw_packet.dataLen = -1;
@@ -147,6 +161,7 @@ ipq_h = ipq_create_handle(0, PF_INET);
 if (ipq_h == NULL)
     {
     ipq_destroy_handle(ipq_h);
 if (ipq_h == NULL)
     {
     ipq_destroy_handle(ipq_h);
+    logger("Cannot create IPQ handle. Error: '%s', '%s'", ipq_errstr(), strerror(errno));
     errorStr = "Cannot create ipq handle!";
     return -1;
     }
     errorStr = "Cannot create ipq handle!";
     return -1;
     }
@@ -154,6 +169,7 @@ int status = ipq_set_mode(ipq_h, IPQ_COPY_PACKET, PAYLOAD_LEN);
 if (status < 0)
     {
     ipq_destroy_handle(ipq_h);
 if (status < 0)
     {
     ipq_destroy_handle(ipq_h);
+    logger("Cannot set IPQ_COPY_PACKET mode.");
     errorStr = "Cannot set IPQ_COPY_PACKET mode!";
     return -1;
     }
     errorStr = "Cannot set IPQ_COPY_PACKET mode!";
     return -1;
     }