Encontrar o endereço MAC original do próprio hardware

Os: REDHAT LINUX Linux gerencia: 2.6.18.8-1 #

É possível ler diretamente o formulário de endereço MAC NIC? Eu tenho abaixo o código, mas acabou de ler a partir da camada acima, mas não o cartão em si !!!

Eu estou tentando descobrir como encontrar o endereço MAC original de uma placa de rede ethernet na minha caixa linux. Eu entendo como encontrar o endereço MAC atual usando ifconfig, mas se o endereço foi alterado, digamos usando'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz', ou eu definir "permanente" usandovi /etc/sysconfig/network-scripts/ifcfg-eth0.este arquivo ... posso com sucessoUP emREBOOT Além disso. Como encontro o original? Deve haver uma maneira de encontrá-lo, porque ele ainda é gravado permanentemente no cartão, mas não consigo encontrar uma ferramenta para ler o endereço gravado. Existe alguma utilidade ou ordem para isso? Eu suponho escrever código C para isso. mas não sei como fazer isso no caso acima.

** abaixo código dá meuatual MAC, mas não MAC original

#include <stdio.h>              /* Standard I/O */
#include <stdlib.h>             /* Standard Library */
#include <errno.h>              /* Error number and related */


#define ENUMS
#include <sys/socket.h>
#include <net/route.h>
#include <net/if.h>
#include <features.h>           /* for the glibc version number */
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>       /* the L2 protocols */
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>     /* The L2 protocols */
#endif
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <netdb.h>


int main( int argc, char * argv[] ){

unsigned char  mac[IFHWADDRLEN];
int i;
    get_local_hwaddr( argv[1], mac );
    for( i = 0; i < IFHWADDRLEN; i++ ){
        printf( "%02X:", (unsigned int)(mac[i]) );
    }

}


int get_local_hwaddr(const char *ifname, unsigned char *mac)
{
    struct ifreq ifr;
    int fd;
    int rv;                     // return value - error value from df or ioctl call

    /* determine the local MAC address */
    strcpy(ifr.ifr_name, ifname);
    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (fd < 0)
        rv = fd;
    else {
        rv = ioctl(fd, SIOCGIFHWADDR, &ifr);
        if (rv >= 0)            /* worked okay */
            memcpy(mac, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
    }

    return rv;
}

questionAnswers(6)

yourAnswerToTheQuestion