Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so dont bother with any of their useless mail servers here and just use oauth login instead. Thank the nice Russians for causing that. :)
Paste
Pasted as C++ by Alatar ( 17 years ago )
class MACAddressUtility
{
public:
static long GetMACAddress(unsigned char * result);
private:
#if defined(WIN32) || defined(UNDER_CE)
static long GetMACAddressMSW(unsigned char * result);
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) || defined(linux) || defined(__APPLE__)
static long GetMACAddressPosix(unsigned char * result);
#endif
};
#include <stdio.h>
#if defined(WIN32) || defined(UNDER_CE)
# include <windows.h>
# if defined(UNDER_CE)
# include <Iphlpapi.h>
# else
# pragma comment(lib, "Netapi32.lib")
# endif
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) || defined(linux) || defined(__APPLE__)
# include <string.h>
# include <stdint.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <ifaddrs.h>
# include <net/if.h>
# ifdef __linux__
# include <sys/ioctl.h>
# include <netinet/in.h>
# include <unistd.h>
// Match Linux to FreeBSD
# define AF_LINK AF_PACKET
# else
# include <net/if_dl.h>
# endif
#endif
long MACAddressUtility::GetMACAddress(unsigned char * result)
{
// Fill result with zeroes
memset(result, 0, 6);
// Call appropriate function for each platform
#if defined(WIN32) || defined(UNDER_CE)
return GetMACAddressMSW(result);
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) || defined(linux) || defined(__APPLE__)
return GetMACAddressPosix(result);
#endif
// If platform is not supported then return error code
return -1;
}
#if defined(WIN32) || defined(UNDER_CE)
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
inline long MACAddressUtility::GetMACAddressMSW(unsigned char * result)
{
#if defined(UNDER_CE)
IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
if(GetAdaptersInfo(AdapterInfo, &dwBufLen;) == ERROR_SUCCESS)
{
memcpy(result, AdapterInfo->Address, 6);
}
else return -1;
#else
NCB Ncb;
UCHAR uRetCode;
UCHAR nulladdr[6] = {0};
char NetName[50];
LANA_ENUM lenum;
int i;
memset( &Ncb;, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
Netbios( &Ncb; );
for(i=0; i < lenum.length ;i++)
{
memset( &Ncb;, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i];
Netbios( &Ncb; );
memset( &Ncb;, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i];
strcpy( (char *)Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (unsigned char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb; );
if(( uRetCode == 0 ) && (memcmp(Adapter.adapt.adapter_address, nulladdr, 6) != 0))
{
memcpy(result, Adapter.adapt.adapter_address, 6);
break;
}
}
#endif
return 0;
}
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) || defined(linux) || defined(__APPLE__)
long MACAddressUtility::GetMACAddressPosix(unsigned char * result)
{
ifaddrs *ifap = NULL, *cur = NULL;
uint8_t *haddr = NULL;
uint8_t nulladdr[6] = {0};
if ((getifaddrs(&ifap;) != 0) || (ifap == NULL))
return -1;
for (cur = ifap; cur != NULL; cur = cur->ifa_next)
{
if ((cur->ifa_addr != NULL) && (cur->ifa_addr->sa_family == AF_LINK))
{
#ifdef __linux__
// Linux
struct ifreq ifr;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
strcpy(ifr.ifr_name, cur->ifa_name);
ioctl(fd, SIOCGIFHWADDR, 𝔦);
close(fd);
haddr = reinterpret_cast<uint8_t*>(ifr.ifr_hwaddr.sa_data);
#else
// Posix/FreeBSD/Mac OS
sockaddr_dl* sdl = (struct sockaddr_dl *)cur->ifa_addr;
haddr = reinterpret_cast<uint8_t*>(LLADDR(sdl));
#endif
if((cur->ifa_flags & IFF_UP) && (bcmp(haddr, nulladdr, 6) != 0))
break;
}
}
bcopy(haddr , result, 6);
freeifaddrs(ifap);
return 0;
}
#endif
int main()
{
unsigned char result[6];
if(MACAddressUtility::GetMACAddress(result) != 0)
printf("Can`t get phy addr\n");
printf("MAC addr is X:X:X:X:X:X\n",
(unsigned int)result[0], (unsigned int)result[1], (unsigned int)result[2],
(unsigned int)result[3], (unsigned int)result[4], (unsigned int)result[5]);
return 0;
}
Revise this Paste
Children: 10240