std::pair<bool, MACAddressType> GetPrimaryMacAddress() { kern_return_t kernResult = KERN_SUCCESS; // on PowerPC this is an int (4 bytes) /* * error number layout as follows (see mach/error.h and IOKit/IOReturn.h): * * hi lo * | system(6) | subsystem(12) | code(14) | */ io_iterator_t intfIterator; MACAddressType mac_address = {0}; kernResult = FindEthernetInterfaces(&intfIterator, "en0"); if (KERN_SUCCESS != kernResult) { //printf("FindEthernetInterfaces returned 0x%08x\n", kernResult); (void) IOObjectRelease(intfIterator); // Release the iterator. return std::pair<bool, MACAddressType>(false, mac_address); } else { kernResult = GetMACAddress(intfIterator, mac_address.array, sizeof(MACAddressType)); if (KERN_SUCCESS != kernResult) { kernResult = FindEthernetInterfaces(&intfIterator, "en1"); if (KERN_SUCCESS != kernResult) { //printf("FindEthernetInterfaces returned 0x%08x\n", kernResult); (void) IOObjectRelease(intfIterator); // Release the iterator. return std::pair<bool, MACAddressType>(false, mac_address); } else { kernResult = GetMACAddress(intfIterator, mac_address.array, sizeof(MACAddressType)); if (KERN_SUCCESS != kernResult) { //printf("GetMACAddress returned 0x%08x\n", kernResult); (void) IOObjectRelease(intfIterator); // Release the iterator. return std::pair<bool, MACAddressType>(false, mac_address); } else { (void) IOObjectRelease(intfIterator); // Release the iterator. return std::pair<bool, MACAddressType>(true, mac_address); } } } else { (void) IOObjectRelease(intfIterator); // Release the iterator. return std::pair<bool, MACAddressType>(true, mac_address); } } }
NSString *getMACAddressString() { static NSString *addressString = nil; if (!addressString) { kern_return_t kernResult = KERN_SUCCESS; // on PowerPC this is an int (4 bytes) /* * error number layout as follows (see mach/error.h and IOKit/IOReturn.h): * * hi lo * | system(6) | subsystem(12) | code(14) | */ io_iterator_t intfIterator; UInt8 MACAddress[kIOEthernetAddressSize]; kernResult = FindEthernetInterfaces(&intfIterator); if (KERN_SUCCESS != kernResult) { printf("FindEthernetInterfaces returned 0x%08x\n", kernResult); } else { kernResult = GetMACAddress(intfIterator, MACAddress, sizeof(MACAddress)); if (KERN_SUCCESS != kernResult) { printf("GetMACAddress returned 0x%08x\n", kernResult); } else { addressString = [[NSString alloc] initWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", MACAddress[0], MACAddress[1], MACAddress[2], MACAddress[3], MACAddress[4], MACAddress[5] ]; } } (void) IOObjectRelease(intfIterator); // Release the iterator. }
static psych_bool GetPrimaryEthernetAddress(UInt8 *MACAddress) { psych_bool errorReturn; kern_return_t kernResult; io_iterator_t intfIterator; errorReturn=FALSE; kernResult = FindEthernetInterfaces(&intfIterator); if(kernResult != KERN_SUCCESS) errorReturn=TRUE; else{ kernResult = GetMACAddress(intfIterator, MACAddress); if(kernResult != KERN_SUCCESS) errorReturn=TRUE; } (void) IOObjectRelease(intfIterator); // Release the iterator. return(errorReturn); }
static CFStringRef CopyPrimaryMacAddress(void) { io_iterator_t intfIterator; UInt8 MAC[kIOEthernetAddressSize]; CFStringRef macAddress = NULL; kern_return_t kernResult = FindEthernetInterfaces(&intfIterator); if (KERN_SUCCESS != kernResult) { DbgLog( kLogError, "FindEthernetInterfaces returned 0x%08x", kernResult ); } else { kernResult = GetMACAddress(intfIterator, MAC, sizeof(MAC)); if (KERN_SUCCESS != kernResult) { DbgLog( kLogError, "GetMACAddress returned 0x%08x", kernResult ); } else { macAddress = CFStringCreateWithFormat(NULL, NULL, CFSTR("[%02x:%02x:%02x:%02x:%02x:%02x]"), MAC[0], MAC[1], MAC[2], MAC[3], MAC[4], MAC[5]); } } (void)IOObjectRelease(intfIterator); return macAddress; }
bool GetMACAddress( string& mac ) { mac = ""; kern_return_t kernResult = KERN_SUCCESS; io_iterator_t intfIterator; UInt8 MACAddress[kIOEthernetAddressSize]; kernResult = FindEthernetInterfaces(&intfIterator); if (KERN_SUCCESS != kernResult) { IOObjectRelease(intfIterator); return false; } kernResult = OSXGetMACAddress(intfIterator, MACAddress, sizeof(MACAddress)); if (KERN_SUCCESS != kernResult) { IOObjectRelease(intfIterator); return false; } ostringstream out; out << hex << nouppercase << setfill('0'); out << setw(2) << (int)MACAddress[0] << ":" << setw(2) << (int)MACAddress[1] << ":" << setw(2) << (int)MACAddress[2] << ":" << setw(2) << (int)MACAddress[3] << ":" << setw(2) << (int)MACAddress[4] << ":" << setw(2) << (int)MACAddress[5]; IOObjectRelease(intfIterator); mac = out.str(); return true; }
int get_macaddr(const char *ifname, U8 *addr) { #if defined(__NBR_OSX__) kern_return_t kernResult = KERN_SUCCESS; io_iterator_t intfIterator; UInt8 MACAddress[kIOEthernetAddressSize]; kernResult = FindEthernetInterfaces(&intfIterator); if (KERN_SUCCESS != kernResult) { //OSDEP_ERROUT(ERROR,SYSCALL,"FindEthernetInterfaces returned 0x%08x\n", kernResult); return NBR_ESYSCALL; } else { kernResult = GetMACAddress(intfIterator, addr, sizeof(MACAddress)); if (KERN_SUCCESS != kernResult) { //OSDEP_ERROUT(ERROR,SYSCALL,"GetMACAddress returned 0x%08x\n", kernResult); } else { TRACE("This system's built-in MAC address is %02x:%02x:%02x:%02x:%02x:%02x.\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); } } (void) IOObjectRelease(intfIterator); // Release the iterator. return kernResult == KERN_SUCCESS ? NBR_OK : NBR_ESYSCALL; #elif defined(__NBR_IOS__) int mib[6]; size_t len; char *buf; unsigned char *ptr; struct if_msghdr *ifm; struct sockaddr_dl *sdl; mib[0] = CTL_NET; mib[1] = AF_ROUTE; mib[2] = 0; mib[3] = AF_LINK; mib[4] = NET_RT_IFLIST; if ((mib[5] = if_nametoindex(ifname)) == 0) { TRACE("Error: if_nametoindex error\n"); return NBR_ESYSCALL; } if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { TRACE("Error: sysctl, take 1\n"); return NBR_ESYSCALL; } if ((buf = (char *)util::mem::alloc(len)) == NULL) { TRACE("Could not allocate memory. error!\n"); return NBR_EMALLOC; } if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { TRACE("Error: sysctl, take 2"); util::mem::free(buf); return NBR_ESYSCALL; } ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm + 1); ptr = (unsigned char *)LLADDR(sdl); util::mem::copy(addr, ptr, 6); util::mem::free(buf); TRACE("MAC ADDRESS (%s): [%02X:%02X:%02X:%02X:%02X:%02X]\n", ifname, *addr, *(addr+1), *(addr+2), *(addr+3), *(addr+4), *(addr+5)); return NBR_OK; #else int soc, ret; struct ifreq req; if ((soc = socket(AF_INET, SOCK_STREAM, 0)) < 0) { TRACE("socket fail: ret=%d,errno=%d",soc,errno); ret = soc; goto error; } util::str::copy(req.ifr_name, ifname, sizeof(req.ifr_name)); req.ifr_addr.sa_family = AF_INET; if ((ret = ioctl(soc, SIOCGIFHWADDR, &req)) < 0) { TRACE("ioctl fail: soc=%d,ret=%d,errno=%d",soc,ret,errno); goto error; } util::mem::copy(addr, &(req.ifr_addr.sa_data), 6); ret = 0; TRACE("MAC ADDRESS (%s): [%02X:%02X:%02X:%02X:%02X:%02X]\n", ifname, *addr, *(addr+1), *(addr+2), *(addr+3), *(addr+4), *(addr+5)); error: if (soc >= 0) { close(soc); } return ret; #endif }