mirror of
https://github.com/optim-enterprises-bv/nDPId-2.git
synced 2025-11-01 02:37:51 +00:00
added utils module to share some code parts with other apps
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
This commit is contained in:
8
Makefile
8
Makefile
@@ -43,11 +43,11 @@ all: help nDPId nDPIsrvd
|
|||||||
|
|
||||||
examples: examples/c-json-stdout/c-json-stdout
|
examples: examples/c-json-stdout/c-json-stdout
|
||||||
|
|
||||||
nDPId: nDPId.c
|
nDPId: nDPId.c utils.c
|
||||||
$(CC) $(PROJECT_CFLAGS) $(CFLAGS) $@.c -o $@ $(LDFLAGS) $(LIBS)
|
$(CC) $(PROJECT_CFLAGS) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
nDPIsrvd: nDPIsrvd.c
|
nDPIsrvd: nDPIsrvd.c utils.c
|
||||||
$(CC) $(PROJECT_CFLAGS) $(CFLAGS) $@.c -o $@ $(LDFLAGS) $(LIBS)
|
$(CC) $(PROJECT_CFLAGS) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
examples/c-json-stdout/c-json-stdout:
|
examples/c-json-stdout/c-json-stdout:
|
||||||
ifneq ($(DISABLE_JSMN),yes)
|
ifneq ($(DISABLE_JSMN),yes)
|
||||||
|
|||||||
63
nDPId.c
63
nDPId.c
@@ -17,6 +17,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
#if (NDPI_MAJOR == 3 && NDPI_MINOR < 3) || NDPI_MAJOR < 3
|
#if (NDPI_MAJOR == 3 && NDPI_MINOR < 3) || NDPI_MAJOR < 3
|
||||||
#error "nDPI >= 3.3.0 requiired"
|
#error "nDPI >= 3.3.0 requiired"
|
||||||
@@ -198,7 +199,6 @@ static int main_thread_shutdown = 0;
|
|||||||
static uint32_t global_flow_id = 0;
|
static uint32_t global_flow_id = 0;
|
||||||
|
|
||||||
static char * pcap_file_or_interface = NULL;
|
static char * pcap_file_or_interface = NULL;
|
||||||
static int daemonize = 0;
|
|
||||||
static int log_to_stderr = 0;
|
static int log_to_stderr = 0;
|
||||||
static char pidfile[UNIX_PATH_MAX] = nDPId_PIDFILE;
|
static char pidfile[UNIX_PATH_MAX] = nDPId_PIDFILE;
|
||||||
static char json_sockpath[UNIX_PATH_MAX] = COLLECTOR_UNIX_SOCKET;
|
static char json_sockpath[UNIX_PATH_MAX] = COLLECTOR_UNIX_SOCKET;
|
||||||
@@ -1647,28 +1647,6 @@ static int processing_threads_error_or_eof(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int create_pidfile(char const * const pidfile)
|
|
||||||
{
|
|
||||||
int pfd;
|
|
||||||
|
|
||||||
pfd = open(pidfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
|
||||||
|
|
||||||
if (pfd < 0)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dprintf(pfd, "%d", getpid()) <= 0)
|
|
||||||
{
|
|
||||||
close(pfd);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(pfd);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int start_reader_threads(void)
|
static int start_reader_threads(void)
|
||||||
{
|
{
|
||||||
sigset_t thread_signal_set, old_signal_set;
|
sigset_t thread_signal_set, old_signal_set;
|
||||||
@@ -1682,19 +1660,11 @@ static int start_reader_threads(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (daemonize != 0)
|
if (daemonize_with_pidfile(pidfile) != 0)
|
||||||
{
|
{
|
||||||
if (daemon(0, 0) != 0)
|
|
||||||
{
|
|
||||||
syslog(LOG_DAEMON | LOG_ERR, "daemon: %s", strerror(errno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (create_pidfile(pidfile) != 0)
|
|
||||||
{
|
|
||||||
syslog(LOG_DAEMON | LOG_ERR, "create pidfile: %s", strerror(errno));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
closelog();
|
||||||
openlog("nDPId", LOG_CONS | (log_to_stderr != 0 ? LOG_PERROR : 0), LOG_DAEMON);
|
openlog("nDPId", LOG_CONS | (log_to_stderr != 0 ? LOG_PERROR : 0), LOG_DAEMON);
|
||||||
|
|
||||||
for (int i = 0; i < reader_thread_count; ++i)
|
for (int i = 0; i < reader_thread_count; ++i)
|
||||||
@@ -1736,10 +1706,7 @@ static int stop_reader_threads(void)
|
|||||||
break_pcap_loop(&reader_threads[i]);
|
break_pcap_loop(&reader_threads[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (daemonize == 0)
|
|
||||||
{
|
|
||||||
printf("------------------------------------ Stopping reader threads\n");
|
printf("------------------------------------ Stopping reader threads\n");
|
||||||
}
|
|
||||||
for (int i = 0; i < reader_thread_count; ++i)
|
for (int i = 0; i < reader_thread_count; ++i)
|
||||||
{
|
{
|
||||||
if (reader_threads[i].workflow == NULL)
|
if (reader_threads[i].workflow == NULL)
|
||||||
@@ -1753,10 +1720,7 @@ static int stop_reader_threads(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (daemonize == 0)
|
|
||||||
{
|
|
||||||
printf("------------------------------------ Results\n");
|
printf("------------------------------------ Results\n");
|
||||||
}
|
|
||||||
for (int i = 0; i < reader_thread_count; ++i)
|
for (int i = 0; i < reader_thread_count; ++i)
|
||||||
{
|
{
|
||||||
if (reader_threads[i].workflow == NULL)
|
if (reader_threads[i].workflow == NULL)
|
||||||
@@ -1770,8 +1734,6 @@ static int stop_reader_threads(void)
|
|||||||
total_flows_idle += reader_threads[i].workflow->total_idle_flows;
|
total_flows_idle += reader_threads[i].workflow->total_idle_flows;
|
||||||
total_flows_detected += reader_threads[i].workflow->detected_flow_protocols;
|
total_flows_detected += reader_threads[i].workflow->detected_flow_protocols;
|
||||||
|
|
||||||
if (daemonize == 0)
|
|
||||||
{
|
|
||||||
printf(
|
printf(
|
||||||
"Stopping Thread %d, processed %10llu packets, %12llu bytes, total flows: %8llu, "
|
"Stopping Thread %d, processed %10llu packets, %12llu bytes, total flows: %8llu, "
|
||||||
"idle flows: %8llu, detected flows: %8llu\n",
|
"idle flows: %8llu, detected flows: %8llu\n",
|
||||||
@@ -1782,17 +1744,13 @@ static int stop_reader_threads(void)
|
|||||||
reader_threads[i].workflow->total_idle_flows,
|
reader_threads[i].workflow->total_idle_flows,
|
||||||
reader_threads[i].workflow->detected_flow_protocols);
|
reader_threads[i].workflow->detected_flow_protocols);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/* total packets captured: same value for all threads as packet2thread distribution happens later */
|
/* total packets captured: same value for all threads as packet2thread distribution happens later */
|
||||||
if (daemonize == 0)
|
|
||||||
{
|
|
||||||
printf("Total packets captured.: %llu\n", reader_threads[0].workflow->packets_captured);
|
printf("Total packets captured.: %llu\n", reader_threads[0].workflow->packets_captured);
|
||||||
printf("Total packets processed: %llu\n", total_packets_processed);
|
printf("Total packets processed: %llu\n", total_packets_processed);
|
||||||
printf("Total layer4 data size.: %llu\n", total_l4_data_len);
|
printf("Total layer4 data size.: %llu\n", total_l4_data_len);
|
||||||
printf("Total flows captured...: %llu\n", total_flows_captured);
|
printf("Total flows captured...: %llu\n", total_flows_captured);
|
||||||
printf("Total flows timed out..: %llu\n", total_flows_idle);
|
printf("Total flows timed out..: %llu\n", total_flows_idle);
|
||||||
printf("Total flows detected...: %llu\n", total_flows_detected);
|
printf("Total flows detected...: %llu\n", total_flows_detected);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1849,7 +1807,7 @@ static int parse_options(int argc, char ** argv)
|
|||||||
json_sockpath[sizeof(json_sockpath) - 1] = '\0';
|
json_sockpath[sizeof(json_sockpath) - 1] = '\0';
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
daemonize = 1;
|
daemonize_enable();
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
strncpy(pidfile, optarg, sizeof(pidfile) - 1);
|
strncpy(pidfile, optarg, sizeof(pidfile) - 1);
|
||||||
@@ -1863,12 +1821,6 @@ static int parse_options(int argc, char ** argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_to_stderr != 0 && daemonize != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: Using -l and -d does not make sense.\n", argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1898,13 +1850,13 @@ int main(int argc, char ** argv)
|
|||||||
|
|
||||||
if (setup_reader_threads(pcap_file_or_interface) != 0)
|
if (setup_reader_threads(pcap_file_or_interface) != 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_DAEMON | LOG_ERR, "%s: setup_reader_threads failed", argv[0]);
|
syslog(LOG_DAEMON | LOG_ERR, "setup_reader_threads failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start_reader_threads() != 0)
|
if (start_reader_threads() != 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_DAEMON | LOG_ERR, "%s: start_reader_threads", argv[0]);
|
syslog(LOG_DAEMON | LOG_ERR, "start_reader_threads failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1917,11 +1869,12 @@ int main(int argc, char ** argv)
|
|||||||
|
|
||||||
if (main_thread_shutdown == 0 && stop_reader_threads() != 0)
|
if (main_thread_shutdown == 0 && stop_reader_threads() != 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_DAEMON | LOG_ERR, "%s: stop_reader_threads", argv[0]);
|
syslog(LOG_DAEMON | LOG_ERR, "stop_reader_threads");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
free_reader_threads();
|
free_reader_threads();
|
||||||
|
|
||||||
|
daemonize_shutdown(pidfile);
|
||||||
syslog(LOG_DAEMON | LOG_NOTICE, "Bye.");
|
syslog(LOG_DAEMON | LOG_NOTICE, "Bye.");
|
||||||
closelog();
|
closelog();
|
||||||
|
|
||||||
|
|||||||
111
utils.c
Normal file
111
utils.c
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
typedef char pid_str[16];
|
||||||
|
|
||||||
|
static int daemonize = 0;
|
||||||
|
|
||||||
|
void daemonize_enable(void)
|
||||||
|
{
|
||||||
|
daemonize = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int is_daemon_running(char const * const pidfile, pid_str ps)
|
||||||
|
{
|
||||||
|
int pfd = open(pidfile, O_RDONLY, 0);
|
||||||
|
char proc_path[32];
|
||||||
|
|
||||||
|
if (pfd < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (read(pfd, ps, sizeof(pid_str)) <= 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(pfd);
|
||||||
|
|
||||||
|
if (snprintf(proc_path, sizeof(pid_str), "/proc/%s", ps) <= 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (access(proc_path, F_OK) == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int create_pidfile(char const * const pidfile)
|
||||||
|
{
|
||||||
|
int pfd;
|
||||||
|
|
||||||
|
pfd = open(pidfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
||||||
|
|
||||||
|
if (pfd < 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_DAEMON | LOG_ERR, "Could open pidfile %s for writing: %s", pidfile, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dprintf(pfd, "%d", getpid()) <= 0)
|
||||||
|
{
|
||||||
|
close(pfd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(pfd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int daemonize_with_pidfile(char const * const pidfile)
|
||||||
|
{
|
||||||
|
pid_str ps;
|
||||||
|
|
||||||
|
if (daemonize != 0)
|
||||||
|
{
|
||||||
|
if (is_daemon_running(pidfile, ps) != 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_DAEMON | LOG_ERR, "Pidfile %s found and daemon %s still running", pidfile, ps);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (daemon(0, 0) != 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_DAEMON | LOG_ERR, "daemon: %s", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (create_pidfile(pidfile) != 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int daemonize_shutdown(char const * const pidfile)
|
||||||
|
{
|
||||||
|
if (daemonize != 0)
|
||||||
|
{
|
||||||
|
if (unlink(pidfile) != 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_DAEMON | LOG_ERR, "Could not unlink pidfile %s: %s", pidfile, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user