diff --git a/plugins/dev9ghzdrk/Win32/Win32.cpp b/plugins/dev9ghzdrk/Win32/Win32.cpp index 17927eda94..06f6d6d249 100644 --- a/plugins/dev9ghzdrk/Win32/Win32.cpp +++ b/plugins/dev9ghzdrk/Win32/Win32.cpp @@ -175,16 +175,25 @@ UINT DEV9ThreadProc() { }*/ NetAdapter* GetNetAdapter() { + NetAdapter* na; if(config.Eth[0]=='p') { - return new PCAPAdapter(); + na = new PCAPAdapter(); } else if (config.Eth[0]=='t') { - return new TAPAdapter(); + na = new TAPAdapter(); } else return 0; + + + if (!na->isInitialised()) + { + delete na; + return 0; + } + return na; } s32 _DEV9open() { diff --git a/plugins/dev9ghzdrk/Win32/net.cpp b/plugins/dev9ghzdrk/Win32/net.cpp index 11c213dcfc..e542cfdbf7 100644 --- a/plugins/dev9ghzdrk/Win32/net.cpp +++ b/plugins/dev9ghzdrk/Win32/net.cpp @@ -42,7 +42,8 @@ DWORD WINAPI NetRxThread(LPVOID lpThreadParameter) void tx_put(NetPacket* pkt) { - nif->send(pkt); + if (nif!=NULL) + nif->send(pkt); //pkt must be copied if its not processed by here, since it can be allocated on the callers stack } void InitNet(NetAdapter* ad) @@ -65,5 +66,6 @@ void TermNet() emu_printf(".done\n"); delete nif; + nif = NULL; } } \ No newline at end of file diff --git a/plugins/dev9ghzdrk/Win32/net.h b/plugins/dev9ghzdrk/Win32/net.h index 038b224ea7..6fd46dfcf2 100644 --- a/plugins/dev9ghzdrk/Win32/net.h +++ b/plugins/dev9ghzdrk/Win32/net.h @@ -34,6 +34,7 @@ class NetAdapter { public: virtual bool blocks()=0; + virtual bool isInitialised() = 0; virtual bool recv(NetPacket* pkt)=0; //gets a packet virtual bool send(NetPacket* pkt)=0; //sends the packet and deletes it when done virtual ~NetAdapter(){} diff --git a/plugins/dev9ghzdrk/Win32/pcap_io.h b/plugins/dev9ghzdrk/Win32/pcap_io.h index bc8e4d8250..5a522f1b96 100644 --- a/plugins/dev9ghzdrk/Win32/pcap_io.h +++ b/plugins/dev9ghzdrk/Win32/pcap_io.h @@ -168,6 +168,7 @@ class PCAPAdapter : public NetAdapter public: PCAPAdapter(); virtual bool blocks(); + virtual bool isInitialised(); //gets a packet.rv :true success virtual bool recv(NetPacket* pkt); //sends the packet and deletes it when done (if successful).rv :true success diff --git a/plugins/dev9ghzdrk/Win32/tap-win32.cpp b/plugins/dev9ghzdrk/Win32/tap-win32.cpp index 1223ec1dee..f4da59b4fb 100644 --- a/plugins/dev9ghzdrk/Win32/tap-win32.cpp +++ b/plugins/dev9ghzdrk/Win32/tap-win32.cpp @@ -381,6 +381,10 @@ bool TAPAdapter::blocks() { return true; //we use blocking io } +bool TAPAdapter::isInitialised() +{ + return (htap != NULL); +} u8 broadcast_adddrrrr[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //gets a packet.rv :true success bool TAPAdapter::recv(NetPacket* pkt) diff --git a/plugins/dev9ghzdrk/Win32/tap.h b/plugins/dev9ghzdrk/Win32/tap.h index 0a58f8678b..9e28a8b47d 100644 --- a/plugins/dev9ghzdrk/Win32/tap.h +++ b/plugins/dev9ghzdrk/Win32/tap.h @@ -31,6 +31,7 @@ class TAPAdapter : public NetAdapter public: TAPAdapter(); virtual bool blocks(); + virtual bool isInitialised(); //gets a packet.rv :true success virtual bool recv(NetPacket* pkt); //sends the packet and deletes it when done (if successful).rv :true success diff --git a/plugins/dev9ghzdrk/pcap_io.cpp b/plugins/dev9ghzdrk/pcap_io.cpp index 457e4796ae..fc7306c835 100644 --- a/plugins/dev9ghzdrk/pcap_io.cpp +++ b/plugins/dev9ghzdrk/pcap_io.cpp @@ -117,10 +117,13 @@ int pcap_io_init(char *adapter) errbuf // error buffer )) == NULL) { + fprintf(stderr, errbuf); fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", adapter); return -1; } + + dlt = pcap_datalink(adhandle); dlt_name = (char*)pcap_datalink_val_to_name(dlt); @@ -326,7 +329,8 @@ void pcap_io_close() fclose(packet_log); if(dump_pcap) pcap_dump_close(dump_pcap); - pcap_close(adhandle); + if (adhandle) + pcap_close(adhandle); pcap_io_running=0; } @@ -429,6 +433,10 @@ bool PCAPAdapter::blocks() { return false; } +bool PCAPAdapter::isInitialised() +{ + return pcap_io_running; +} //gets a packet.rv :true success bool PCAPAdapter::recv(NetPacket* pkt) {