Sometimes people are asking how to find out the MAC- (ethernet-, hardware-, ...) address from inside a C program.
Here is method using system specific calls which works under Linux, HP-UX 10.20, and AIX 4.2.
/* * mac_addr_sys.c * * Return the MAC (ie, ethernet hardware) address by using system specific * calls. * * compile with: gcc -c -D "OS" mac_addr_sys.c * with "OS" is one of Linux, AIX, HPUX */ #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #ifdef Linux #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <linux/if.h> #endif #ifdef HPUX #include <netio.h> #endif #ifdef AIX #include <sys/ndd_var.h> #include <sys/kinfo.h> #endif long mac_addr_sys ( u_char *addr) { /* implementation for Linux */ #ifdef Linux /* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * */ struct ifreq ifr; struct ifreq *IFR; struct ifconf ifc; char buf[1024]; int s, i; int ok = 0; s = socket(AF_INET, SOCK_DGRAM, 0); if (s==-1) { return -1; } ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; ioctl(s, SIOCGIFCONF, &ifc); IFR = ifc.ifc_req; for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) { strcpy(ifr.ifr_name, IFR->ifr_name); if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { if (! (ifr.ifr_flags & IFF_LOOPBACK)) { if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) { ok = 1; break; } } } } close(s); if (ok) { bcopy( ifr.ifr_hwaddr.sa_data, addr, 6); } else { return -1; } return 0; #endif /* implementation for HP-UX */ #ifdef HPUX /* * * (c) Copyright 1991 OPEN SOFTWARE FOUNDATION, INC. * (c) Copyright 1991 HEWLETT-PACKARD COMPANY * (c) Copyright 1991 DIGITAL EQUIPMENT CORPORATION * To anyone who acknowledges that this file is provided "AS IS" * without any express or implied warranty: * permission to use, copy, modify, and distribute this * file for any purpose is hereby granted without fee, provided that * the above copyright notices and this notice appears in all source * code copies, and that none of the names of Open Software * Foundation, Inc., Hewlett-Packard Company, or Digital Equipment * Corporation be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. Neither Open Software Foundation, Inc., Hewlett- * Packard Company, nor Digital Equipment Corporation makes any * representations about the suitability of this software for any * purpose. * */ #define LAN_DEV0 "/dev/lan0" int fd; struct fis iocnt_block; int i; char net_buf[sizeof(LAN_DEV0)+1]; char *p; (void)sprintf(net_buf, "%s", LAN_DEV0); p = net_buf + strlen(net_buf) - 1; /* * Get 802.3 address from card by opening the driver and interrogating it. */ for (i = 0; i < 10; i++, (*p)++) { if ((fd = open (net_buf, O_RDONLY)) != -1) { iocnt_block.reqtype = LOCAL_ADDRESS; ioctl (fd, NETSTAT, &iocnt_block); close (fd); if (iocnt_block.vtype == 6) break; } } if (fd == -1 || iocnt_block.vtype != 6) { return -1; } bcopy( &iocnt_block.value.s[0], addr, 6); return 0; #endif /* HPUX */ /* implementation for AIX */ #ifdef AIX /* * This code is from the AIX programmers guide: * http://publib.boulder.ibm.com/infocenter/ * aix/v7r1/topic/com.ibm.aix.progcomm/doc/progcomc/skt_examps.htm * Copyright IBM Corporation 1989, 2013 * */ int size; struct kinfo_ndd *nddp; size = getkerninfo(KINFO_NDD, 0, 0, 0); if (size <= 0) { return -1; } nddp = (struct kinfo_ndd *)malloc(size); if (!nddp) { return -1; } if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) { free(nddp); return -1; } bcopy(nddp->ndd_addr, addr, 6); free(nddp); return 0; #endif /* Not implemented platforms */ return -1; } /***********************************************************************/ /* * Main (only for testing) */ #ifdef MAIN int main( int argc, char **argv) { long stat; int i; u_char addr[6]; stat = mac_addr_sys( addr); if (0 == stat) { printf( "MAC address = "); for (i=0; i<6; ++i) { printf("%2.2x", addr[i]); } printf( "\n"); } else { fprintf( stderr, "can't get MAC address\n"); exit( 1); } return 0; } #endif