Skip to content

Commit 68cc358

Browse files
committed
implement working example app
1 parent 599b1a3 commit 68cc358

File tree

6 files changed

+116
-14
lines changed

6 files changed

+116
-14
lines changed

EventCallbackData.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,21 @@
55

66
struct EventCallbackData
77
{
8-
98
using EventCallback = std::function<void(ProcessEvent, void*)>;
109

10+
EventCallbackData(EventCallback aCallback, void* aContext, uint64_t aId)
11+
{
12+
callback = aCallback;
13+
context = aContext;
14+
id = aId;
15+
}
16+
17+
~EventCallbackData()
18+
{
19+
/* EMPTY */
20+
}
21+
1122
EventCallback callback;
1223
void* context;
13-
int id;
24+
uint64_t id;
1425
};

IdGenerator.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include <inttypes.h>
4+
5+
class IdGenerator
6+
{
7+
public:
8+
9+
uint64_t GenerateId()
10+
{
11+
auto lReturnedId = mNextId;
12+
mNextId++;
13+
return lReturnedId;
14+
}
15+
16+
void Reset()
17+
{
18+
mNextId = 0;
19+
}
20+
21+
22+
private:
23+
24+
uint64_t mNextId;
25+
26+
};

ProcessEvent.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
#pragma once
22

3-
#include <chrono>
43
#include <linux/cn_proc.h>
54

65
class ProcessEvent
76
{
87
public:
98

109
struct proc_event eventData;
11-
uint64_t arrivalTime;
12-
13-
private:
10+
11+
uint64_t GetTimeStamp()
12+
{
13+
return eventData.timestamp_ns;
14+
}
1415

1516
};

ProcessMonitor.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,17 @@ int ProcessMonitor::Stop()
6363
return SUCCESS_CODE;
6464
}
6565

66+
uint64_t ProcessMonitor::AddCallback(EventCallback aEventCallback, void* context)
67+
{
68+
auto lCallbackID = mCallbackIdGenerator.GenerateId();
69+
mEventCallbacks.emplace_back(aEventCallback, context, lCallbackID);
70+
return lCallbackID;
71+
}
72+
73+
int ProcessMonitor::RemoveCallback(uint64_t aCallbackId)
74+
{
6675

76+
}
6777

6878
int ProcessMonitor::connectToNetlinkSocket()
6979
{
@@ -173,8 +183,6 @@ void ProcessMonitor::netlinkClient(ProcessMonitor* aProcessMonitor)
173183

174184
rc = recv(aProcessMonitor->mNetlinkSock, &nlcn_msg, sizeof(nlcn_msg), 0);
175185

176-
auto lEventArrivalTime = std::chrono::system_clock::now();
177-
178186
if (rc == 0) {
179187
/* shutdown? */
180188
return;
@@ -185,7 +193,6 @@ void ProcessMonitor::netlinkClient(ProcessMonitor* aProcessMonitor)
185193
}
186194

187195
ProcessEvent lProcEvent;
188-
lProcEvent.arrivalTime = lEventArrivalTime.time_since_epoch().count();
189196
lProcEvent.eventData = nlcn_msg.proc_ev;
190197

191198
aProcessMonitor->mProcEventsList.PushBack(lProcEvent);

ProcessMonitor.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "utils/ThreadSafeList.h"
88
#include "ProcessEvent.h"
99
#include "EventCallbackData.h"
10+
#include "IdGenerator.h"
1011

1112
#define INVALID_SOCKET -1
1213
#define SUCCESS_CODE 0
@@ -16,6 +17,8 @@ class ProcessMonitor
1617
{
1718
public:
1819

20+
using EventCallback = EventCallbackData::EventCallback;
21+
1922
ProcessMonitor();
2023
~ProcessMonitor();
2124

@@ -24,9 +27,9 @@ class ProcessMonitor
2427
/**
2528
* @returns - Callback ID.
2629
*/
27-
int AddCallback(EventCallbackData aEventCallback);
30+
uint64_t AddCallback(EventCallback aEventCallback, void* context);
2831

29-
int RemoveCallback(int aCallbackId);
32+
int RemoveCallback(uint64_t aCallbackId);
3033

3134
int Start();
3235

@@ -61,6 +64,8 @@ class ProcessMonitor
6164

6265
std::thread mCallbackRunnerThread;
6366

67+
IdGenerator mCallbackIdGenerator;
68+
6469
private:
6570

6671
static void netlinkClient(ProcessMonitor* aProcessMonitor);

main.cpp

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,65 @@
33

44
#include "ProcessMonitor.h"
55

6-
int main()
6+
#define UNUSED_PARAMETER(x) (void)(x)
7+
8+
void logCallbackExample(ProcessEvent aEvent, void* aContext)
79
{
8-
std::cout << "[ ] starting process monitor" << std::endl;
10+
UNUSED_PARAMETER(aContext);
11+
12+
std::cout << aEvent.GetTimeStamp() << std::endl;
13+
14+
switch (aEvent.eventData.what) {
15+
case proc_event::PROC_EVENT_NONE:
16+
printf("set mcast listen ok\n");
17+
break;
18+
case proc_event::PROC_EVENT_FORK:
19+
printf("fork: parent tid=%d pid=%d, child tid=%d pid=%d \n",
20+
aEvent.eventData.event_data.fork.parent_pid,
21+
aEvent.eventData.event_data.fork.parent_tgid,
22+
aEvent.eventData.event_data.fork.child_pid,
23+
aEvent.eventData.event_data.fork.child_tgid);
24+
break;
25+
case proc_event::PROC_EVENT_EXEC:
26+
printf("exec: tid=%d pid=%d\n",
27+
aEvent.eventData.event_data.exec.process_pid,
28+
aEvent.eventData.event_data.exec.process_tgid);
29+
break;
30+
case proc_event::PROC_EVENT_UID:
31+
printf("uid change: tid=%d pid=%d from %d to %d\n",
32+
aEvent.eventData.event_data.id.process_pid,
33+
aEvent.eventData.event_data.id.process_tgid,
34+
aEvent.eventData.event_data.id.r.ruid,
35+
aEvent.eventData.event_data.id.e.euid);
36+
break;
37+
case proc_event::PROC_EVENT_GID:
38+
printf("gid change: tid=%d pid=%d from %d to %d\n",
39+
aEvent.eventData.event_data.id.process_pid,
40+
aEvent.eventData.event_data.id.process_tgid,
41+
aEvent.eventData.event_data.id.r.rgid,
42+
aEvent.eventData.event_data.id.e.egid);
43+
break;
44+
case proc_event::PROC_EVENT_EXIT:
45+
printf("exit: tid=%d pid=%d exit_code=%d\n",
46+
aEvent.eventData.event_data.exit.process_pid,
47+
aEvent.eventData.event_data.exit.process_tgid,
48+
aEvent.eventData.event_data.exit.exit_code);
49+
break;
50+
default:
51+
printf("unhandled proc event\n");
52+
break;
53+
}
54+
}
955

56+
int main()
57+
{
1058
ProcessMonitor lProcMon;
1159

60+
auto lCallbackId = lProcMon.AddCallback(logCallbackExample, NULL);
61+
1262
if(lProcMon.Connect() != SUCCESS_CODE)
1363
{
14-
std::cout << "[X] ProcessMonitor::Connect failed" << std::endl;
64+
std::cout << "[X] ProcessMonitor::Connect failed (make sure to use sudo)" << std::endl;
1565
return 1;
1666
}
1767

@@ -23,6 +73,8 @@ int main()
2373

2474
std::this_thread::sleep_for(std::chrono::seconds(1));
2575

76+
lProcMon.RemoveCallback(lCallbackId);
77+
2678
if(lProcMon.Stop() != SUCCESS_CODE)
2779
{
2880
std::cout << "[X] ProcessMonitor::Stop failed" << std::endl;

0 commit comments

Comments
 (0)