(E-Mail Removed) (cris) wrote:
>I want get the permanent mac address of a network card,
>programmatically, in C language, for example with a ioctl o similar.
>
>But the mac address is updateable via software with ifconfig or other
>commands. In this case I want get the real mac address set in the
>eprom of a network card by the factory, not the modified mac address.
>
>Is this possible ?
>If it is possible, have you a sample code for get this information in
>c lang ?
>
>Thanks in advance.
I don't know if you can get at the hardwired MAC address or not.
The following program demonstrates how to get the address that the
interface is actually using.
#define _BSD_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <net/if.h>
#include <arpa/inet.h>
int main(void)
{
int sfd;
unsigned char *u;
struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
memset(&ifr, 0, sizeof ifr);
if (0 > (sfd = socket(AF_INET, SOCK_STREAM, 0))) {
perror("socket()");
exit(EXIT_FAILURE);
}
strcpy(ifr.ifr_name, "eth0");
sin->sin_family = AF_INET;
if (0 == ioctl(sfd, SIOCGIFADDR, &ifr)) {
printf("%s: %s\n", ifr.ifr_name, inet_ntoa(sin->sin_addr));
}
if (0 > ioctl(sfd, SIOCGIFHWADDR, &ifr)) {
return EXIT_FAILURE;
}
u = (unsigned char *) &ifr.ifr_addr.sa_data;
if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5]) {
printf("HW Address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
u[0], u[1], u[2], u[3], u[4], u[5]);
}
return EXIT_SUCCESS;
}
--
Floyd L. Davidson <http://web.newsguy.com/floyd_davidson>
Ukpeagvik (Barrow, Alaska)
(E-Mail Removed)