Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
[email protected] webmail now available. Want one? Go here.
Cannot use outlook/hotmail/live here to register as they blocking our mail servers. #microsoftdeez
Obey the Epel!

Paste

Pasted as C++ by Alatar ( 15 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, &ifr;);
            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
Your Name: Code Language: