Welcome, guest! Login / Register - Why register?
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, &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

Parent: 10239
Your Name: Code Language: