#include <iostream>
#include <thread>
typedef double pcap_t;
typedef float device;
typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);
class monitor {
public:
monitor(device *dev);
void exec();
void end();
virtual ~monitor();
private:
static pcap_handler process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr,
const u_char * packet);
static void thread_func(monitor *mon);
device *dev;
};
void monitor::exec() {
std::thread t (monitor::thread_func, this);
}
void monitor::thread_func(monitor *mon) {
pcap_loop(nullptr, -1, monitor::process_packet, reinterpret_cast<u_char*>(mon)); // error in this line
}
pcap_handler monitor::process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr,
const u_char * packet) {
monitor *mon = reinterpret_cast<monitor*>(arg);
}
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgoKdHlwZWRlZiBkb3VibGUgcGNhcF90Owp0eXBlZGVmIGZsb2F0IGRldmljZTsKCnR5cGVkZWYgdm9pZCAoKnBjYXBfaGFuZGxlcikodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqYnl0ZXMpOwoKaW50IHBjYXBfbG9vcChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKTsKCmNsYXNzIG1vbml0b3IgewogICBwdWJsaWM6CiAgICBtb25pdG9yKGRldmljZSAqZGV2KTsKICAgIHZvaWQgZXhlYygpOwogICAgdm9pZCBlbmQoKTsKICAgIHZpcnR1YWwgfm1vbml0b3IoKTsKCiAgIHByaXZhdGU6CiAgICBzdGF0aWMgcGNhcF9oYW5kbGVyIHByb2Nlc3NfcGFja2V0KHVfY2hhciAqYXJnLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIqIHBrdGhkciwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBwYWNrZXQpOwogICAgc3RhdGljIHZvaWQgdGhyZWFkX2Z1bmMobW9uaXRvciAqbW9uKTsKICAgICAgZGV2aWNlICpkZXY7CiAgICAgICAgfTsKdm9pZCBtb25pdG9yOjpleGVjKCkgewogIHN0ZDo6dGhyZWFkIHQgKG1vbml0b3I6OnRocmVhZF9mdW5jLCB0aGlzKTsKfQoKdm9pZCBtb25pdG9yOjp0aHJlYWRfZnVuYyhtb25pdG9yICptb24pIHsKICBwY2FwX2xvb3AobnVsbHB0ciwgLTEsIG1vbml0b3I6OnByb2Nlc3NfcGFja2V0LCByZWludGVycHJldF9jYXN0PHVfY2hhcio+KG1vbikpOyAvLyBlcnJvciBpbiB0aGlzIGxpbmUKfQoKcGNhcF9oYW5kbGVyIG1vbml0b3I6OnByb2Nlc3NfcGFja2V0KHVfY2hhciAqYXJnLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIqIHBrdGhkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBwYWNrZXQpIHsKICBtb25pdG9yICptb24gPSByZWludGVycHJldF9jYXN0PG1vbml0b3IqPihhcmcpOwp9CgoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==
prog.cpp: In static member function ‘static void monitor::thread_func(monitor*)’:
prog.cpp:29:81: error: invalid conversion from ‘void (* (*)(u_char*, const pcap_pkthdr*, const u_char*))(u_char*, const pcap_pkthdr*, const u_char*) {aka void (* (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*))(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ to ‘pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ [-fpermissive]
pcap_loop(nullptr, -1, monitor::process_packet, reinterpret_cast<u_char*>(mon)); // error in this line
^
prog.cpp:9:5: error: initializing argument 3 of ‘int pcap_loop(pcap_t*, int, pcap_handler, u_char*)’ [-fpermissive]
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);
^
prog.cpp: In static member function ‘static void (* monitor::process_packet(u_char*, const pcap_pkthdr*, const u_char*))(u_char*, const pcap_pkthdr*, const u_char*)’:
prog.cpp:34:12: warning: unused variable ‘mon’ [-Wunused-variable]
monitor *mon = reinterpret_cast<monitor*>(arg);
^
prog.cpp:35:1: warning: no return statement in function returning non-void [-Wreturn-type]
}
^