1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include "nDPIsrvd.h"
#include "jsmn/jsmn.h"
//#define VERBOSE 1
struct nDPIsrvd_socket * sock = NULL;
static int main_thread_shutdown = 0;
static char const serv_listen_path[] = DISTRIBUTOR_UNIX_SOCKET;
static char const serv_listen_addr[INET_ADDRSTRLEN] = DISTRIBUTOR_HOST;
static uint16_t const serv_listen_port = DISTRIBUTOR_PORT;
enum nDPIsrvd_callback_return nDPIsrvd_json_callback(struct nDPIsrvd_socket * const sock, void * user_data)
{
(void)user_data;
if (token_is_start(sock) == 1)
{
#ifdef VERBOSE
/* Start of a JSON string. */
printf("JSON ");
#endif
}
else if (token_is_end(sock) == 1)
{
#ifdef VERBOSE
/* End of a JSON string. */
printf("EoF\n");
#endif
}
else if (token_is_key_value_pair(sock) == 1)
{
if (key_equals(sock, "flow_event_name") == 1)
{
if (value_equals(sock, "guessed") == 1)
{
printf("Guessed flow.\n");
}
else if (value_equals(sock, "not-detected") == 1)
{
printf("Not detected flow.\n");
}
else if (value_equals(sock, "detected") == 1)
{
printf("Detected flow.\n");
}
}
#ifdef VERBOSE
printf("[%.*s : %.*s] ",
sock->jsmn.key_value.key_length,
sock->jsmn.key_value.key,
sock->jsmn.key_value.value_length,
sock->jsmn.key_value.value);
#endif
}
else
{
fprintf(stderr, "%s\n", "Internal error, exit ..");
return CALLBACK_ERROR;
}
return CALLBACK_OK;
}
static void sighandler(int signum)
{
(void)signum;
if (main_thread_shutdown == 0)
{
main_thread_shutdown = 1;
}
}
int main(int argc, char ** argv)
{
sock = nDPIsrvd_init();
if (sock == NULL)
{
fprintf(stderr, "%s: nDPIsrvd socket memory allocation failed!\n", argv[0]);
return 1;
}
signal(SIGINT, sighandler);
signal(SIGTERM, sighandler);
signal(SIGPIPE, sighandler);
enum nDPIsrvd_connect_return connect_ret;
if (argc == 2)
{
printf("Connecting to UNIX socket: %s\n", argv[1]);
connect_ret = nDPIsrvd_connect_unix(sock, argv[1]);
} else if (argc == 1) {
if (access(serv_listen_path, R_OK) == 0)
{
printf("Connecting to %s\n", serv_listen_path);
connect_ret = nDPIsrvd_connect_unix(sock, serv_listen_path);
} else {
printf("Connecting to %s:%u\n", serv_listen_addr, serv_listen_port);
connect_ret = nDPIsrvd_connect_ip(sock, serv_listen_addr, serv_listen_port);
}
}
if (connect_ret != CONNECT_OK)
{
fprintf(stderr, "%s: nDPIsrvd socket connect failed!\n", argv[0]);
nDPIsrvd_free(&sock);
return 1;
}
while (main_thread_shutdown == 0)
{
errno = 0;
enum nDPIsrvd_read_return read_ret = nDPIsrvd_read(sock);
if (read_ret != READ_OK)
{
break;
}
enum nDPIsrvd_parse_return parse_ret = nDPIsrvd_parse(sock, nDPIsrvd_json_callback, NULL);
switch (parse_ret)
{
default:
break;
}
}
nDPIsrvd_free(&sock);
return 0;
}
|