DEV9: Use unique_ptr via typedef for ifadddrs buffer

This commit is contained in:
TheLastRar 2023-01-17 13:29:57 +00:00 committed by lightningterror
parent 31fa1ea21e
commit 41a47f99f7
4 changed files with 34 additions and 40 deletions

View File

@ -42,7 +42,7 @@
using namespace PacketReader::IP; using namespace PacketReader::IP;
#ifdef _WIN32 #ifdef _WIN32
bool AdapterUtils::GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr<IP_ADAPTER_ADDRESSES[]>* buffer) bool AdapterUtils::GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, AdapterBuffer* buffer)
{ {
int neededSize = 128; int neededSize = 128;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> adapterInfo = std::make_unique<IP_ADAPTER_ADDRESSES[]>(neededSize); std::unique_ptr<IP_ADAPTER_ADDRESSES[]> adapterInfo = std::make_unique<IP_ADAPTER_ADDRESSES[]>(neededSize);
@ -91,7 +91,7 @@ bool AdapterUtils::GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSE
return false; return false;
} }
bool AdapterUtils::GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr<IP_ADAPTER_ADDRESSES[]>* buffer) bool AdapterUtils::GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, AdapterBuffer* buffer)
{ {
int neededSize = 128; int neededSize = 128;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> adapterInfo = std::make_unique<IP_ADAPTER_ADDRESSES[]>(neededSize); std::unique_ptr<IP_ADAPTER_ADDRESSES[]> adapterInfo = std::make_unique<IP_ADAPTER_ADDRESSES[]>(neededSize);
@ -168,16 +168,18 @@ bool AdapterUtils::GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::uniqu
return false; return false;
} }
#elif defined(__POSIX__) #elif defined(__POSIX__)
bool AdapterUtils::GetIfAdapter(const std::string& name, ifaddrs* adapter, ifaddrs** buffer) bool AdapterUtils::GetIfAdapter(const std::string& name, ifaddrs* adapter, AdapterBuffer* buffer)
{ {
ifaddrs* adapterInfo; ifaddrs* ifa;
ifaddrs* pAdapter; ifaddrs* pAdapter;
int error = getifaddrs(&adapterInfo); int error = getifaddrs(&ifa);
if (error) if (error)
return false; return false;
pAdapter = adapterInfo; std::unique_ptr<ifaddrs, IfAdaptersDeleter> adapterInfo(ifa, IfAdaptersDeleter());
pAdapter = adapterInfo.get();
do do
{ {
@ -190,23 +192,24 @@ bool AdapterUtils::GetIfAdapter(const std::string& name, ifaddrs* adapter, ifadd
if (pAdapter != nullptr) if (pAdapter != nullptr)
{ {
*adapter = *pAdapter; *adapter = *pAdapter;
*buffer = adapterInfo; buffer->swap(adapterInfo);
return true; return true;
} }
freeifaddrs(adapterInfo);
return false; return false;
} }
bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer) bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, AdapterBuffer* buffer)
{ {
ifaddrs* adapterInfo; ifaddrs* ifa;
ifaddrs* pAdapter; ifaddrs* pAdapter;
int error = getifaddrs(&adapterInfo); int error = getifaddrs(&ifa);
if (error) if (error)
return false; return false;
pAdapter = adapterInfo; std::unique_ptr<ifaddrs, IfAdaptersDeleter> adapterInfo(ifa, IfAdaptersDeleter());
pAdapter = adapterInfo.get();
do do
{ {
@ -229,7 +232,7 @@ bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer)
if (hasIPv4 && hasGateway) if (hasIPv4 && hasGateway)
{ {
*adapter = *pAdapter; *adapter = *pAdapter;
*buffer = adapterInfo; buffer->swap(adapterInfo);
return true; return true;
} }
} }
@ -237,7 +240,6 @@ bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer)
pAdapter = pAdapter->ifa_next; pAdapter = pAdapter->ifa_next;
} while (pAdapter); } while (pAdapter);
freeifaddrs(adapterInfo);
return false; return false;
} }
#endif #endif

View File

@ -31,7 +31,8 @@
namespace AdapterUtils namespace AdapterUtils
{ {
#ifdef _WIN32 #ifdef _WIN32
bool GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr<IP_ADAPTER_ADDRESSES[]>* buffer); typedef std::unique_ptr<IP_ADAPTER_ADDRESSES[]> AdapterBuffer;
bool GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, AdapterBuffer* buffer);
bool GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr<IP_ADAPTER_ADDRESSES[]>* buffer); bool GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr<IP_ADAPTER_ADDRESSES[]>* buffer);
std::optional<PacketReader::IP::IP_Address> GetAdapterIP(PIP_ADAPTER_ADDRESSES adapter); std::optional<PacketReader::IP::IP_Address> GetAdapterIP(PIP_ADAPTER_ADDRESSES adapter);
@ -39,8 +40,13 @@ namespace AdapterUtils
std::vector<PacketReader::IP::IP_Address> GetGateways(PIP_ADAPTER_ADDRESSES adapter); std::vector<PacketReader::IP::IP_Address> GetGateways(PIP_ADAPTER_ADDRESSES adapter);
std::vector<PacketReader::IP::IP_Address> GetDNS(PIP_ADAPTER_ADDRESSES adapter); std::vector<PacketReader::IP::IP_Address> GetDNS(PIP_ADAPTER_ADDRESSES adapter);
#elif defined(__POSIX__) #elif defined(__POSIX__)
bool GetIfAdapter(const std::string& name, ifaddrs* adapter, ifaddrs** buffer); struct IfAdaptersDeleter
bool GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer); {
void operator()(ifaddrs* buffer) const { freeifaddrs(buffer); }
};
typedef std::unique_ptr<ifaddrs, IfAdaptersDeleter> AdapterBuffer;
bool GetIfAdapter(const std::string& name, ifaddrs* adapter, AdapterBuffer* buffer);
bool GetIfAdapterAuto(ifaddrs* adapter, AdapterBuffer* buffer);
std::optional<PacketReader::IP::IP_Address> GetAdapterIP(ifaddrs* adapter); std::optional<PacketReader::IP::IP_Address> GetAdapterIP(ifaddrs* adapter);
// Mask. // Mask.

View File

@ -311,7 +311,7 @@ PCAPAdapter::PCAPAdapter()
#ifdef _WIN32 #ifdef _WIN32
IP_ADAPTER_ADDRESSES adapter; IP_ADAPTER_ADDRESSES adapter;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> buffer; AdapterUtils::AdapterBuffer buffer;
if (AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) if (AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer))
InitInternalServer(&adapter); InitInternalServer(&adapter);
else else
@ -319,14 +319,12 @@ PCAPAdapter::PCAPAdapter()
Console.Error("DEV9: Failed to get adapter information"); Console.Error("DEV9: Failed to get adapter information");
InitInternalServer(nullptr); InitInternalServer(nullptr);
} }
#elif defined(__POSIX__) #elif defined(__POSIX__)
ifaddrs adapter; ifaddrs adapter;
ifaddrs* buffer; AdapterUtils::AdapterBuffer buffer;
if (AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) if (AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer))
{
InitInternalServer(&adapter); InitInternalServer(&adapter);
freeifaddrs(buffer);
}
else else
{ {
Console.Error("DEV9: Failed to get adapter information"); Console.Error("DEV9: Failed to get adapter information");
@ -383,19 +381,16 @@ void PCAPAdapter::reloadSettings()
{ {
#ifdef _WIN32 #ifdef _WIN32
IP_ADAPTER_ADDRESSES adapter; IP_ADAPTER_ADDRESSES adapter;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> buffer; AdapterUtils::AdapterBuffer buffer;
if (AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) if (AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer))
ReloadInternalServer(&adapter); ReloadInternalServer(&adapter);
else else
ReloadInternalServer(nullptr); ReloadInternalServer(nullptr);
#elif defined(__POSIX__) #elif defined(__POSIX__)
ifaddrs adapter; ifaddrs adapter;
ifaddrs* buffer; AdapterUtils::AdapterBuffer buffer;
if (AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) if (AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer))
{
ReloadInternalServer(&adapter); ReloadInternalServer(&adapter);
freeifaddrs(buffer);
}
else else
ReloadInternalServer(nullptr); ReloadInternalServer(nullptr);
#endif #endif

View File

@ -162,7 +162,7 @@ SocketAdapter::SocketAdapter()
#ifdef _WIN32 #ifdef _WIN32
IP_ADAPTER_ADDRESSES adapter; IP_ADAPTER_ADDRESSES adapter;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> buffer; AdapterUtils::AdapterBuffer buffer;
if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0)
{ {
@ -196,7 +196,7 @@ SocketAdapter::SocketAdapter()
} }
#elif defined(__POSIX__) #elif defined(__POSIX__)
ifaddrs adapter; ifaddrs adapter;
ifaddrs* buffer; AdapterUtils::AdapterBuffer buffer;
if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0)
{ {
@ -214,7 +214,6 @@ SocketAdapter::SocketAdapter()
else else
{ {
Console.Error("DEV9: Socket: Failed To Get Adapter IP"); Console.Error("DEV9: Socket: Failed To Get Adapter IP");
freeifaddrs(buffer);
return; return;
} }
} }
@ -239,9 +238,6 @@ SocketAdapter::SocketAdapter()
const IP_Address gateway = internalIP; const IP_Address gateway = internalIP;
InitInternalServer(&adapter, true, ps2IP, subnet, gateway); InitInternalServer(&adapter, true, ps2IP, subnet, gateway);
#ifdef __POSIX__
freeifaddrs(buffer);
#endif
u8 hostMAC[6]; u8 hostMAC[6];
u8 newMAC[6]; u8 newMAC[6];
@ -433,7 +429,7 @@ void SocketAdapter::reloadSettings()
bool foundAdapter = false; bool foundAdapter = false;
#ifdef _WIN32 #ifdef _WIN32
IP_ADAPTER_ADDRESSES adapter; IP_ADAPTER_ADDRESSES adapter;
std::unique_ptr<IP_ADAPTER_ADDRESSES[]> buffer; AdapterUtils::AdapterBuffer buffer;
if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0)
foundAdapter = AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer); foundAdapter = AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer);
@ -442,7 +438,7 @@ void SocketAdapter::reloadSettings()
#elif defined(__POSIX__) #elif defined(__POSIX__)
ifaddrs adapter; ifaddrs adapter;
ifaddrs* buffer; AdapterUtils::AdapterBuffer buffer;
if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0)
foundAdapter = AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer); foundAdapter = AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer);
@ -455,12 +451,7 @@ void SocketAdapter::reloadSettings()
const IP_Address gateway = internalIP; const IP_Address gateway = internalIP;
if (foundAdapter) if (foundAdapter)
{
ReloadInternalServer(&adapter, true, ps2IP, subnet, gateway); ReloadInternalServer(&adapter, true, ps2IP, subnet, gateway);
#ifdef __POSIX__
freeifaddrs(buffer);
#endif
}
else else
{ {
pxAssert(false); pxAssert(false);