Skip to content
This repository has been archived by the owner on Dec 24, 2024. It is now read-only.

Commit

Permalink
FIX: [droid;network] implement GetHostMacAddress
Browse files Browse the repository at this point in the history
  • Loading branch information
koying committed Dec 18, 2016
1 parent d951758 commit be672c0
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 3 deletions.
45 changes: 43 additions & 2 deletions xbmc/network/android/NetworkAndroid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
#include "utils/StringUtils.h"
#include "utils/log.h"

#include <net/if_arp.h>
#include <netinet/in.h>

CNetworkInterfaceAndroid::CNetworkInterfaceAndroid(CJNINetwork network, CJNILinkProperties lp, CJNINetworkInterface intf)
: m_network(network)
, m_lp(lp)
Expand Down Expand Up @@ -125,9 +128,47 @@ void CNetworkInterfaceAndroid::GetMacAddressRaw(char rawMac[6])
memcpy(rawMac, interfaceMacAddrRaw.data(), 6);
}

bool CNetworkInterfaceAndroid::GetHostMacAddress(unsigned long host, std::string& mac)
bool CNetworkInterfaceAndroid::GetHostMacAddress(unsigned long host_ip, std::string& mac)
{
// TODO
struct arpreq areq;
struct sockaddr_in* sin;

memset(&areq, 0x0, sizeof(areq));

sin = (struct sockaddr_in *) &areq.arp_pa;
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = host_ip;

sin = (struct sockaddr_in *) &areq.arp_ha;
sin->sin_family = ARPHRD_ETHER;

strncpy(areq.arp_dev, m_name.c_str(), sizeof(areq.arp_dev));
areq.arp_dev[sizeof(areq.arp_dev)-1] = '\0';

int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock != -1)
{
int result = ioctl (sock, SIOCGARP, (caddr_t) &areq);
close(sock);

if (result != 0)
{
// CLog::Log(LOGERROR, "%s - GetHostMacAddress/ioctl failed with errno (%d)", __FUNCTION__, errno);
return false;
}
}
else
return false;

struct sockaddr* res = &areq.arp_ha;
mac = StringUtils::Format("%02X:%02X:%02X:%02X:%02X:%02X",
(uint8_t) res->sa_data[0], (uint8_t) res->sa_data[1], (uint8_t) res->sa_data[2],
(uint8_t) res->sa_data[3], (uint8_t) res->sa_data[4], (uint8_t) res->sa_data[5]);

for (int i=0; i<6; ++i)
if (res->sa_data[i])
return true;

return false;
}

Expand Down
2 changes: 1 addition & 1 deletion xbmc/network/android/NetworkAndroid.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class CNetworkInterfaceAndroid : public CNetworkInterface
virtual bool IsWireless() override;
virtual std::string GetMacAddress() override;
virtual void GetMacAddressRaw(char rawMac[6]) override;
virtual bool GetHostMacAddress(unsigned long host, std::string& mac) override;
virtual bool GetHostMacAddress(unsigned long host_ip, std::string& mac) override;
virtual std::string GetCurrentIPAddress() override;
virtual std::string GetCurrentNetmask() override;
virtual std::string GetCurrentDefaultGateway() override;
Expand Down

0 comments on commit be672c0

Please sign in to comment.